2011-01-09 21:58:47 +00:00
module ( "core" , { teardown : moduleTeardown } ) ;
2008-12-19 05:43:37 +00:00
2012-02-14 23:19:32 +00:00
test ( "Unit Testing Environment" , function ( ) {
expect ( 2 ) ;
2012-10-09 23:48:37 +00:00
ok ( hasPHP , "Running in an environment with PHP support. The AJAX tests only run if the environment supports PHP!" ) ;
ok ( ! isLocal , "Unit tests are not ran from file:// (especially in Chrome. If you must test from file:// with Chrome, run it with the --allow-file-access-from-files flag!)" ) ;
2012-02-14 23:19:32 +00:00
} ) ;
2008-12-19 05:43:37 +00:00
test ( "Basic requirements" , function ( ) {
expect ( 7 ) ;
ok ( Array . prototype . push , "Array.push()" ) ;
ok ( Function . prototype . apply , "Function.apply()" ) ;
ok ( document . getElementById , "getElementById" ) ;
ok ( document . getElementsByTagName , "getElementsByTagName" ) ;
ok ( RegExp , "RegExp" ) ;
ok ( jQuery , "jQuery" ) ;
ok ( $ , "$" ) ;
} ) ;
test ( "jQuery()" , function ( ) {
2012-06-07 15:24:35 +00:00
var elem , i ,
obj = jQuery ( "div" ) ,
code = jQuery ( "<code/>" ) ,
img = jQuery ( "<img/>" ) ,
div = jQuery ( "<div/><hr/><code/><b/>" ) ,
exec = false ,
2012-07-05 19:52:13 +00:00
lng = "" ,
2013-05-09 01:07:41 +00:00
expected = 22 ,
2012-06-07 15:24:35 +00:00
attrObj = {
2012-07-05 19:52:13 +00:00
"text" : "test" ,
2012-06-07 15:24:35 +00:00
"class" : "test2" ,
2012-07-05 19:52:13 +00:00
"id" : "test3"
2012-06-07 15:24:35 +00:00
} ;
2009-07-16 07:31:47 +00:00
2012-07-05 21:21:58 +00:00
// The $(html, props) signature can stealth-call any $.fn method, check for a
// few here but beware of modular builds where these methods may be excluded.
2013-01-27 04:48:59 +00:00
if ( jQuery . fn . click ) {
expected ++ ;
attrObj [ "click" ] = function ( ) { ok ( exec , "Click executed." ) ; } ;
}
2012-06-07 15:24:35 +00:00
if ( jQuery . fn . width ) {
expected ++ ;
2012-07-05 19:52:13 +00:00
attrObj [ "width" ] = 10 ;
2012-06-07 15:24:35 +00:00
}
if ( jQuery . fn . offset ) {
expected ++ ;
2012-07-05 19:52:13 +00:00
attrObj [ "offset" ] = { "top" : 1 , "left" : 1 } ;
2012-06-07 15:24:35 +00:00
}
2012-07-05 21:21:58 +00:00
if ( jQuery . fn . css ) {
2012-06-11 01:54:16 +00:00
expected += 2 ;
2012-07-05 19:52:13 +00:00
attrObj [ "css" ] = { "paddingLeft" : 1 , "paddingRight" : 1 } ;
2012-06-11 01:54:16 +00:00
}
2012-07-05 21:21:58 +00:00
if ( jQuery . fn . attr ) {
expected ++ ;
attrObj . attr = { "desired" : "very" } ;
}
2012-06-11 01:54:16 +00:00
2012-06-07 15:24:35 +00:00
expect ( expected ) ;
// Basic constructor's behavior
2011-11-06 20:27:42 +00:00
equal ( jQuery ( ) . length , 0 , "jQuery() === jQuery([])" ) ;
equal ( jQuery ( undefined ) . length , 0 , "jQuery(undefined) === jQuery([])" ) ;
equal ( jQuery ( null ) . length , 0 , "jQuery(null) === jQuery([])" ) ;
equal ( jQuery ( "" ) . length , 0 , "jQuery('') === jQuery([])" ) ;
equal ( jQuery ( "#" ) . length , 0 , "jQuery('#') === jQuery([])" ) ;
2009-07-16 07:31:47 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( obj ) . selector , "div" , "jQuery(jQueryObj) == jQueryObj" ) ;
2009-07-17 17:33:44 +00:00
2012-06-07 15:24:35 +00:00
// can actually yield more than one, when iframes are included, the window is an array as well
2011-11-06 20:27:42 +00:00
equal ( jQuery ( window ) . length , 1 , "Correct number of elements generated for jQuery(window)" ) ;
2009-07-16 07:31:47 +00:00
2008-12-19 05:43:37 +00:00
/ *
// disabled since this test was doing nothing. i tried to fix it but i'm not sure
// what the expected behavior should even be. FF returns "\n" for the text node
// make sure this is handled
var crlfContainer = jQuery ( '<p>\r\n</p>' ) ;
var x = crlfContainer . contents ( ) . get ( 0 ) . nodeValue ;
2011-11-06 20:27:42 +00:00
equal ( x , what ? ? ? , "Check for \\r and \\n in jQuery()" ) ;
2008-12-19 05:43:37 +00:00
* /
/* / / Disabled until we add this functionality in
var pass = true ;
try {
jQuery ( "<div>Testing</div>" ) . appendTo ( document . getElementById ( "iframe" ) . contentDocument . body ) ;
} catch ( e ) {
pass = false ;
}
ok ( pass , "jQuery('<tag>') needs optional document parameter to ease cross-frame DOM wrangling, see #968" ) ; * /
2011-11-06 20:27:42 +00:00
equal ( code . length , 1 , "Correct number of elements generated for code" ) ;
equal ( code . parent ( ) . length , 0 , "Make sure that the generated HTML has no parent." ) ;
2012-06-07 15:24:35 +00:00
2011-11-06 20:27:42 +00:00
equal ( img . length , 1 , "Correct number of elements generated for img" ) ;
equal ( img . parent ( ) . length , 0 , "Make sure that the generated HTML has no parent." ) ;
2012-06-07 15:24:35 +00:00
2011-11-06 20:27:42 +00:00
equal ( div . length , 4 , "Correct number of elements generated for div hr code b" ) ;
equal ( div . parent ( ) . length , 0 , "Make sure that the generated HTML has no parent." ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( [ 1 , 2 , 3 ] ) . get ( 1 ) , 2 , "Test passing an array to the factory" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( document . body ) . get ( 0 ) , jQuery ( "body" ) . get ( 0 ) , "Test passing an html node to the factory" ) ;
2009-12-18 17:41:53 +00:00
2013-05-09 01:07:41 +00:00
elem = jQuery ( " <em>hello</em>" ) [ 0 ] ;
equal ( elem . nodeName . toLowerCase ( ) , "em" , "leading space" ) ;
elem = jQuery ( "\n\n<em>world</em>" ) [ 0 ] ;
equal ( elem . nodeName . toLowerCase ( ) , "em" , "leading newlines" ) ;
2012-06-07 15:24:35 +00:00
elem = jQuery ( "<div/>" , attrObj ) ;
2012-06-05 20:38:18 +00:00
if ( jQuery . fn . width ) {
equal ( elem [ 0 ] . style . width , "10px" , "jQuery() quick setter width" ) ;
2012-06-07 15:24:35 +00:00
}
2012-06-05 20:38:18 +00:00
2012-06-07 15:24:35 +00:00
if ( jQuery . fn . offset ) {
equal ( elem [ 0 ] . style . top , "1px" , "jQuery() quick setter offset" ) ;
2012-06-05 20:38:18 +00:00
}
2012-07-05 21:21:58 +00:00
if ( jQuery . fn . css ) {
2012-06-11 01:54:16 +00:00
equal ( elem [ 0 ] . style . paddingLeft , "1px" , "jQuery quick setter css" ) ;
equal ( elem [ 0 ] . style . paddingRight , "1px" , "jQuery quick setter css" ) ;
}
2012-07-05 21:21:58 +00:00
if ( jQuery . fn . attr ) {
equal ( elem [ 0 ] . getAttribute ( "desired" ) , "very" , "jQuery quick setter attr" ) ;
}
2011-11-06 20:27:42 +00:00
equal ( elem [ 0 ] . childNodes . length , 1 , "jQuery quick setter text" ) ;
equal ( elem [ 0 ] . firstChild . nodeValue , "test" , "jQuery quick setter text" ) ;
equal ( elem [ 0 ] . className , "test2" , "jQuery() quick setter class" ) ;
equal ( elem [ 0 ] . id , "test3" , "jQuery() quick setter id" ) ;
2010-01-13 02:54:06 +00:00
exec = true ;
2013-01-27 04:48:59 +00:00
elem . trigger ( "click" ) ;
2011-01-10 00:38:44 +00:00
2011-01-09 21:58:47 +00:00
// manually clean up detached elements
elem . remove ( ) ;
2011-01-17 21:31:43 +00:00
2012-06-07 15:24:35 +00:00
for ( i = 0 ; i < 3 ; ++ i ) {
2011-01-10 00:38:44 +00:00
elem = jQuery ( "<input type='text' value='TEST' />" ) ;
}
2011-11-06 20:27:42 +00:00
equal ( elem [ 0 ] . defaultValue , "TEST" , "Ensure cached nodes are cloned properly (Bug #6655)" ) ;
2011-01-17 21:31:43 +00:00
// manually clean up detached elements
elem . remove ( ) ;
2011-05-02 17:14:13 +00:00
2012-06-07 15:24:35 +00:00
for ( i = 0 ; i < 128 ; i ++ ) {
2012-07-05 19:52:13 +00:00
lng += "12345678" ;
2011-05-02 17:14:13 +00:00
}
2008-12-19 04:37:10 +00:00
} ) ;
2013-02-19 04:52:29 +00:00
test ( "jQuery(selector, context)" , function ( ) {
expect ( 3 ) ;
deepEqual ( jQuery ( "div p" , "#qunit-fixture" ) . get ( ) , q ( "sndp" , "en" , "sap" ) , "Basic selector with string as context" ) ;
deepEqual ( jQuery ( "div p" , q ( "qunit-fixture" ) [ 0 ] ) . get ( ) , q ( "sndp" , "en" , "sap" ) , "Basic selector with element as context" ) ;
deepEqual ( jQuery ( "div p" , jQuery ( "#qunit-fixture" ) ) . get ( ) , q ( "sndp" , "en" , "sap" ) , "Basic selector with jQuery object as context" ) ;
} ) ;
2012-10-19 21:08:50 +00:00
test ( "selector state" , function ( ) {
expect ( 18 ) ;
2008-12-19 04:37:10 +00:00
var test ;
2009-05-02 19:22:55 +00:00
2012-10-19 21:08:50 +00:00
test = jQuery ( undefined ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "" , "Empty jQuery Selector" ) ;
equal ( test . context , undefined , "Empty jQuery Context" ) ;
2009-05-02 19:22:55 +00:00
2012-10-19 21:08:50 +00:00
test = jQuery ( document ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "" , "Document Selector" ) ;
equal ( test . context , document , "Document Context" ) ;
2009-05-02 19:22:55 +00:00
2012-10-19 21:08:50 +00:00
test = jQuery ( document . body ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "" , "Body Selector" ) ;
equal ( test . context , document . body , "Body Context" ) ;
2009-05-02 19:22:55 +00:00
2011-04-17 06:43:57 +00:00
test = jQuery ( "#qunit-fixture" ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "#qunit-fixture" , "#qunit-fixture Selector" ) ;
equal ( test . context , document , "#qunit-fixture Context" ) ;
2009-01-20 16:00:48 +00:00
test = jQuery ( "#notfoundnono" ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "#notfoundnono" , "#notfoundnono Selector" ) ;
equal ( test . context , document , "#notfoundnono Context" ) ;
2009-05-02 19:22:55 +00:00
2012-10-19 21:08:50 +00:00
test = jQuery ( "#qunit-fixture" , document ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "#qunit-fixture" , "#qunit-fixture Selector" ) ;
equal ( test . context , document , "#qunit-fixture Context" ) ;
2009-05-02 19:22:55 +00:00
2012-10-19 21:08:50 +00:00
test = jQuery ( "#qunit-fixture" , document . body ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "#qunit-fixture" , "#qunit-fixture Selector" ) ;
equal ( test . context , document . body , "#qunit-fixture Context" ) ;
2009-01-08 21:41:58 +00:00
// Test cloning
2012-10-19 21:08:50 +00:00
test = jQuery ( test ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "#qunit-fixture" , "#qunit-fixture Selector" ) ;
equal ( test . context , document . body , "#qunit-fixture Context" ) ;
2009-05-02 19:22:55 +00:00
2012-10-19 21:08:50 +00:00
test = jQuery ( document . body ) . find ( "#qunit-fixture" ) ;
2011-11-06 20:27:42 +00:00
equal ( test . selector , "#qunit-fixture" , "#qunit-fixture find Selector" ) ;
equal ( test . context , document . body , "#qunit-fixture find Context" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2011-04-07 04:47:15 +00:00
test ( "globalEval" , function ( ) {
expect ( 3 ) ;
2012-12-03 04:32:16 +00:00
Globals . register ( "globalEvalTest" ) ;
2011-04-07 04:47:15 +00:00
2012-11-03 04:06:50 +00:00
jQuery . globalEval ( "globalEvalTest = 1;" ) ;
equal ( window . globalEvalTest , 1 , "Test variable assignments are global" ) ;
2011-04-07 04:47:15 +00:00
2012-11-03 04:06:50 +00:00
jQuery . globalEval ( "var globalEvalTest = 2;" ) ;
equal ( window . globalEvalTest , 2 , "Test variable declarations are global" ) ;
2011-04-07 04:47:15 +00:00
2012-11-03 04:06:50 +00:00
jQuery . globalEval ( "this.globalEvalTest = 3;" ) ;
equal ( window . globalEvalTest , 3 , "Test context (this) is the window object" ) ;
2011-04-07 04:47:15 +00:00
} ) ;
2013-04-03 15:26:07 +00:00
test ( "globalEval with 'use strict'" , function ( ) {
expect ( 1 ) ;
Globals . register ( "strictEvalTest" ) ;
jQuery . globalEval ( "'use strict'; var strictEvalTest = 1;" ) ;
equal ( window . strictEvalTest , 1 , "Test variable declarations are global (strict mode)" ) ;
} ) ;
2008-12-19 05:43:37 +00:00
test ( "noConflict" , function ( ) {
2010-09-08 17:54:33 +00:00
expect ( 7 ) ;
2008-12-19 05:43:37 +00:00
var $$ = jQuery ;
2012-11-01 21:32:08 +00:00
strictEqual ( jQuery , jQuery . noConflict ( ) , "noConflict returned the jQuery object" ) ;
strictEqual ( window [ "jQuery" ] , $$ , "Make sure jQuery wasn't touched." ) ;
strictEqual ( window [ "$" ] , original$ , "Make sure $ was reverted." ) ;
2008-12-19 05:43:37 +00:00
jQuery = $ = $$ ;
2012-11-01 21:32:08 +00:00
strictEqual ( jQuery . noConflict ( true ) , $$ , "noConflict returned the jQuery object" ) ;
strictEqual ( window [ "jQuery" ] , originaljQuery , "Make sure jQuery was reverted." ) ;
strictEqual ( window [ "$" ] , original$ , "Make sure $ was reverted." ) ;
ok ( $$ ( ) . pushStack ( [ ] ) , "Make sure that jQuery still works." ) ;
2008-12-19 05:43:37 +00:00
2012-07-05 19:52:13 +00:00
window [ "jQuery" ] = jQuery = $$ ;
2008-12-19 05:43:37 +00:00
} ) ;
2009-11-30 18:21:56 +00:00
test ( "trim" , function ( ) {
2012-08-21 12:59:51 +00:00
expect ( 13 ) ;
2009-11-30 18:21:56 +00:00
2010-03-09 14:14:27 +00:00
var nbsp = String . fromCharCode ( 160 ) ;
2009-11-30 18:21:56 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . trim ( "hello " ) , "hello" , "trailing space" ) ;
equal ( jQuery . trim ( " hello" ) , "hello" , "leading space" ) ;
equal ( jQuery . trim ( " hello " ) , "hello" , "space on both sides" ) ;
equal ( jQuery . trim ( " " + nbsp + "hello " + nbsp + " " ) , "hello" , " " ) ;
2010-03-09 14:14:27 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . trim ( ) , "" , "Nothing in." ) ;
equal ( jQuery . trim ( undefined ) , "" , "Undefined" ) ;
equal ( jQuery . trim ( null ) , "" , "Null" ) ;
equal ( jQuery . trim ( 5 ) , "5" , "Number" ) ;
equal ( jQuery . trim ( false ) , "false" , "Boolean" ) ;
2012-08-21 12:59:51 +00:00
equal ( jQuery . trim ( " " ) , "" , "space should be trimmed" ) ;
equal ( jQuery . trim ( "ipad\xA0" ) , "ipad" , "nbsp should be trimmed" ) ;
equal ( jQuery . trim ( "\uFEFF" ) , "" , "zwsp should be trimmed" ) ;
equal ( jQuery . trim ( "\uFEFF \xA0! | \uFEFF" ) , "! |" , "leading/trailing should be trimmed" ) ;
2009-11-30 18:21:56 +00:00
} ) ;
2010-08-27 13:10:52 +00:00
test ( "type" , function ( ) {
2012-12-18 15:33:32 +00:00
expect ( 28 ) ;
2010-08-27 13:10:52 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . type ( null ) , "null" , "null" ) ;
equal ( jQuery . type ( undefined ) , "undefined" , "undefined" ) ;
equal ( jQuery . type ( true ) , "boolean" , "Boolean" ) ;
equal ( jQuery . type ( false ) , "boolean" , "Boolean" ) ;
equal ( jQuery . type ( Boolean ( true ) ) , "boolean" , "Boolean" ) ;
equal ( jQuery . type ( 0 ) , "number" , "Number" ) ;
equal ( jQuery . type ( 1 ) , "number" , "Number" ) ;
equal ( jQuery . type ( Number ( 1 ) ) , "number" , "Number" ) ;
equal ( jQuery . type ( "" ) , "string" , "String" ) ;
equal ( jQuery . type ( "a" ) , "string" , "String" ) ;
equal ( jQuery . type ( String ( "a" ) ) , "string" , "String" ) ;
equal ( jQuery . type ( { } ) , "object" , "Object" ) ;
equal ( jQuery . type ( /foo/ ) , "regexp" , "RegExp" ) ;
equal ( jQuery . type ( new RegExp ( "asdf" ) ) , "regexp" , "RegExp" ) ;
equal ( jQuery . type ( [ 1 ] ) , "array" , "Array" ) ;
equal ( jQuery . type ( new Date ( ) ) , "date" , "Date" ) ;
equal ( jQuery . type ( new Function ( "return;" ) ) , "function" , "Function" ) ;
equal ( jQuery . type ( function ( ) { } ) , "function" , "Function" ) ;
2012-11-24 22:22:14 +00:00
equal ( jQuery . type ( new Error ( ) ) , "error" , "Error" ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery . type ( window ) , "object" , "Window" ) ;
equal ( jQuery . type ( document ) , "object" , "Document" ) ;
equal ( jQuery . type ( document . body ) , "object" , "Element" ) ;
equal ( jQuery . type ( document . createTextNode ( "foo" ) ) , "object" , "TextNode" ) ;
equal ( jQuery . type ( document . getElementsByTagName ( "*" ) ) , "object" , "NodeList" ) ;
2012-12-18 15:33:32 +00:00
// Avoid Lint complaints
2013-04-09 15:45:09 +00:00
var MyString = String ,
MyNumber = Number ,
MyBoolean = Boolean ,
MyObject = Object ;
2012-12-18 15:33:32 +00:00
equal ( jQuery . type ( new MyBoolean ( true ) ) , "boolean" , "Boolean" ) ;
equal ( jQuery . type ( new MyNumber ( 1 ) ) , "number" , "Number" ) ;
equal ( jQuery . type ( new MyString ( "a" ) ) , "string" , "String" ) ;
equal ( jQuery . type ( new MyObject ( ) ) , "object" , "Object" ) ;
2010-08-27 13:10:52 +00:00
} ) ;
2012-06-21 19:30:24 +00:00
asyncTest ( "isPlainObject" , function ( ) {
2013-03-06 20:11:20 +00:00
expect ( 15 ) ;
2009-12-02 19:57:13 +00:00
2013-03-06 20:11:20 +00:00
var pass , iframe , doc ,
2012-11-03 04:06:50 +00:00
fn = function ( ) { } ;
2009-12-02 19:57:13 +00:00
// The use case that we want to match
2012-11-03 04:06:50 +00:00
ok ( jQuery . isPlainObject ( { } ) , "{}" ) ;
2011-01-05 21:41:23 +00:00
2009-12-18 16:34:20 +00:00
// Not objects shouldn't be matched
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( "" ) , "string" ) ;
ok ( ! jQuery . isPlainObject ( 0 ) && ! jQuery . isPlainObject ( 1 ) , "number" ) ;
ok ( ! jQuery . isPlainObject ( true ) && ! jQuery . isPlainObject ( false ) , "boolean" ) ;
ok ( ! jQuery . isPlainObject ( null ) , "null" ) ;
ok ( ! jQuery . isPlainObject ( undefined ) , "undefined" ) ;
2011-01-05 21:41:23 +00:00
2009-12-18 16:34:20 +00:00
// Arrays shouldn't be matched
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( [ ] ) , "array" ) ;
2011-01-05 21:41:23 +00:00
2009-12-02 19:57:13 +00:00
// Instantiated objects shouldn't be matched
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( new Date ( ) ) , "new Date" ) ;
2011-01-05 21:41:23 +00:00
2009-12-02 19:57:13 +00:00
// Functions shouldn't be matched
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( fn ) , "fn" ) ;
2011-01-05 21:41:23 +00:00
2009-12-02 19:57:13 +00:00
// Again, instantiated objects shouldn't be matched
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( new fn ( ) ) , "new fn (no methods)" ) ;
2011-01-05 21:41:23 +00:00
2009-12-02 19:57:13 +00:00
// Makes the function a little more realistic
// (and harder to detect, incidentally)
2012-07-05 19:52:13 +00:00
fn . prototype [ "someMethod" ] = function ( ) { } ;
2011-01-05 21:41:23 +00:00
2009-12-02 19:57:13 +00:00
// Again, instantiated objects shouldn't be matched
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( new fn ( ) ) , "new fn" ) ;
2009-12-02 19:57:13 +00:00
// DOM Element
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( document . createElement ( "div" ) ) , "DOM Element" ) ;
2011-01-05 21:41:23 +00:00
2009-12-18 16:34:20 +00:00
// Window
2012-11-03 04:06:50 +00:00
ok ( ! jQuery . isPlainObject ( window ) , "window" ) ;
2009-12-02 19:57:13 +00:00
2012-11-03 04:06:50 +00:00
pass = false ;
2011-07-25 21:06:38 +00:00
try {
jQuery . isPlainObject ( window . location ) ;
2012-11-03 04:06:50 +00:00
pass = true ;
} catch ( e ) { }
ok ( pass , "Does not throw exceptions on host objects" ) ;
// Objects from other windows should be matched
2013-09-03 13:55:32 +00:00
Globals . register ( "iframeDone" ) ;
window . iframeDone = function ( otherObject , detail ) {
window . iframeDone = undefined ;
2012-11-03 04:06:50 +00:00
iframe . parentNode . removeChild ( iframe ) ;
ok ( jQuery . isPlainObject ( new otherObject ( ) ) , "new otherObject" + ( detail ? " - " + detail : "" ) ) ;
start ( ) ;
} ;
2011-07-25 21:06:38 +00:00
2010-08-23 19:38:55 +00:00
try {
2012-11-03 04:06:50 +00:00
iframe = jQuery ( "#qunit-fixture" ) [ 0 ] . appendChild ( document . createElement ( "iframe" ) ) ;
doc = iframe . contentDocument || iframe . contentWindow . document ;
2010-08-23 19:38:55 +00:00
doc . open ( ) ;
2013-09-03 13:55:32 +00:00
doc . write ( "<body onload='window.parent.iframeDone(Object);'>" ) ;
2010-08-23 19:38:55 +00:00
doc . close ( ) ;
} catch ( e ) {
2012-11-03 04:06:50 +00:00
window . iframeDone ( Object , "iframes not supported" ) ;
2010-08-23 19:38:55 +00:00
}
2009-12-02 19:57:13 +00:00
} ) ;
2008-12-19 05:43:37 +00:00
test ( "isFunction" , function ( ) {
expect ( 19 ) ;
2013-04-09 15:45:09 +00:00
var mystr , myarr , myfunction , fn , obj , nodes , first , input , a ;
2008-12-19 05:43:37 +00:00
// Make sure that false values return false
ok ( ! jQuery . isFunction ( ) , "No Value" ) ;
ok ( ! jQuery . isFunction ( null ) , "null Value" ) ;
ok ( ! jQuery . isFunction ( undefined ) , "undefined Value" ) ;
ok ( ! jQuery . isFunction ( "" ) , "Empty String Value" ) ;
ok ( ! jQuery . isFunction ( 0 ) , "0 Value" ) ;
// Check built-ins
ok ( jQuery . isFunction ( String ) , "String Function(" + String + ")" ) ;
ok ( jQuery . isFunction ( Array ) , "Array Function(" + Array + ")" ) ;
ok ( jQuery . isFunction ( Object ) , "Object Function(" + Object + ")" ) ;
ok ( jQuery . isFunction ( Function ) , "Function Function(" + Function + ")" ) ;
// When stringified, this could be misinterpreted
2013-04-09 15:45:09 +00:00
mystr = "function" ;
2008-12-19 05:43:37 +00:00
ok ( ! jQuery . isFunction ( mystr ) , "Function String" ) ;
// When stringified, this could be misinterpreted
2013-04-09 15:45:09 +00:00
myarr = [ "function" ] ;
2008-12-19 05:43:37 +00:00
ok ( ! jQuery . isFunction ( myarr ) , "Function Array" ) ;
// When stringified, this could be misinterpreted
2013-04-09 15:45:09 +00:00
myfunction = { "function" : "test" } ;
2008-12-19 05:43:37 +00:00
ok ( ! jQuery . isFunction ( myfunction ) , "Function Object" ) ;
// Make sure normal functions still work
2013-04-09 15:45:09 +00:00
fn = function ( ) { } ;
2008-12-19 05:43:37 +00:00
ok ( jQuery . isFunction ( fn ) , "Normal Function" ) ;
2013-04-09 15:45:09 +00:00
obj = document . createElement ( "object" ) ;
2008-12-19 05:43:37 +00:00
// Firefox says this is a function
ok ( ! jQuery . isFunction ( obj ) , "Object Element" ) ;
// Since 1.3, this isn't supported (#2968)
//ok( jQuery.isFunction(obj.getAttribute), "getAttribute Function" );
2013-04-09 15:45:09 +00:00
nodes = document . body . childNodes ;
2008-12-19 05:43:37 +00:00
// Safari says this is a function
ok ( ! jQuery . isFunction ( nodes ) , "childNodes Property" ) ;
2013-04-09 15:45:09 +00:00
first = document . body . firstChild ;
2008-12-19 05:43:37 +00:00
// Normal elements are reported ok everywhere
ok ( ! jQuery . isFunction ( first ) , "A normal DOM Element" ) ;
2013-04-09 15:45:09 +00:00
input = document . createElement ( "input" ) ;
2008-12-19 05:43:37 +00:00
input . type = "text" ;
document . body . appendChild ( input ) ;
// Since 1.3, this isn't supported (#2968)
//ok( jQuery.isFunction(input.focus), "A default function property" );
document . body . removeChild ( input ) ;
2013-04-09 15:45:09 +00:00
a = document . createElement ( "a" ) ;
2008-12-19 05:43:37 +00:00
a . href = "some-function" ;
document . body . appendChild ( a ) ;
// This serializes with the word 'function' in it
ok ( ! jQuery . isFunction ( a ) , "Anchor Element" ) ;
document . body . removeChild ( a ) ;
// Recursive function calls have lengths and array-like properties
function callme ( callback ) {
function fn ( response ) {
callback ( response ) ;
}
ok ( jQuery . isFunction ( fn ) , "Recursive Function Call" ) ;
fn ( { some : "data" } ) ;
2012-06-21 19:30:24 +00:00
}
2008-12-19 05:43:37 +00:00
callme ( function ( ) {
callme ( function ( ) { } ) ;
} ) ;
} ) ;
2011-10-12 01:04:22 +00:00
test ( "isNumeric" , function ( ) {
2012-06-21 19:30:24 +00:00
expect ( 36 ) ;
2011-11-07 16:25:51 +00:00
var t = jQuery . isNumeric ,
2012-07-05 19:52:13 +00:00
Traditionalists = /** @constructor */ function ( n ) {
2011-11-07 16:25:51 +00:00
this . value = n ;
this . toString = function ( ) {
return String ( this . value ) ;
} ;
} ,
answer = new Traditionalists ( "42" ) ,
rong = new Traditionalists ( "Devo" ) ;
2011-10-12 01:04:22 +00:00
ok ( t ( "-10" ) , "Negative integer string" ) ;
ok ( t ( "0" ) , "Zero string" ) ;
ok ( t ( "5" ) , "Positive integer string" ) ;
ok ( t ( - 16 ) , "Negative integer number" ) ;
ok ( t ( 0 ) , "Zero integer number" ) ;
ok ( t ( 32 ) , "Positive integer number" ) ;
ok ( t ( "040" ) , "Octal integer literal string" ) ;
2012-06-21 19:30:24 +00:00
// OctalIntegerLiteral has been deprecated since ES3/1999
// It doesn't pass lint, so disabling until a solution can be found
//ok( t(0144), "Octal integer literal");
2011-10-12 01:04:22 +00:00
ok ( t ( "0xFF" ) , "Hexadecimal integer literal string" ) ;
ok ( t ( 0xFFF ) , "Hexadecimal integer literal" ) ;
ok ( t ( "-1.6" ) , "Negative floating point string" ) ;
ok ( t ( "4.536" ) , "Positive floating point string" ) ;
ok ( t ( - 2.6 ) , "Negative floating point number" ) ;
ok ( t ( 3.1415 ) , "Positive floating point number" ) ;
ok ( t ( 8e5 ) , "Exponential notation" ) ;
ok ( t ( "123e-2" ) , "Exponential notation string" ) ;
2011-11-07 16:25:51 +00:00
ok ( t ( answer ) , "Custom .toString returning number" ) ;
2011-11-06 20:27:42 +00:00
equal ( t ( "" ) , false , "Empty string" ) ;
equal ( t ( " " ) , false , "Whitespace characters string" ) ;
equal ( t ( "\t\t" ) , false , "Tab characters string" ) ;
equal ( t ( "abcdefghijklm1234567890" ) , false , "Alphanumeric character string" ) ;
equal ( t ( "xabcdefx" ) , false , "Non-numeric character string" ) ;
equal ( t ( true ) , false , "Boolean true literal" ) ;
equal ( t ( false ) , false , "Boolean false literal" ) ;
equal ( t ( "bcfed5.2" ) , false , "Number with preceding non-numeric characters" ) ;
equal ( t ( "7.2acdgs" ) , false , "Number with trailling non-numeric characters" ) ;
equal ( t ( undefined ) , false , "Undefined value" ) ;
equal ( t ( null ) , false , "Null value" ) ;
equal ( t ( NaN ) , false , "NaN value" ) ;
equal ( t ( Infinity ) , false , "Infinity primitive" ) ;
equal ( t ( Number . POSITIVE _INFINITY ) , false , "Positive Infinity" ) ;
equal ( t ( Number . NEGATIVE _INFINITY ) , false , "Negative Infinity" ) ;
2011-11-07 16:25:51 +00:00
equal ( t ( rong ) , false , "Custom .toString returning non-number" ) ;
2011-11-06 20:27:42 +00:00
equal ( t ( { } ) , false , "Empty object" ) ;
equal ( t ( function ( ) { } ) , false , "Instance of a function" ) ;
2012-06-21 19:30:24 +00:00
equal ( t ( new Date ( ) ) , false , "Instance of a Date" ) ;
2011-11-07 16:25:51 +00:00
equal ( t ( function ( ) { } ) , false , "Instance of a function" ) ;
2011-10-12 01:04:22 +00:00
} ) ;
2009-07-27 13:02:41 +00:00
test ( "isXMLDoc - HTML" , function ( ) {
expect ( 4 ) ;
ok ( ! jQuery . isXMLDoc ( document ) , "HTML document" ) ;
ok ( ! jQuery . isXMLDoc ( document . documentElement ) , "HTML documentElement" ) ;
ok ( ! jQuery . isXMLDoc ( document . body ) , "HTML Body Element" ) ;
2013-04-09 15:45:09 +00:00
var body ,
iframe = document . createElement ( "iframe" ) ;
2009-07-27 13:02:41 +00:00
document . body . appendChild ( iframe ) ;
try {
2013-04-09 15:45:09 +00:00
body = jQuery ( iframe ) . contents ( ) [ 0 ] ;
2010-08-23 19:38:55 +00:00
try {
ok ( ! jQuery . isXMLDoc ( body ) , "Iframe body element" ) ;
} catch ( e ) {
ok ( false , "Iframe body element exception" ) ;
}
} catch ( e ) {
ok ( true , "Iframe body element - iframe not working correctly" ) ;
2009-07-27 13:02:41 +00:00
}
document . body . removeChild ( iframe ) ;
} ) ;
2011-08-23 12:25:11 +00:00
test ( "XSS via location.hash" , function ( ) {
expect ( 1 ) ;
2011-11-14 17:13:25 +00:00
2011-08-23 12:25:11 +00:00
stop ( ) ;
2012-07-05 19:52:13 +00:00
jQuery [ "_check9521" ] = function ( x ) {
2011-08-23 12:25:11 +00:00
ok ( x , "script called from #id-like selector with inline handler" ) ;
jQuery ( "#check9521" ) . remove ( ) ;
2012-07-05 19:52:13 +00:00
delete jQuery [ "_check9521" ] ;
2011-08-23 12:25:11 +00:00
start ( ) ;
} ;
try {
// This throws an error because it's processed like an id
2012-10-16 14:17:14 +00:00
jQuery ( "#<img id='check9521' src='no-such-.gif' onerror='jQuery._check9521(false)'>" ) . appendTo ( "#qunit-fixture" ) ;
2011-08-23 12:25:11 +00:00
} catch ( err ) {
2012-07-05 19:52:13 +00:00
jQuery [ "_check9521" ] ( true ) ;
2012-04-15 21:41:54 +00:00
}
2011-08-23 12:25:11 +00:00
} ) ;
2009-07-27 13:02:41 +00:00
test ( "isXMLDoc - XML" , function ( ) {
expect ( 3 ) ;
2012-04-15 21:52:48 +00:00
var xml = createDashboardXML ( ) ;
2012-04-15 21:41:54 +00:00
ok ( jQuery . isXMLDoc ( xml ) , "XML document" ) ;
ok ( jQuery . isXMLDoc ( xml . documentElement ) , "XML documentElement" ) ;
ok ( jQuery . isXMLDoc ( jQuery ( "tab" , xml ) [ 0 ] ) , "XML Tab Element" ) ;
2009-07-27 13:02:41 +00:00
} ) ;
2010-09-22 20:50:38 +00:00
test ( "isWindow" , function ( ) {
2011-12-06 21:17:09 +00:00
expect ( 14 ) ;
2010-09-22 20:50:38 +00:00
ok ( jQuery . isWindow ( window ) , "window" ) ;
2011-12-06 21:17:09 +00:00
ok ( jQuery . isWindow ( document . getElementsByTagName ( "iframe" ) [ 0 ] . contentWindow ) , "iframe.contentWindow" ) ;
2010-09-22 20:50:38 +00:00
ok ( ! jQuery . isWindow ( ) , "empty" ) ;
ok ( ! jQuery . isWindow ( null ) , "null" ) ;
ok ( ! jQuery . isWindow ( undefined ) , "undefined" ) ;
ok ( ! jQuery . isWindow ( document ) , "document" ) ;
ok ( ! jQuery . isWindow ( document . documentElement ) , "documentElement" ) ;
ok ( ! jQuery . isWindow ( "" ) , "string" ) ;
ok ( ! jQuery . isWindow ( 1 ) , "number" ) ;
ok ( ! jQuery . isWindow ( true ) , "boolean" ) ;
ok ( ! jQuery . isWindow ( { } ) , "object" ) ;
2011-12-06 21:17:09 +00:00
ok ( ! jQuery . isWindow ( { setInterval : function ( ) { } } ) , "fake window" ) ;
2010-09-22 20:50:38 +00:00
ok ( ! jQuery . isWindow ( /window/ ) , "regexp" ) ;
ok ( ! jQuery . isWindow ( function ( ) { } ) , "function" ) ;
} ) ;
2008-12-19 05:43:37 +00:00
test ( "jQuery('html')" , function ( ) {
2013-09-07 00:46:55 +00:00
expect ( 18 ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
var s , div , j ;
2012-07-05 19:52:13 +00:00
jQuery [ "foo" ] = false ;
2013-04-09 15:45:09 +00:00
s = jQuery ( "<script>jQuery.foo='test';</script>" ) [ 0 ] ;
2008-12-19 05:43:37 +00:00
ok ( s , "Creating a script" ) ;
2012-07-05 19:52:13 +00:00
ok ( ! jQuery [ "foo" ] , "Make sure the script wasn't executed prematurely" ) ;
2009-01-09 23:49:18 +00:00
jQuery ( "body" ) . append ( "<script>jQuery.foo='test';</script>" ) ;
2012-07-05 19:52:13 +00:00
ok ( jQuery [ "foo" ] , "Executing a scripts contents in the right context" ) ;
2008-12-19 05:43:37 +00:00
2009-07-27 20:47:32 +00:00
// Test multi-line HTML
2013-04-09 15:45:09 +00:00
div = jQuery ( "<div>\r\nsome text\n<p>some p</p>\nmore text\r\n</div>" ) [ 0 ] ;
2011-11-06 20:27:42 +00:00
equal ( div . nodeName . toUpperCase ( ) , "DIV" , "Make sure we're getting a div." ) ;
equal ( div . firstChild . nodeType , 3 , "Text node." ) ;
equal ( div . lastChild . nodeType , 3 , "Text node." ) ;
equal ( div . childNodes [ 1 ] . nodeType , 1 , "Paragraph." ) ;
equal ( div . childNodes [ 1 ] . firstChild . nodeType , 3 , "Paragraph text." ) ;
2009-07-27 20:47:32 +00:00
2008-12-19 05:43:37 +00:00
ok ( jQuery ( "<link rel='stylesheet'/>" ) [ 0 ] , "Creating a link" ) ;
2009-01-03 00:51:07 +00:00
ok ( ! jQuery ( "<script/>" ) [ 0 ] . parentNode , "Create a script" ) ;
ok ( jQuery ( "<input/>" ) . attr ( "type" , "hidden" ) , "Create an input and set the type." ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
j = jQuery ( "<span>hi</span> there <!-- mon ami -->" ) ;
2008-12-19 05:43:37 +00:00
ok ( j . length >= 2 , "Check node,textnode,comment creation (some browsers delete comments)" ) ;
ok ( ! jQuery ( "<option>test</option>" ) [ 0 ] . selected , "Make sure that options are auto-selected #2050" ) ;
2009-11-11 18:49:29 +00:00
ok ( jQuery ( "<div></div>" ) [ 0 ] , "Create a div with closing tag." ) ;
ok ( jQuery ( "<table></table>" ) [ 0 ] , "Create a table with closing tag." ) ;
2011-01-19 23:37:31 +00:00
2013-09-07 00:46:55 +00:00
equal ( jQuery ( "element[attribute='<div></div>']" ) . length , 0 ,
"When html is within brackets, do not recognize as html." ) ;
//equal( jQuery( "element[attribute=<div></div>]" ).length, 0,
// "When html is within brackets, do not recognize as html." );
equal ( jQuery ( "element:not(<div></div>)" ) . length , 0 ,
"When html is within parens, do not recognize as html." ) ;
equal ( jQuery ( "\\<div\\>" ) . length , 0 , "Ignore escaped html characters" ) ;
2012-10-10 00:06:02 +00:00
} ) ;
test ( "jQuery('massive html #7990')" , function ( ) {
expect ( 3 ) ;
2012-06-19 15:35:45 +00:00
2013-04-09 15:45:09 +00:00
var i ,
li = "<li>very very very very large html string</li>" ,
html = [ "<ul>" ] ;
2012-10-10 00:06:02 +00:00
for ( i = 0 ; i < 30000 ; i += 1 ) {
2012-10-09 23:48:37 +00:00
html [ html . length ] = li ;
2011-01-19 23:37:31 +00:00
}
2012-10-09 23:48:37 +00:00
html [ html . length ] = "</ul>" ;
2011-04-11 20:33:29 +00:00
html = jQuery ( html . join ( "" ) ) [ 0 ] ;
2012-10-09 23:48:37 +00:00
equal ( html . nodeName . toLowerCase ( ) , "ul" ) ;
equal ( html . firstChild . nodeName . toLowerCase ( ) , "li" ) ;
2012-10-10 00:06:02 +00:00
equal ( html . childNodes . length , 30000 ) ;
2008-12-19 05:43:37 +00:00
} ) ;
test ( "jQuery('html', context)" , function ( ) {
expect ( 1 ) ;
2013-04-09 15:45:09 +00:00
var $div = jQuery ( "<div/>" ) [ 0 ] ,
$span = jQuery ( "<span/>" , $div ) ;
equal ( $span . length , 1 , "verify a span created with a div context works, #1763" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2013-04-09 15:45:09 +00:00
test ( "jQuery(selector, xml).text(str) - loaded via xml document" , function ( ) {
2008-12-19 05:43:37 +00:00
expect ( 2 ) ;
2012-04-15 21:41:54 +00:00
2013-04-09 15:45:09 +00:00
var xml = createDashboardXML ( ) ,
// tests for #1419 where ie was a problem
tab = jQuery ( "tab" , xml ) . eq ( 0 ) ;
equal ( tab . text ( ) , "blabla" , "verify initial text correct" ) ;
2012-04-15 21:41:54 +00:00
tab . text ( "newtext" ) ;
2013-04-09 15:45:09 +00:00
equal ( tab . text ( ) , "newtext" , "verify new text correct" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2009-12-10 17:25:25 +00:00
test ( "end()" , function ( ) {
expect ( 3 ) ;
2013-04-09 15:45:09 +00:00
equal ( "Yahoo" , jQuery ( "#yahoo" ) . parent ( ) . end ( ) . text ( ) , "check for end" ) ;
ok ( jQuery ( "#yahoo" ) . end ( ) , "check for end with nothing to end" ) ;
2009-12-10 17:25:25 +00:00
2011-04-11 20:33:29 +00:00
var x = jQuery ( "#yahoo" ) ;
2009-12-10 17:25:25 +00:00
x . parent ( ) ;
2013-04-09 15:45:09 +00:00
equal ( "Yahoo" , jQuery ( "#yahoo" ) . text ( ) , "check for non-destructive behaviour" ) ;
2009-12-10 17:25:25 +00:00
} ) ;
2008-12-19 05:43:37 +00:00
test ( "length" , function ( ) {
expect ( 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#qunit-fixture p" ) . length , 6 , "Get Number of Elements Found" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
test ( "get()" , function ( ) {
expect ( 1 ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( jQuery ( "#qunit-fixture p" ) . get ( ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Get All Elements" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2009-07-16 07:31:32 +00:00
test ( "toArray()" , function ( ) {
expect ( 1 ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( jQuery ( "#qunit-fixture p" ) . toArray ( ) ,
2009-07-16 07:31:32 +00:00
q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) ,
2012-06-21 19:30:24 +00:00
"Convert jQuery object to an Array" ) ;
} ) ;
2009-07-16 07:31:32 +00:00
2011-05-28 16:00:28 +00:00
test ( "inArray()" , function ( ) {
expect ( 19 ) ;
var selections = {
p : q ( "firstp" , "sap" , "ap" , "first" ) ,
em : q ( "siblingnext" , "siblingfirst" ) ,
div : q ( "qunit-testrunner-toolbar" , "nothiddendiv" , "nothiddendivchild" , "foo" ) ,
a : q ( "mark" , "groups" , "google" , "simon1" ) ,
empty : [ ]
} ,
tests = {
p : { elem : jQuery ( "#ap" ) [ 0 ] , index : 2 } ,
em : { elem : jQuery ( "#siblingfirst" ) [ 0 ] , index : 1 } ,
div : { elem : jQuery ( "#nothiddendiv" ) [ 0 ] , index : 1 } ,
a : { elem : jQuery ( "#simon1" ) [ 0 ] , index : 3 }
} ,
falseTests = {
p : jQuery ( "#liveSpan1" ) [ 0 ] ,
em : jQuery ( "#nothiddendiv" ) [ 0 ] ,
empty : ""
} ;
jQuery . each ( tests , function ( key , obj ) {
equal ( jQuery . inArray ( obj . elem , selections [ key ] ) , obj . index , "elem is in the array of selections of its tag" ) ;
// Third argument (fromIndex)
equal ( ! ! ~ jQuery . inArray ( obj . elem , selections [ key ] , 5 ) , false , "elem is NOT in the array of selections given a starting index greater than its position" ) ;
equal ( ! ! ~ jQuery . inArray ( obj . elem , selections [ key ] , 1 ) , true , "elem is in the array of selections given a starting index less than or equal to its position" ) ;
equal ( ! ! ~ jQuery . inArray ( obj . elem , selections [ key ] , - 3 ) , true , "elem is in the array of selections given a negative index" ) ;
} ) ;
jQuery . each ( falseTests , function ( key , elem ) {
equal ( ! ! ~ jQuery . inArray ( elem , selections [ key ] ) , false , "elem is NOT in the array of selections" ) ;
} ) ;
} ) ;
2008-12-19 05:43:37 +00:00
test ( "get(Number)" , function ( ) {
2010-11-19 11:28:13 +00:00
expect ( 2 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#qunit-fixture p" ) . get ( 0 ) , document . getElementById ( "firstp" ) , "Get A Single Element" ) ;
2010-11-19 11:28:13 +00:00
strictEqual ( jQuery ( "#firstp" ) . get ( 1 ) , undefined , "Try get with index larger elements count" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2009-07-16 07:31:41 +00:00
test ( "get(-Number)" , function ( ) {
2010-11-19 11:28:13 +00:00
expect ( 2 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "p" ) . get ( - 1 ) , document . getElementById ( "first" ) , "Get a single element with negative index" ) ;
2010-11-19 11:28:13 +00:00
strictEqual ( jQuery ( "#firstp" ) . get ( - 2 ) , undefined , "Try get with index negative index larger then elements count" ) ;
2012-06-21 19:30:24 +00:00
} ) ;
2009-07-16 07:31:41 +00:00
2008-12-19 05:43:37 +00:00
test ( "each(Function)" , function ( ) {
expect ( 1 ) ;
2013-04-09 15:45:09 +00:00
var div , pass , i ;
div = jQuery ( "div" ) ;
2011-04-11 20:33:29 +00:00
div . each ( function ( ) { this . foo = "zoo" ; } ) ;
2013-04-09 15:45:09 +00:00
pass = true ;
for ( i = 0 ; i < div . length ; i ++ ) {
if ( div . get ( i ) . foo !== "zoo" ) {
2012-06-21 19:30:24 +00:00
pass = false ;
}
2008-12-19 05:43:37 +00:00
}
ok ( pass , "Execute a function, Relative" ) ;
} ) ;
2009-12-10 17:25:25 +00:00
test ( "slice()" , function ( ) {
expect ( 7 ) ;
var $links = jQuery ( "#ap a" ) ;
2009-07-16 07:32:17 +00:00
2011-11-06 20:27:42 +00:00
deepEqual ( $links . slice ( 1 , 2 ) . get ( ) , q ( "groups" ) , "slice(1,2)" ) ;
deepEqual ( $links . slice ( 1 ) . get ( ) , q ( "groups" , "anchor1" , "mark" ) , "slice(1)" ) ;
deepEqual ( $links . slice ( 0 , 3 ) . get ( ) , q ( "google" , "groups" , "anchor1" ) , "slice(0,3)" ) ;
deepEqual ( $links . slice ( - 1 ) . get ( ) , q ( "mark" ) , "slice(-1)" ) ;
2009-12-10 17:25:25 +00:00
2011-11-06 20:27:42 +00:00
deepEqual ( $links . eq ( 1 ) . get ( ) , q ( "groups" ) , "eq(1)" ) ;
deepEqual ( $links . eq ( "2" ) . get ( ) , q ( "anchor1" ) , "eq('2')" ) ;
deepEqual ( $links . eq ( - 1 ) . get ( ) , q ( "mark" ) , "eq(-1)" ) ;
2009-07-16 07:32:17 +00:00
} ) ;
2009-12-10 17:25:25 +00:00
test ( "first()/last()" , function ( ) {
expect ( 4 ) ;
var $links = jQuery ( "#ap a" ) , $none = jQuery ( "asdf" ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( $links . first ( ) . get ( ) , q ( "google" ) , "first()" ) ;
deepEqual ( $links . last ( ) . get ( ) , q ( "mark" ) , "last()" ) ;
2009-12-10 17:25:25 +00:00
2011-11-06 20:27:42 +00:00
deepEqual ( $none . first ( ) . get ( ) , [ ] , "first() none" ) ;
deepEqual ( $none . last ( ) . get ( ) , [ ] , "last() none" ) ;
2009-12-10 17:25:25 +00:00
} ) ;
test ( "map()" , function ( ) {
2012-12-10 18:52:02 +00:00
expect ( 2 ) ;
2009-12-10 17:25:25 +00:00
2011-11-06 20:27:42 +00:00
deepEqual (
2012-12-10 18:52:02 +00:00
jQuery ( "#ap" ) . map ( function ( ) {
return jQuery ( this ) . find ( "a" ) . get ( ) ;
2009-12-10 17:25:25 +00:00
} ) . get ( ) ,
2012-12-10 18:52:02 +00:00
q ( "google" , "groups" , "anchor1" , "mark" ) ,
2009-12-10 17:25:25 +00:00
"Array Map"
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2012-12-10 18:52:02 +00:00
jQuery ( "#ap > a" ) . map ( function ( ) {
2009-12-10 17:25:25 +00:00
return this . parentNode ;
} ) . get ( ) ,
2012-12-10 18:52:02 +00:00
q ( "ap" , "ap" , "ap" ) ,
2009-12-10 17:25:25 +00:00
"Single Map"
) ;
2012-12-10 18:52:02 +00:00
} ) ;
test ( "jQuery.map" , function ( ) {
expect ( 25 ) ;
2009-12-10 17:25:25 +00:00
2012-12-10 18:52:02 +00:00
var i , label , result , callback ;
result = jQuery . map ( [ 3 , 4 , 5 ] , function ( v , k ) {
2009-12-10 17:25:25 +00:00
return k ;
2011-02-27 18:47:35 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
equal ( result . join ( "" ) , "012" , "Map the keys from an array" ) ;
2009-12-10 17:25:25 +00:00
2013-04-09 15:45:09 +00:00
result = jQuery . map ( [ 3 , 4 , 5 ] , function ( v ) {
2009-12-10 17:25:25 +00:00
return v ;
2011-02-27 18:47:35 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
equal ( result . join ( "" ) , "345" , "Map the values from an array" ) ;
result = jQuery . map ( { a : 1 , b : 2 } , function ( v , k ) {
return k ;
} ) ;
equal ( result . join ( "" ) , "ab" , "Map the keys from an object" ) ;
2009-12-10 17:25:25 +00:00
2013-04-09 15:45:09 +00:00
result = jQuery . map ( { a : 1 , b : 2 } , function ( v ) {
2011-03-21 19:12:31 +00:00
return v ;
} ) ;
2012-12-10 18:52:02 +00:00
equal ( result . join ( "" ) , "12" , "Map the values from an object" ) ;
2009-12-10 17:25:25 +00:00
2013-04-09 15:45:09 +00:00
result = jQuery . map ( [ "a" , undefined , null , "b" ] , function ( v ) {
2009-12-10 17:25:25 +00:00
return v ;
2011-02-27 18:47:35 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
equal ( result . join ( "" ) , "ab" , "Array iteration does not include undefined/null results" ) ;
2009-12-10 17:25:25 +00:00
2013-04-09 15:45:09 +00:00
result = jQuery . map ( { a : "a" , b : undefined , c : null , d : "b" } , function ( v ) {
2011-05-02 17:25:53 +00:00
return v ;
} ) ;
2012-12-10 18:52:02 +00:00
equal ( result . join ( "" ) , "ab" , "Object iteration does not include undefined/null results" ) ;
result = {
Zero : function ( ) { } ,
2013-04-09 15:45:09 +00:00
One : function ( a ) { a = a ; } ,
Two : function ( a , b ) { a = a ; b = b ; }
2012-12-10 18:52:02 +00:00
} ;
callback = function ( v , k ) {
equal ( k , "foo" , label + "-argument function treated like object" ) ;
} ;
for ( i in result ) {
label = i ;
result [ i ] . foo = "bar" ;
jQuery . map ( result [ i ] , callback ) ;
}
result = {
"undefined" : undefined ,
"null" : null ,
"false" : false ,
"true" : true ,
"empty string" : "" ,
"nonempty string" : "string" ,
"string \"0\"" : "0" ,
"negative" : - 1 ,
"excess" : 1
} ;
callback = function ( v , k ) {
equal ( k , "length" , "Object with " + label + " length treated like object" ) ;
} ;
for ( i in result ) {
label = i ;
jQuery . map ( { length : result [ i ] } , callback ) ;
}
result = {
"sparse Array" : Array ( 4 ) ,
"length: 1 plain object" : { length : 1 , "0" : true } ,
"length: 2 plain object" : { length : 2 , "0" : true , "1" : true } ,
NodeList : document . getElementsByTagName ( "html" )
} ;
callback = function ( v , k ) {
if ( result [ label ] ) {
delete result [ label ] ;
equal ( k , "0" , label + " treated like array" ) ;
}
} ;
for ( i in result ) {
label = i ;
jQuery . map ( result [ i ] , callback ) ;
}
result = false ;
2013-04-09 15:45:09 +00:00
jQuery . map ( { length : 0 } , function ( ) {
2012-12-10 18:52:02 +00:00
result = true ;
} ) ;
ok ( ! result , "length: 0 plain object treated like array" ) ;
result = false ;
2013-04-09 15:45:09 +00:00
jQuery . map ( document . getElementsByTagName ( "asdf" ) , function ( ) {
2012-12-10 18:52:02 +00:00
result = true ;
} ) ;
ok ( ! result , "empty NodeList treated like array" ) ;
2011-05-02 17:25:53 +00:00
2012-12-10 18:52:02 +00:00
result = jQuery . map ( Array ( 4 ) , function ( v , k ) {
return k % 2 ? k : [ k , k , k ] ;
2009-12-10 17:25:25 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
equal ( result . join ( "" ) , "00012223" , "Array results flattened (#2616)" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2008-12-25 19:25:30 +00:00
test ( "jQuery.merge()" , function ( ) {
2013-09-03 05:24:01 +00:00
expect ( 10 ) ;
2009-05-02 19:22:55 +00:00
2013-09-03 05:24:01 +00:00
deepEqual (
jQuery . merge ( [ ] , [ ] ) ,
[ ] ,
"Empty arrays"
) ;
2009-05-02 19:22:55 +00:00
2013-09-03 05:24:01 +00:00
deepEqual (
jQuery . merge ( [ 1 ] , [ 2 ] ) ,
[ 1 , 2 ] ,
"Basic (single-element)"
) ;
deepEqual (
jQuery . merge ( [ 1 , 2 ] , [ 3 , 4 ] ) ,
[ 1 , 2 , 3 , 4 ] ,
"Basic (multiple-element)"
) ;
2009-05-02 19:22:55 +00:00
2013-09-03 05:24:01 +00:00
deepEqual (
jQuery . merge ( [ 1 , 2 ] , [ ] ) ,
[ 1 , 2 ] ,
"Second empty"
) ;
deepEqual (
jQuery . merge ( [ ] , [ 1 , 2 ] ) ,
[ 1 , 2 ] ,
"First empty"
) ;
2009-05-02 19:22:55 +00:00
2008-12-25 19:25:30 +00:00
// Fixed at [5998], #3641
2013-09-03 05:24:01 +00:00
deepEqual (
jQuery . merge ( [ - 2 , - 1 ] , [ 0 , 1 , 2 ] ) ,
[ - 2 , - 1 , 0 , 1 , 2 ] ,
"Second array including a zero (falsy)"
) ;
2011-01-05 21:41:23 +00:00
2009-11-18 02:26:42 +00:00
// After fixing #5527
2013-09-03 05:24:01 +00:00
deepEqual (
jQuery . merge ( [ ] , [ null , undefined ] ) ,
[ null , undefined ] ,
"Second array including null and undefined values"
) ;
deepEqual (
jQuery . merge ( { length : 0 } , [ 1 , 2 ] ) ,
{ length : 2 , 0 : 1 , 1 : 2 } ,
"First array like"
) ;
deepEqual (
jQuery . merge ( [ 1 , 2 ] , { length : 1 , 0 : 3 } ) ,
[ 1 , 2 , 3 ] ,
"Second array like"
) ;
deepEqual (
jQuery . merge ( [ ] , document . getElementById ( "lengthtest" ) . getElementsByTagName ( "input" ) ) ,
[ document . getElementById ( "length" ) , document . getElementById ( "idTest" ) ] ,
"Second NodeList"
) ;
2008-12-25 19:25:30 +00:00
} ) ;
2013-09-12 16:18:36 +00:00
test ( "jQuery.grep()" , function ( ) {
expect ( 8 ) ;
var searchCriterion = function ( value ) {
return value % 2 === 0 ;
} ;
deepEqual ( jQuery . grep ( [ ] , searchCriterion ) , [ ] , "Empty array" ) ;
deepEqual ( jQuery . grep ( new Array ( 4 ) , searchCriterion ) , [ ] , "Sparse array" ) ;
deepEqual ( jQuery . grep ( [ 1 , 2 , 3 , 4 , 5 , 6 ] , searchCriterion ) , [ 2 , 4 , 6 ] , "Satisfying elements present" ) ;
deepEqual ( jQuery . grep ( [ 1 , 3 , 5 , 7 ] , searchCriterion ) , [ ] , "Satisfying elements absent" ) ;
deepEqual ( jQuery . grep ( [ 1 , 2 , 3 , 4 , 5 , 6 ] , searchCriterion , true ) , [ 1 , 3 , 5 ] , "Satisfying elements present and grep inverted" ) ;
deepEqual ( jQuery . grep ( [ 1 , 3 , 5 , 7 ] , searchCriterion , true ) , [ 1 , 3 , 5 , 7 ] , "Satisfying elements absent and grep inverted" ) ;
deepEqual ( jQuery . grep ( [ 1 , 2 , 3 , 4 , 5 , 6 ] , searchCriterion , false ) , [ 2 , 4 , 6 ] , "Satisfying elements present but grep explicitly uninverted" ) ;
deepEqual ( jQuery . grep ( [ 1 , 3 , 5 , 7 ] , searchCriterion , false ) , [ ] , "Satisfying elements absent and grep explicitly uninverted" ) ;
} ) ;
2008-12-19 05:43:37 +00:00
test ( "jQuery.extend(Object, Object)" , function ( ) {
2010-02-04 21:54:53 +00:00
expect ( 28 ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
var empty , optionsWithLength , optionsWithDate , myKlass ,
customObject , optionsWithCustomObject , MyNumber , ret ,
nullUndef , target , recursive , obj ,
defaults , defaultsCopy , options1 , options1Copy , options2 , options2Copy , merged2 ,
settings = { "xnumber1" : 5 , "xnumber2" : 7 , "xstring1" : "peter" , "xstring2" : "pan" } ,
2012-07-05 19:52:13 +00:00
options = { "xnumber2" : 1 , "xstring2" : "x" , "xxx" : "newstring" } ,
optionsCopy = { "xnumber2" : 1 , "xstring2" : "x" , "xxx" : "newstring" } ,
merged = { "xnumber1" : 5 , "xnumber2" : 1 , "xstring1" : "peter" , "xstring2" : "x" , "xxx" : "newstring" } ,
deep1 = { "foo" : { "bar" : true } } ,
deep2 = { "foo" : { "baz" : true } , "foo2" : document } ,
deep2copy = { "foo" : { "baz" : true } , "foo2" : document } ,
deepmerged = { "foo" : { "bar" : true , "baz" : true } , "foo2" : document } ,
2010-01-04 21:25:14 +00:00
arr = [ 1 , 2 , 3 ] ,
2012-07-05 19:52:13 +00:00
nestedarray = { "arr" : arr } ;
2008-12-19 05:43:37 +00:00
jQuery . extend ( settings , options ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( settings , merged , "Check if extended: settings must be extended" ) ;
deepEqual ( options , optionsCopy , "Check if not modified: options must not be modified" ) ;
2008-12-19 05:43:37 +00:00
jQuery . extend ( settings , null , options ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( settings , merged , "Check if extended: settings must be extended" ) ;
deepEqual ( options , optionsCopy , "Check if not modified: options must not be modified" ) ;
2008-12-19 05:43:37 +00:00
jQuery . extend ( true , deep1 , deep2 ) ;
2012-07-05 19:52:13 +00:00
deepEqual ( deep1 [ "foo" ] , deepmerged [ "foo" ] , "Check if foo: settings must be extended" ) ;
deepEqual ( deep2 [ "foo" ] , deep2copy [ "foo" ] , "Check if not deep2: options must not be modified" ) ;
equal ( deep1 [ "foo2" ] , document , "Make sure that a deep clone was not attempted on the document" ) ;
2008-12-19 05:43:37 +00:00
2012-07-05 19:52:13 +00:00
ok ( jQuery . extend ( true , { } , nestedarray ) [ "arr" ] !== arr , "Deep extend of object must clone child array" ) ;
2011-01-05 21:41:23 +00:00
2010-02-04 21:54:53 +00:00
// #5991
2013-02-27 20:44:34 +00:00
ok ( jQuery . isArray ( jQuery . extend ( true , { "arr" : { } } , nestedarray ) [ "arr" ] ) , "Cloned array have to be an Array" ) ;
ok ( jQuery . isPlainObject ( jQuery . extend ( true , { "arr" : arr } , { "arr" : { } } ) [ "arr" ] ) , "Cloned object have to be an plain object" ) ;
2010-01-04 21:25:14 +00:00
2013-04-09 15:45:09 +00:00
empty = { } ;
optionsWithLength = { "foo" : { "length" : - 1 } } ;
2009-07-16 07:31:55 +00:00
jQuery . extend ( true , empty , optionsWithLength ) ;
2012-07-05 19:52:13 +00:00
deepEqual ( empty [ "foo" ] , optionsWithLength [ "foo" ] , "The length property must copy correctly" ) ;
2009-07-16 07:31:55 +00:00
2009-07-16 07:32:03 +00:00
empty = { } ;
2013-04-09 15:45:09 +00:00
optionsWithDate = { "foo" : { "date" : new Date ( ) } } ;
2009-07-16 07:32:03 +00:00
jQuery . extend ( true , empty , optionsWithDate ) ;
2012-07-05 19:52:13 +00:00
deepEqual ( empty [ "foo" ] , optionsWithDate [ "foo" ] , "Dates copy correctly" ) ;
2009-07-16 07:32:03 +00:00
2012-07-05 19:52:13 +00:00
/** @constructor */
2013-04-09 15:45:09 +00:00
myKlass = function ( ) { } ;
customObject = new myKlass ( ) ;
optionsWithCustomObject = { "foo" : { "date" : customObject } } ;
2009-11-12 04:50:40 +00:00
empty = { } ;
jQuery . extend ( true , empty , optionsWithCustomObject ) ;
2012-07-05 19:52:13 +00:00
ok ( empty [ "foo" ] && empty [ "foo" ] [ "date" ] === customObject , "Custom objects copy correctly (no methods)" ) ;
2011-01-05 21:41:23 +00:00
2009-11-09 10:55:25 +00:00
// Makes the class a little more realistic
2012-07-05 19:52:13 +00:00
myKlass . prototype = { "someMethod" : function ( ) { } } ;
2009-07-16 07:32:03 +00:00
empty = { } ;
jQuery . extend ( true , empty , optionsWithCustomObject ) ;
2012-07-05 19:52:13 +00:00
ok ( empty [ "foo" ] && empty [ "foo" ] [ "date" ] === customObject , "Custom objects copy correctly" ) ;
2011-01-05 21:41:23 +00:00
2013-04-09 15:45:09 +00:00
MyNumber = Number ;
ret = jQuery . extend ( true , { "foo" : 4 } , { "foo" : new MyNumber ( 5 ) } ) ;
ok ( parseInt ( ret . foo , 10 ) === 5 , "Wrapped numbers copy correctly" ) ;
2009-07-16 07:32:03 +00:00
2013-04-09 15:45:09 +00:00
nullUndef ;
2012-07-05 19:52:13 +00:00
nullUndef = jQuery . extend ( { } , options , { "xnumber2" : null } ) ;
ok ( nullUndef [ "xnumber2" ] === null , "Check to make sure null values are copied" ) ;
2008-12-19 05:43:37 +00:00
2012-07-05 19:52:13 +00:00
nullUndef = jQuery . extend ( { } , options , { "xnumber2" : undefined } ) ;
ok ( nullUndef [ "xnumber2" ] === options [ "xnumber2" ] , "Check to make sure undefined values are not copied" ) ;
2008-12-19 05:43:37 +00:00
2012-07-05 19:52:13 +00:00
nullUndef = jQuery . extend ( { } , options , { "xnumber0" : null } ) ;
ok ( nullUndef [ "xnumber0" ] === null , "Check to make sure null values are inserted" ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
target = { } ;
recursive = { foo : target , bar : 5 } ;
2008-12-19 05:43:37 +00:00
jQuery . extend ( true , target , recursive ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( target , { bar : 5 } , "Check to make sure a recursive obj doesn't go never-ending loop by not copying it over" ) ;
2008-12-19 05:43:37 +00:00
2012-06-21 19:30:24 +00:00
ret = jQuery . extend ( true , { foo : [ ] } , { foo : [ 0 ] } ) ; // 1907
2013-02-27 20:44:34 +00:00
equal ( ret . foo . length , 1 , "Check to make sure a value with coercion 'false' copies over when necessary to fix #1907" ) ;
2008-12-19 05:43:37 +00:00
2012-06-21 19:30:24 +00:00
ret = jQuery . extend ( true , { foo : "1,2,3" } , { foo : [ 1 , 2 , 3 ] } ) ;
2013-04-09 15:45:09 +00:00
ok ( typeof ret . foo !== "string" , "Check to make sure values equal with coercion (but not actually equal) overwrite correctly" ) ;
2008-12-19 05:43:37 +00:00
2012-06-21 19:30:24 +00:00
ret = jQuery . extend ( true , { foo : "bar" } , { foo : null } ) ;
2011-04-11 20:33:29 +00:00
ok ( typeof ret . foo !== "undefined" , "Make sure a null value doesn't crash with deep extend, for #1908" ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
obj = { foo : null } ;
2008-12-19 05:43:37 +00:00
jQuery . extend ( true , obj , { foo : "notnull" } ) ;
2011-11-06 20:27:42 +00:00
equal ( obj . foo , "notnull" , "Make sure a null value can be overwritten" ) ;
2008-12-19 05:43:37 +00:00
function func ( ) { }
jQuery . extend ( func , { key : "value" } ) ;
2011-11-06 20:27:42 +00:00
equal ( func . key , "value" , "Verify a function can be extended" ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
defaults = { xnumber1 : 5 , xnumber2 : 7 , xstring1 : "peter" , xstring2 : "pan" } ;
defaultsCopy = { xnumber1 : 5 , xnumber2 : 7 , xstring1 : "peter" , xstring2 : "pan" } ;
options1 = { xnumber2 : 1 , xstring2 : "x" } ;
options1Copy = { xnumber2 : 1 , xstring2 : "x" } ;
options2 = { xstring2 : "xx" , xxx : "newstringx" } ;
options2Copy = { xstring2 : "xx" , xxx : "newstringx" } ;
merged2 = { xnumber1 : 5 , xnumber2 : 1 , xstring1 : "peter" , xstring2 : "xx" , xxx : "newstringx" } ;
2008-12-19 05:43:37 +00:00
2012-06-21 19:30:24 +00:00
settings = jQuery . extend ( { } , defaults , options1 , options2 ) ;
2011-11-06 20:27:42 +00:00
deepEqual ( settings , merged2 , "Check if extended: settings must be extended" ) ;
deepEqual ( defaults , defaultsCopy , "Check if not modified: options1 must not be modified" ) ;
deepEqual ( options1 , options1Copy , "Check if not modified: options1 must not be modified" ) ;
deepEqual ( options2 , options2Copy , "Check if not modified: options2 must not be modified" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2013-02-03 17:51:54 +00:00
test ( "jQuery.extend(true,{},{a:[], o:{}}); deep copy with array, followed by object" , function ( ) {
expect ( 2 ) ;
var result , initial = {
// This will make "copyIsArray" true
array : [ 1 , 2 , 3 , 4 ] ,
// If "copyIsArray" doesn't get reset to false, the check
// will evaluate true and enter the array copy block
// instead of the object copy block. Since the ternary in the
// "copyIsArray" block will will evaluate to false
// (check if operating on an array with ), this will be
// replaced by an empty array.
object : { }
} ;
result = jQuery . extend ( true , { } , initial ) ;
deepEqual ( result , initial , "The [result] and [initial] have equal shape and values" ) ;
ok ( ! jQuery . isArray ( result . object ) , "result.object wasn't paved with an empty array" ) ;
} ) ;
2008-12-19 05:43:37 +00:00
test ( "jQuery.each(Object,Function)" , function ( ) {
2012-12-10 18:52:02 +00:00
expect ( 23 ) ;
var i , label , seen , callback ;
2008-12-19 05:43:37 +00:00
2012-12-10 18:52:02 +00:00
seen = { } ;
jQuery . each ( [ 3 , 4 , 5 ] , function ( k , v ) {
seen [ k ] = v ;
2008-12-19 05:43:37 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
deepEqual ( seen , { "0" : 3 , "1" : 4 , "2" : 5 } , "Array iteration" ) ;
2008-12-19 05:43:37 +00:00
2012-12-10 18:52:02 +00:00
seen = { } ;
jQuery . each ( { name : "name" , lang : "lang" } , function ( k , v ) {
seen [ k ] = v ;
2008-12-19 05:43:37 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
deepEqual ( seen , { name : "name" , lang : "lang" } , "Object iteration" ) ;
2008-12-19 05:43:37 +00:00
2012-12-10 18:52:02 +00:00
seen = [ ] ;
jQuery . each ( [ 1 , 2 , 3 ] , function ( k , v ) {
seen . push ( v ) ;
if ( k === 1 ) {
2012-06-21 19:30:24 +00:00
return false ;
}
} ) ;
2012-12-10 18:52:02 +00:00
deepEqual ( seen , [ 1 , 2 ] , "Broken array iteration" ) ;
seen = [ ] ;
jQuery . each ( { "a" : 1 , "b" : 2 , "c" : 3 } , function ( k , v ) {
seen . push ( v ) ;
return false ;
} ) ;
deepEqual ( seen , [ 1 ] , "Broken object iteration" ) ;
seen = {
Zero : function ( ) { } ,
2013-04-09 15:45:09 +00:00
One : function ( a ) { a = a ; } ,
Two : function ( a , b ) { a = a ; b = b ; }
2012-12-10 18:52:02 +00:00
} ;
2013-04-09 15:45:09 +00:00
callback = function ( k ) {
2012-12-10 18:52:02 +00:00
equal ( k , "foo" , label + "-argument function treated like object" ) ;
} ;
for ( i in seen ) {
label = i ;
seen [ i ] . foo = "bar" ;
jQuery . each ( seen [ i ] , callback ) ;
}
seen = {
"undefined" : undefined ,
"null" : null ,
"false" : false ,
"true" : true ,
"empty string" : "" ,
"nonempty string" : "string" ,
"string \"0\"" : "0" ,
"negative" : - 1 ,
"excess" : 1
} ;
2013-04-09 15:45:09 +00:00
callback = function ( k ) {
2012-12-10 18:52:02 +00:00
equal ( k , "length" , "Object with " + label + " length treated like object" ) ;
} ;
for ( i in seen ) {
label = i ;
jQuery . each ( { length : seen [ i ] } , callback ) ;
}
seen = {
"sparse Array" : Array ( 4 ) ,
"length: 1 plain object" : { length : 1 , "0" : true } ,
"length: 2 plain object" : { length : 2 , "0" : true , "1" : true } ,
NodeList : document . getElementsByTagName ( "html" )
} ;
2013-04-09 15:45:09 +00:00
callback = function ( k ) {
2012-12-10 18:52:02 +00:00
if ( seen [ label ] ) {
delete seen [ label ] ;
equal ( k , "0" , label + " treated like array" ) ;
return false ;
}
} ;
for ( i in seen ) {
label = i ;
jQuery . each ( seen [ i ] , callback ) ;
}
seen = false ;
2013-04-09 15:45:09 +00:00
jQuery . each ( { length : 0 } , function ( ) {
2012-12-10 18:52:02 +00:00
seen = true ;
2009-06-20 15:51:19 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
ok ( ! seen , "length: 0 plain object treated like array" ) ;
2011-07-23 01:26:36 +00:00
2012-12-10 18:52:02 +00:00
seen = false ;
2013-04-09 15:45:09 +00:00
jQuery . each ( document . getElementsByTagName ( "asdf" ) , function ( ) {
2012-12-10 18:52:02 +00:00
seen = true ;
2011-03-30 17:17:48 +00:00
} ) ;
2012-12-10 18:52:02 +00:00
ok ( ! seen , "empty NodeList treated like array" ) ;
2011-03-30 17:17:48 +00:00
2012-12-10 18:52:02 +00:00
i = 0 ;
jQuery . each ( document . styleSheets , function ( ) {
i ++ ;
} ) ;
equal ( i , 2 , "Iteration over document.styleSheets" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
test ( "jQuery.makeArray" , function ( ) {
2012-12-10 18:52:02 +00:00
expect ( 15 ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( jQuery ( "html>*" ) ) [ 0 ] . nodeName . toUpperCase ( ) , "HEAD" , "Pass makeArray a jQuery object" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( document . getElementsByName ( "PWD" ) ) . slice ( 0 , 1 ) [ 0 ] . name , "PWD" , "Pass makeArray a nodelist" ) ;
2008-12-19 05:43:37 +00:00
2013-04-09 15:45:09 +00:00
equal ( ( function ( ) { return jQuery . makeArray ( arguments ) ; } ) ( 1 , 2 ) . join ( "" ) , "12" , "Pass makeArray an arguments array" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( [ 1 , 2 , 3 ] ) . join ( "" ) , "123" , "Pass makeArray a real array" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( ) . length , 0 , "Pass nothing to makeArray and expect an empty array" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( 0 ) [ 0 ] , 0 , "Pass makeArray a number" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( "foo" ) [ 0 ] , "foo" , "Pass makeArray a string" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( true ) [ 0 ] . constructor , Boolean , "Pass makeArray a boolean" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( document . createElement ( "div" ) ) [ 0 ] . nodeName . toUpperCase ( ) , "DIV" , "Pass makeArray a single node" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( { length : 2 , 0 : "a" , 1 : "b" } ) . join ( "" ) , "ab" , "Pass makeArray an array like map (with length)" ) ;
2008-12-19 05:43:37 +00:00
ok ( ! ! jQuery . makeArray ( document . documentElement . childNodes ) . slice ( 0 , 1 ) [ 0 ] . nodeName , "Pass makeArray a childNodes array" ) ;
// function, is tricky as it has length
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( function ( ) { return 1 ; } ) [ 0 ] ( ) , 1 , "Pass makeArray a function" ) ;
2009-05-02 19:22:55 +00:00
2008-12-19 05:43:37 +00:00
//window, also has length
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( window ) [ 0 ] , window , "Pass makeArray the window" ) ;
2008-12-19 05:43:37 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . makeArray ( /a/ ) [ 0 ] . constructor , RegExp , "Pass makeArray a regex" ) ;
2008-12-19 05:43:37 +00:00
2012-12-11 01:19:26 +00:00
// Some nodes inherit traits of nodelists
ok ( jQuery . makeArray ( document . getElementById ( "form" ) ) . length >= 13 ,
"Pass makeArray a form (treat as elements)" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2009-07-16 15:16:44 +00:00
2011-08-17 14:56:21 +00:00
test ( "jQuery.inArray" , function ( ) {
expect ( 3 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery . inArray ( 0 , false ) , - 1 , "Search in 'false' as array returns -1 and doesn't throw exception" ) ;
2011-08-17 14:56:21 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . inArray ( 0 , null ) , - 1 , "Search in 'null' as array returns -1 and doesn't throw exception" ) ;
2011-08-17 14:56:21 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery . inArray ( 0 , undefined ) , - 1 , "Search in 'undefined' as array returns -1 and doesn't throw exception" ) ;
2011-08-17 14:56:21 +00:00
} ) ;
2009-07-16 15:16:44 +00:00
test ( "jQuery.isEmptyObject" , function ( ) {
2010-12-09 18:07:44 +00:00
expect ( 2 ) ;
2011-01-05 21:41:23 +00:00
2011-11-06 20:27:42 +00:00
equal ( true , jQuery . isEmptyObject ( { } ) , "isEmptyObject on empty object literal" ) ;
equal ( false , jQuery . isEmptyObject ( { a : 1 } ) , "isEmptyObject on non-empty object literal" ) ;
2011-01-05 21:41:23 +00:00
2010-12-09 18:07:44 +00:00
// What about this ?
2011-11-06 20:27:42 +00:00
// equal(true, jQuery.isEmptyObject(null), "isEmptyObject on null" );
2009-07-27 13:02:41 +00:00
} ) ;
2009-12-31 20:17:52 +00:00
test ( "jQuery.proxy" , function ( ) {
2012-07-19 15:54:14 +00:00
expect ( 9 ) ;
2009-12-31 20:17:52 +00:00
2013-04-09 15:45:09 +00:00
var test2 , test3 , test4 , fn , cb ,
test = function ( ) { equal ( this , thisObject , "Make sure that scope is set properly." ) ; } ,
thisObject = { foo : "bar" , method : test } ;
2009-12-31 20:17:52 +00:00
// Make sure normal works
test . call ( thisObject ) ;
// Basic scoping
jQuery . proxy ( test , thisObject ) ( ) ;
2011-04-17 21:11:40 +00:00
// Another take on it
jQuery . proxy ( thisObject , "method" ) ( ) ;
2009-12-31 20:17:52 +00:00
// Make sure it doesn't freak out
2011-11-06 20:27:42 +00:00
equal ( jQuery . proxy ( null , thisObject ) , undefined , "Make sure no function was returned." ) ;
2009-12-31 20:17:52 +00:00
2012-05-18 17:28:50 +00:00
// Partial application
2013-04-09 15:45:09 +00:00
test2 = function ( a ) { equal ( a , "pre-applied" , "Ensure arguments can be pre-applied." ) ; } ;
2012-05-18 17:28:50 +00:00
jQuery . proxy ( test2 , null , "pre-applied" ) ( ) ;
2010-12-15 02:53:04 +00:00
2012-05-18 17:28:50 +00:00
// Partial application w/ normal arguments
2013-04-09 15:45:09 +00:00
test3 = function ( a , b ) { equal ( b , "normal" , "Ensure arguments can be pre-applied and passed as usual." ) ; } ;
2012-05-18 17:28:50 +00:00
jQuery . proxy ( test3 , null , "pre-applied" ) ( "normal" ) ;
2011-01-21 15:33:50 +00:00
// Test old syntax
2013-04-09 15:45:09 +00:00
test4 = { "meth" : function ( a ) { equal ( a , "boom" , "Ensure old syntax works." ) ; } } ;
2011-01-21 15:33:50 +00:00
jQuery . proxy ( test4 , "meth" ) ( "boom" ) ;
2012-12-10 18:52:02 +00:00
2012-07-19 15:54:14 +00:00
// jQuery 1.9 improved currying with `this` object
2013-04-09 15:45:09 +00:00
fn = function ( ) {
2012-07-19 15:54:14 +00:00
equal ( Array . prototype . join . call ( arguments , "," ) , "arg1,arg2,arg3" , "args passed" ) ;
equal ( this . foo , "bar" , "this-object passed" ) ;
} ;
2013-04-09 15:45:09 +00:00
cb = jQuery . proxy ( fn , null , "arg1" , "arg2" ) ;
2012-07-19 15:54:14 +00:00
cb . call ( thisObject , "arg3" ) ;
2009-12-31 20:17:52 +00:00
} ) ;
2010-01-23 22:08:26 +00:00
2012-06-21 19:28:57 +00:00
test ( "jQuery.parseHTML" , function ( ) {
2013-06-02 06:32:48 +00:00
expect ( 18 ) ;
2012-12-11 21:12:23 +00:00
var html , nodes ;
2012-06-21 19:28:57 +00:00
equal ( jQuery . parseHTML ( ) , null , "Nothing in, null out." ) ;
2012-12-11 21:12:23 +00:00
equal ( jQuery . parseHTML ( null ) , null , "Null in, null out." ) ;
equal ( jQuery . parseHTML ( "" ) , null , "Empty string in, null out." ) ;
2012-06-21 19:28:57 +00:00
raises ( function ( ) {
2012-12-11 21:12:23 +00:00
jQuery . parseHTML ( "<div></div>" , document . getElementById ( "form" ) ) ;
2012-06-21 19:28:57 +00:00
} , "Passing an element as the context raises an exception (context should be a document)" ) ;
2012-12-11 21:12:23 +00:00
nodes = jQuery . parseHTML ( jQuery ( "body" ) [ 0 ] . innerHTML ) ;
ok ( nodes . length > 4 , "Parse a large html string" ) ;
equal ( jQuery . type ( nodes ) , "array" , "parseHTML returns an array rather than a nodelist" ) ;
2012-06-21 19:28:57 +00:00
2012-12-11 21:12:23 +00:00
html = "<script>undefined()</script>" ;
equal ( jQuery . parseHTML ( html ) . length , 0 , "Ignore scripts by default" ) ;
equal ( jQuery . parseHTML ( html , true ) [ 0 ] . nodeName . toLowerCase ( ) , "script" , "Preserve scripts when requested" ) ;
2012-06-21 19:28:57 +00:00
2012-12-11 21:12:23 +00:00
html += "<div></div>" ;
equal ( jQuery . parseHTML ( html ) [ 0 ] . nodeName . toLowerCase ( ) , "div" , "Preserve non-script nodes" ) ;
equal ( jQuery . parseHTML ( html , true ) [ 0 ] . nodeName . toLowerCase ( ) , "script" , "Preserve script position" ) ;
2012-06-21 19:28:57 +00:00
equal ( jQuery . parseHTML ( "text" ) [ 0 ] . nodeType , 3 , "Parsing text returns a text node" ) ;
2012-12-11 21:12:23 +00:00
equal ( jQuery . parseHTML ( "\t<div></div>" ) [ 0 ] . nodeValue , "\t" , "Preserve leading whitespace" ) ;
2012-06-20 15:19:24 +00:00
equal ( jQuery . parseHTML ( " <div/> " ) [ 0 ] . nodeType , 3 , "Leading spaces are treated as text nodes (#11290)" ) ;
2013-01-07 14:38:21 +00:00
html = jQuery . parseHTML ( "<div>test div</div>" ) ;
equal ( html [ 0 ] . parentNode . nodeType , 11 , "parentNode should be documentFragment" ) ;
equal ( html [ 0 ] . innerHTML , "test div" , "Content should be preserved" ) ;
equal ( jQuery . parseHTML ( "<span><span>" ) . length , 1 , "Incorrect html-strings should not break anything" ) ;
2013-01-07 19:21:42 +00:00
equal ( jQuery . parseHTML ( "<td><td>" ) [ 1 ] . parentNode . nodeType , 11 ,
"parentNode should be documentFragment for wrapMap (variable in manipulation module) elements too" ) ;
2013-06-02 06:32:48 +00:00
ok ( jQuery . parseHTML ( "<#if><tr><p>This is a test.</p></tr><#/if>" ) || true , "Garbage input should not cause error" ) ;
2012-06-21 19:28:57 +00:00
} ) ;
2013-11-05 04:36:15 +00:00
test ( "jQuery.parseJSON" , function ( ) {
expect ( 20 ) ;
strictEqual ( jQuery . parseJSON ( null ) , null , "primitive null" ) ;
strictEqual ( jQuery . parseJSON ( "0.88" ) , 0.88 , "Number" ) ;
strictEqual (
jQuery . parseJSON ( "\" \\\" \\\\ \\/ \\b \\f \\n \\r \\t \\u007E \\u263a \"" ) ,
" \" \\ / \b \f \n \r \t ~ \u263A " ,
"String escapes"
) ;
deepEqual ( jQuery . parseJSON ( "{}" ) , { } , "Empty object" ) ;
deepEqual ( jQuery . parseJSON ( "{\"test\":1}" ) , { "test" : 1 } , "Plain object" ) ;
deepEqual ( jQuery . parseJSON ( "[0]" ) , [ 0 ] , "Simple array" ) ;
deepEqual (
jQuery . parseJSON ( "[ \"string\", -4.2, 2.7180e0, 3.14E-1, {}, [], true, false, null ]" ) ,
[ "string" , - 4.2 , 2.718 , 0.314 , { } , [ ] , true , false , null ] ,
"Array of all data types"
) ;
deepEqual (
jQuery . parseJSON ( "{ \"string\": \"\", \"number\": 4.2e+1, \"object\": {}," +
"\"array\": [[]], \"boolean\": [ true, false ], \"null\": null }" ) ,
{ string : "" , number : 42 , object : { } , array : [ [ ] ] , boolean : [ true , false ] , "null" : null } ,
"Dictionary of all data types"
) ;
deepEqual ( jQuery . parseJSON ( "\n{\"test\":1}\t" ) , { "test" : 1 } ,
"Leading and trailing whitespace are ignored" ) ;
2011-01-05 21:41:23 +00:00
2012-10-16 18:51:54 +00:00
raises ( function ( ) {
jQuery . parseJSON ( ) ;
2012-10-20 01:59:33 +00:00
} , null , "Undefined raises an error" ) ;
2012-10-16 18:51:54 +00:00
raises ( function ( ) {
jQuery . parseJSON ( "" ) ;
2012-10-20 01:59:33 +00:00
} , null , "Empty string raises an error" ) ;
raises ( function ( ) {
jQuery . parseJSON ( "''" ) ;
} , null , "Single-quoted string raises an error" ) ;
2013-11-05 04:36:15 +00:00
/ *
// Broken on IE8
raises ( function ( ) {
jQuery . parseJSON ( "\" \\a \"" ) ;
} , null , "Invalid string escape raises an error" ) ;
// Broken on IE8, Safari 5.1 Windows
raises ( function ( ) {
jQuery . parseJSON ( "\"\t\"" ) ;
} , null , "Unescaped control character raises an error" ) ;
// Broken on IE8
raises ( function ( ) {
jQuery . parseJSON ( ".123" ) ;
} , null , "Number with no integer component raises an error" ) ;
* /
raises ( function ( ) {
var result = jQuery . parseJSON ( "0101" ) ;
// Support: IE9+
// Ensure base-10 interpretation on browsers that erroneously accept leading-zero numbers
if ( result === 101 ) {
throw new Error ( "close enough" ) ;
}
} , null , "Leading-zero number raises an error or is parsed as decimal" ) ;
2012-10-20 01:59:33 +00:00
raises ( function ( ) {
2010-01-23 22:08:26 +00:00
jQuery . parseJSON ( "{a:1}" ) ;
2012-10-20 01:59:33 +00:00
} , null , "Unquoted property raises an error" ) ;
raises ( function ( ) {
2010-01-23 22:08:26 +00:00
jQuery . parseJSON ( "{'a':1}" ) ;
2012-10-20 01:59:33 +00:00
} , null , "Single-quoted property raises an error" ) ;
2013-11-05 04:36:15 +00:00
raises ( function ( ) {
jQuery . parseJSON ( "[,]" ) ;
} , null , "Array element elision raises an error" ) ;
raises ( function ( ) {
jQuery . parseJSON ( "{},[]" ) ;
} , null , "Comma expression raises an error" ) ;
raises ( function ( ) {
jQuery . parseJSON ( "[]\n,{}" ) ;
} , null , "Newline-containing comma expression raises an error" ) ;
raises ( function ( ) {
jQuery . parseJSON ( "\"\"\n\"\"" ) ;
} , null , "Automatic semicolon insertion raises an error" ) ;
strictEqual ( jQuery . parseJSON ( [ 0 ] ) , 0 , "Input cast to string" ) ;
2010-02-13 07:14:23 +00:00
} ) ;
2010-12-20 18:09:15 +00:00
2012-03-07 16:37:14 +00:00
test ( "jQuery.parseXML" , 8 , function ( ) {
2011-07-23 01:26:36 +00:00
var xml , tmp ;
try {
xml = jQuery . parseXML ( "<p>A <b>well-formed</b> xml string</p>" ) ;
tmp = xml . getElementsByTagName ( "p" ) [ 0 ] ;
ok ( ! ! tmp , "<p> present in document" ) ;
tmp = tmp . getElementsByTagName ( "b" ) [ 0 ] ;
ok ( ! ! tmp , "<b> present in document" ) ;
strictEqual ( tmp . childNodes [ 0 ] . nodeValue , "well-formed" , "<b> text is as expected" ) ;
} catch ( e ) {
strictEqual ( e , undefined , "unexpected error" ) ;
}
try {
xml = jQuery . parseXML ( "<p>Not a <<b>well-formed</b> xml string</p>" ) ;
ok ( false , "invalid xml not detected" ) ;
} catch ( e ) {
2011-11-07 16:40:39 +00:00
strictEqual ( e . message , "Invalid XML: <p>Not a <<b>well-formed</b> xml string</p>" , "invalid xml detected" ) ;
2011-07-23 01:26:36 +00:00
}
2012-03-07 16:37:14 +00:00
try {
xml = jQuery . parseXML ( "" ) ;
strictEqual ( xml , null , "empty string => null document" ) ;
xml = jQuery . parseXML ( ) ;
strictEqual ( xml , null , "undefined string => null document" ) ;
xml = jQuery . parseXML ( null ) ;
strictEqual ( xml , null , "null string => null document" ) ;
xml = jQuery . parseXML ( true ) ;
strictEqual ( xml , null , "non-string => null document" ) ;
} catch ( e ) {
ok ( false , "empty input throws exception" ) ;
}
2011-07-23 01:26:36 +00:00
} ) ;
2011-05-25 19:10:49 +00:00
test ( "jQuery.camelCase()" , function ( ) {
var tests = {
2011-07-23 01:26:36 +00:00
"foo-bar" : "fooBar" ,
2011-08-17 21:30:31 +00:00
"foo-bar-baz" : "fooBarBaz" ,
"girl-u-want" : "girlUWant" ,
"the-4th-dimension" : "the4thDimension" ,
"-o-tannenbaum" : "OTannenbaum" ,
"-moz-illa" : "MozIlla" ,
"-ms-take" : "msTake"
2011-05-25 19:10:49 +00:00
} ;
2011-08-17 21:30:31 +00:00
expect ( 7 ) ;
2011-05-25 19:10:49 +00:00
jQuery . each ( tests , function ( key , val ) {
equal ( jQuery . camelCase ( key ) , val , "Converts: " + key + " => " + val ) ;
} ) ;
} ) ;
2013-08-15 18:15:49 +00:00
testIframeWithCallback ( "Conditional compilation compatibility (#13274)" , "core/cc_on.html" , function ( cc _on , errors , $ ) {
expect ( 3 ) ;
ok ( true , "JScript conditional compilation " + ( cc _on ? "supported" : "not supported" ) ) ;
deepEqual ( errors , [ ] , "No errors" ) ;
ok ( $ ( ) , "jQuery executes" ) ;
} ) ;
testIframeWithCallback ( "document ready when jQuery loaded asynchronously (#13655)" , "core/dynamic_ready.html" , function ( ready ) {
expect ( 1 ) ;
equal ( true , ready , "document ready correctly fired when jQuery is loaded after DOMContentLoaded" ) ;
} ) ;
2013-09-18 13:41:07 +00:00
testIframeWithCallback ( "Tolerating alias-masked DOM properties (#14074)" , "core/aliased.html" ,
function ( errors ) {
expect ( 1 ) ;
deepEqual ( errors , [ ] , "jQuery loaded" ) ;
}
) ;