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" ) ,
main = jQuery ( "#qunit-fixture" ) ,
code = jQuery ( "<code/>" ) ,
img = jQuery ( "<img/>" ) ,
div = jQuery ( "<div/><hr/><code/><b/>" ) ,
exec = false ,
2012-07-05 19:52:13 +00:00
lng = "" ,
2012-06-20 20:19:06 +00:00
expected = 26 ,
2012-06-07 15:24:35 +00:00
attrObj = {
2012-07-05 19:52:13 +00:00
"click" : function ( ) { ok ( exec , "Click executed." ) ; } ,
"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.
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
2011-11-06 20:27:42 +00:00
deepEqual ( jQuery ( "div p" , main ) . get ( ) , q ( "sndp" , "en" , "sap" ) , "Basic selector with jQuery object as context" ) ;
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
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 ;
elem . 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
2011-11-06 20:27:42 +00:00
equal ( jQuery ( " <div/> " ) . length , 1 , "Make sure whitespace is trimmed." ) ;
2012-06-20 20:19:06 +00:00
equal ( jQuery ( " a<div/>b " ) . length , 1 , "Make sure whitespace and other characters are trimmed." ) ;
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
}
2012-07-05 19:52:13 +00:00
equal ( jQuery ( " <div>" + lng + "</div> " ) . length , 1 , "Make sure whitespace is trimmed on long strings." ) ;
equal ( jQuery ( " a<div>" + lng + "</div>b " ) . length , 1 , "Make sure whitespace and other characters are trimmed on long strings." ) ;
2008-12-19 04:37:10 +00:00
} ) ;
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 ) ;
jQuery . globalEval ( "var globalEvalTest = true;" ) ;
ok ( window . globalEvalTest , "Test variable declarations are global" ) ;
window . globalEvalTest = false ;
jQuery . globalEval ( "globalEvalTest = true;" ) ;
ok ( window . globalEvalTest , "Test variable assignments are global" ) ;
window . globalEvalTest = false ;
jQuery . globalEval ( "this.globalEvalTest = true;" ) ;
ok ( window . globalEvalTest , "Test context (this) is the window object" ) ;
window . globalEvalTest = undefined ;
} ) ;
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 ;
2011-11-06 20:27:42 +00:00
equal ( jQuery , jQuery . noConflict ( ) , "noConflict returned the jQuery object" ) ;
2012-07-05 19:52:13 +00:00
equal ( window [ "jQuery" ] , $$ , "Make sure jQuery wasn't touched." ) ;
equal ( window [ "$" ] , original$ , "Make sure $ was reverted." ) ;
2008-12-19 05:43:37 +00:00
jQuery = $ = $$ ;
2011-11-06 20:27:42 +00:00
equal ( jQuery . noConflict ( true ) , $$ , "noConflict returned the jQuery object" ) ;
2012-07-05 19:52:13 +00:00
equal ( window [ "jQuery" ] , originaljQuery , "Make sure jQuery was reverted." ) ;
equal ( window [ "$" ] , original$ , "Make sure $ was reverted." ) ;
2011-04-17 06:43:57 +00:00
ok ( $$ ( "#qunit-fixture" ) . html ( "test" ) , "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 ( ) {
2010-09-10 01:26:47 +00:00
expect ( 23 ) ;
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" ) ;
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" ) ;
2010-08-27 13:10:52 +00:00
} ) ;
2012-06-21 19:30:24 +00:00
asyncTest ( "isPlainObject" , function ( ) {
2011-07-25 21:06:38 +00:00
expect ( 15 ) ;
2009-12-02 19:57:13 +00:00
2012-06-21 19:30:24 +00:00
var iframe ;
2009-12-02 19:57:13 +00:00
// The use case that we want to match
2009-12-06 22:11:51 +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
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
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-06-21 19:30:24 +00:00
ok ( ! jQuery . isPlainObject ( new Date ( ) ) , "new Date" ) ;
2011-01-05 21:41:23 +00:00
2012-07-05 19:52:13 +00:00
var fnplain = function ( ) { } ;
2011-01-05 21:41:23 +00:00
2009-12-02 19:57:13 +00:00
// Functions shouldn't be matched
2012-07-05 19:52:13 +00:00
ok ( ! jQuery . isPlainObject ( fnplain ) , "fn" ) ;
/** @constructor */
var fn = 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-06-21 19:30:24 +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-06-21 19:30:24 +00:00
ok ( ! jQuery . isPlainObject ( new fn ( ) ) , "new fn" ) ;
2009-12-02 19:57:13 +00:00
// DOM Element
2009-12-06 22:11:51 +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
ok ( ! jQuery . isPlainObject ( window ) , "window" ) ;
2009-12-02 19:57:13 +00:00
2011-07-25 21:06:38 +00:00
try {
jQuery . isPlainObject ( window . location ) ;
ok ( true , "Does not throw exceptions on host objects" ) ;
} catch ( e ) {
ok ( false , "Does not throw exceptions on host objects -- FAIL" ) ;
}
2010-08-23 19:38:55 +00:00
try {
2012-06-21 19:30:24 +00:00
iframe = document . createElement ( "iframe" ) ;
2010-08-23 19:38:55 +00:00
document . body . appendChild ( iframe ) ;
window . iframeDone = function ( otherObject ) {
// Objects from other windows should be matched
2012-06-21 19:30:24 +00:00
ok ( jQuery . isPlainObject ( new otherObject ( ) ) , "new otherObject" ) ;
2010-08-23 19:38:55 +00:00
document . body . removeChild ( iframe ) ;
start ( ) ;
} ;
2011-01-05 21:41:23 +00:00
2010-08-23 19:38:55 +00:00
var doc = iframe . contentDocument || iframe . contentWindow . document ;
doc . open ( ) ;
doc . write ( "<body onload='window.parent.iframeDone(Object);'>" ) ;
doc . close ( ) ;
} catch ( e ) {
2009-12-02 19:57:13 +00:00
document . body . removeChild ( iframe ) ;
2010-08-23 19:38:55 +00:00
ok ( true , "new otherObject - iframes not supported" ) ;
2009-12-02 19:57:13 +00:00
start ( ) ;
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 ) ;
// 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
// Safari uses "(Internal Function)"
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
var mystr = "function" ;
ok ( ! jQuery . isFunction ( mystr ) , "Function String" ) ;
// When stringified, this could be misinterpreted
var myarr = [ "function" ] ;
ok ( ! jQuery . isFunction ( myarr ) , "Function Array" ) ;
// When stringified, this could be misinterpreted
var myfunction = { "function" : "test" } ;
ok ( ! jQuery . isFunction ( myfunction ) , "Function Object" ) ;
// Make sure normal functions still work
var fn = function ( ) { } ;
ok ( jQuery . isFunction ( fn ) , "Normal Function" ) ;
var obj = document . createElement ( "object" ) ;
// Firefox says this is a function
ok ( ! jQuery . isFunction ( obj ) , "Object Element" ) ;
// IE says this is an object
// Since 1.3, this isn't supported (#2968)
//ok( jQuery.isFunction(obj.getAttribute), "getAttribute Function" );
var nodes = document . body . childNodes ;
// Safari says this is a function
ok ( ! jQuery . isFunction ( nodes ) , "childNodes Property" ) ;
var first = document . body . firstChild ;
// Normal elements are reported ok everywhere
ok ( ! jQuery . isFunction ( first ) , "A normal DOM Element" ) ;
var input = document . createElement ( "input" ) ;
input . type = "text" ;
document . body . appendChild ( input ) ;
// IE says this is an object
// Since 1.3, this isn't supported (#2968)
//ok( jQuery.isFunction(input.focus), "A default function property" );
document . body . removeChild ( input ) ;
var a = document . createElement ( "a" ) ;
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" ) ;
var iframe = document . createElement ( "iframe" ) ;
document . body . appendChild ( iframe ) ;
try {
2009-08-27 19:22:48 +00:00
var 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 ( ) {
2012-10-10 00:06:02 +00:00
expect ( 15 ) ;
2008-12-19 05:43:37 +00:00
2010-07-28 15:19:01 +00:00
QUnit . reset ( ) ;
2012-07-05 19:52:13 +00:00
jQuery [ "foo" ] = false ;
2009-01-09 23:49:18 +00:00
var 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
var 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
2010-07-28 15:19:01 +00:00
QUnit . reset ( ) ;
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
var j = jQuery ( "<span>hi</span> there <!-- mon ami -->" ) ;
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
2012-06-20 20:22:36 +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
2011-01-19 23:37:31 +00:00
var i ;
2012-10-10 00:06:02 +00:00
var li = "<li>very very very very large html string</li>" ;
2011-04-11 20:33:29 +00:00
var 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 ) ;
2009-09-07 18:58:01 +00:00
var $div = jQuery ( "<div/>" ) [ 0 ] ;
2008-12-19 05:43:37 +00:00
var $span = jQuery ( "<span/>" , $div ) ;
2011-11-06 20:27:42 +00:00
equal ( $span . length , 1 , "Verify a span created with a div context works, #1763" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
test ( "jQuery(selector, xml).text(str) - Loaded via XML document" , function ( ) {
expect ( 2 ) ;
2012-04-15 21:41:54 +00:00
var xml = createDashboardXML ( ) ;
// tests for #1419 where IE was a problem
var tab = jQuery ( "tab" , xml ) . eq ( 0 ) ;
equal ( tab . text ( ) , "blabla" , "Verify initial text correct" ) ;
tab . text ( "newtext" ) ;
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 ) ;
2011-11-06 20:27:42 +00:00
equal ( "Yahoo" , jQuery ( "#yahoo" ) . parent ( ) . end ( ) . text ( ) , "Check for end" ) ;
2011-04-11 20:33:29 +00:00
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 ( ) ;
2011-11-06 20:27:42 +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 ( "size()" , function ( ) {
expect ( 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#qunit-fixture p" ) . size ( ) , 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 ) ;
var div = jQuery ( "div" ) ;
2011-04-11 20:33:29 +00:00
div . each ( function ( ) { this . foo = "zoo" ; } ) ;
2008-12-19 05:43:37 +00:00
var pass = true ;
for ( var i = 0 ; i < div . size ( ) ; i ++ ) {
2012-06-21 19:30:24 +00:00
if ( div . get ( i ) . foo != "zoo" ) {
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 ( ) {
2011-05-02 17:25:53 +00:00
expect ( 8 ) ;
2009-12-10 17:25:25 +00:00
2011-11-06 20:27:42 +00:00
deepEqual (
2009-12-10 17:25:25 +00:00
jQuery ( "#ap" ) . map ( function ( ) {
return jQuery ( this ) . find ( "a" ) . get ( ) ;
} ) . get ( ) ,
q ( "google" , "groups" , "anchor1" , "mark" ) ,
"Array Map"
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2009-12-10 17:25:25 +00:00
jQuery ( "#ap > a" ) . map ( function ( ) {
return this . parentNode ;
} ) . get ( ) ,
q ( "ap" , "ap" , "ap" ) ,
"Single Map"
) ;
2012-06-21 19:30:24 +00:00
var keys , values , scripts , nonsense , mapped , flat ;
2009-12-10 17:25:25 +00:00
//for #2616
2012-07-05 19:52:13 +00:00
keys = jQuery . map ( { "a" : 1 , "b" : 2 } , function ( v , k ) {
2009-12-10 17:25:25 +00:00
return k ;
2011-02-27 18:47:35 +00:00
} ) ;
2011-11-06 20:27:42 +00:00
equal ( keys . join ( "" ) , "ab" , "Map the keys from a hash to an array" ) ;
2009-12-10 17:25:25 +00:00
2012-06-21 19:30:24 +00:00
values = jQuery . map ( { a : 1 , b : 2 } , function ( v , k ) {
2009-12-10 17:25:25 +00:00
return v ;
2011-02-27 18:47:35 +00:00
} ) ;
2011-11-06 20:27:42 +00:00
equal ( values . join ( "" ) , "12" , "Map the values from a hash to an array" ) ;
2009-12-10 17:25:25 +00:00
2011-03-21 19:12:31 +00:00
// object with length prop
2012-06-21 19:30:24 +00:00
values = jQuery . map ( { a : 1 , b : 2 , length : 3 } , function ( v , k ) {
2011-03-21 19:12:31 +00:00
return v ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( values . join ( "" ) , "123" , "Map the values from a hash with a length property to an array" ) ;
2009-12-10 17:25:25 +00:00
2012-06-21 19:30:24 +00:00
scripts = document . getElementsByTagName ( "script" ) ;
mapped = jQuery . map ( scripts , function ( v , k ) {
2009-12-10 17:25:25 +00:00
return v ;
2011-02-27 18:47:35 +00:00
} ) ;
2011-11-06 20:27:42 +00:00
equal ( mapped . length , scripts . length , "Map an array(-like) to a hash" ) ;
2009-12-10 17:25:25 +00:00
2012-06-21 19:30:24 +00:00
nonsense = document . getElementsByTagName ( "asdf" ) ;
mapped = jQuery . map ( nonsense , function ( v , k ) {
2011-05-02 17:25:53 +00:00
return v ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( mapped . length , nonsense . length , "Map an empty array(-like) to a hash" ) ;
2011-05-02 17:25:53 +00:00
2012-06-21 19:30:24 +00:00
flat = jQuery . map ( Array ( 4 ) , function ( v , k ) {
2009-12-10 17:25:25 +00:00
return k % 2 ? k : [ k , k , k ] ; //try mixing array and regular returns
} ) ;
2011-11-06 20:27:42 +00:00
equal ( flat . join ( "" ) , "00012223" , "try the new flatten technique(#2616)" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2008-12-25 19:25:30 +00:00
test ( "jQuery.merge()" , function ( ) {
2009-11-18 02:26:42 +00:00
expect ( 8 ) ;
2009-05-02 19:22:55 +00:00
2008-12-25 19:25:30 +00:00
var parse = jQuery . merge ;
2009-05-02 19:22:55 +00:00
2011-11-06 20:27:42 +00:00
deepEqual ( parse ( [ ] , [ ] ) , [ ] , "Empty arrays" ) ;
2009-05-02 19:22:55 +00:00
2011-11-06 20:27:42 +00:00
deepEqual ( parse ( [ 1 ] , [ 2 ] ) , [ 1 , 2 ] , "Basic" ) ;
deepEqual ( parse ( [ 1 , 2 ] , [ 3 , 4 ] ) , [ 1 , 2 , 3 , 4 ] , "Basic" ) ;
2009-05-02 19:22:55 +00:00
2011-11-06 20:27:42 +00:00
deepEqual ( parse ( [ 1 , 2 ] , [ ] ) , [ 1 , 2 ] , "Second empty" ) ;
deepEqual ( parse ( [ ] , [ 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
2011-11-06 20:27:42 +00:00
deepEqual ( parse ( [ - 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
2011-11-06 20:27:42 +00:00
deepEqual ( parse ( [ ] , [ null , undefined ] ) , [ null , undefined ] , "Second array including null and undefined values" ) ;
2012-07-05 19:52:13 +00:00
deepEqual ( parse ( { "length" : 0 } , [ 1 , 2 ] ) , { length : 2 , 0 : 1 , 1 : 2 } , "First array like" ) ;
2008-12-25 19:25:30 +00:00
} ) ;
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
2012-07-05 19:52:13 +00:00
var settings = { "xnumber1" : 5 , "xnumber2" : 7 , "xstring1" : "peter" , "xstring2" : "pan" } ,
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 } } ,
deep1copy = { "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
2012-07-05 19:52:13 +00:00
ok ( jQuery . isArray ( jQuery . extend ( true , { "arr" : { } } , nestedarray ) [ "arr" ] ) , "Cloned array heve to be an Array" ) ;
ok ( jQuery . isPlainObject ( jQuery . extend ( true , { "arr" : arr } , { "arr" : { } } ) [ "arr" ] ) , "Cloned object heve to be an plain object" ) ;
2010-01-04 21:25:14 +00:00
2009-07-16 07:31:55 +00:00
var empty = { } ;
2012-07-05 19:52:13 +00:00
var 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 = { } ;
2012-07-05 19:52:13 +00:00
var 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 */
2009-07-16 07:32:03 +00:00
var myKlass = function ( ) { } ;
2009-11-12 05:48:45 +00:00
var customObject = new myKlass ( ) ;
2012-07-05 19:52:13 +00:00
var 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
2012-06-21 19:30:24 +00:00
var MyNumber = Number ;
2012-07-05 19:52:13 +00:00
var ret = jQuery . extend ( true , { "foo" : 4 } , { "foo" : new MyNumber ( 5 ) } ) ;
2009-11-12 05:48:45 +00:00
ok ( ret . foo == 5 , "Wrapped numbers copy correctly" ) ;
2009-07-16 07:32:03 +00:00
2008-12-19 05:43:37 +00:00
var 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
var target = { } ;
var recursive = { foo : target , bar : 5 } ;
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
2011-11-06 20:27:42 +00:00
equal ( ret . foo . length , 1 , "Check to make sure a value with coersion '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 ] } ) ;
2008-12-19 05:43:37 +00:00
ok ( typeof ret . foo != "string" , "Check to make sure values equal with coersion (but not actually equal) overwrite correctly" ) ;
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
var obj = { foo : null } ;
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
var 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" } ;
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
} ) ;
test ( "jQuery.each(Object,Function)" , function ( ) {
2011-03-30 17:17:48 +00:00
expect ( 14 ) ;
2008-12-19 05:43:37 +00:00
jQuery . each ( [ 0 , 1 , 2 ] , function ( i , n ) {
2011-11-06 20:27:42 +00:00
equal ( i , n , "Check array iteration" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
jQuery . each ( [ 5 , 6 , 7 ] , function ( i , n ) {
2011-11-06 20:27:42 +00:00
equal ( i , n - 5 , "Check array iteration" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
jQuery . each ( { name : "name" , lang : "lang" } , function ( i , n ) {
2011-11-06 20:27:42 +00:00
equal ( i , n , "Check object iteration" ) ;
2008-12-19 05:43:37 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
var total = 0 ;
jQuery . each ( [ 1 , 2 , 3 ] , function ( i , v ) { total += v ; } ) ;
2011-11-06 20:27:42 +00:00
equal ( total , 6 , "Looping over an array" ) ;
2009-03-18 21:15:38 +00:00
total = 0 ;
2012-06-21 19:30:24 +00:00
jQuery . each ( [ 1 , 2 , 3 ] , function ( i , v ) {
total += v ;
if ( i == 1 ) {
return false ;
}
} ) ;
2011-11-06 20:27:42 +00:00
equal ( total , 3 , "Looping over an array, with break" ) ;
2009-03-18 21:15:38 +00:00
total = 0 ;
jQuery . each ( { "a" : 1 , "b" : 2 , "c" : 3 } , function ( i , v ) { total += v ; } ) ;
2011-11-06 20:27:42 +00:00
equal ( total , 6 , "Looping over an object" ) ;
2009-03-18 21:15:38 +00:00
total = 0 ;
jQuery . each ( { "a" : 3 , "b" : 3 , "c" : 3 } , function ( i , v ) { total += v ; return false ; } ) ;
2011-11-06 20:27:42 +00:00
equal ( total , 3 , "Looping over an object, with break" ) ;
2009-07-16 07:31:47 +00:00
2009-06-20 15:51:19 +00:00
var f = function ( ) { } ;
2011-04-11 20:33:29 +00:00
f . foo = "bar" ;
2009-06-20 15:51:19 +00:00
jQuery . each ( f , function ( i ) {
2011-04-11 20:33:29 +00:00
f [ i ] = "baz" ;
2009-06-20 15:51:19 +00:00
} ) ;
2011-11-06 20:27:42 +00:00
equal ( "baz" , f . foo , "Loop over a function" ) ;
2011-07-23 01:26:36 +00:00
2011-03-30 17:17:48 +00:00
var stylesheet _count = 0 ;
jQuery . each ( document . styleSheets , function ( i ) {
stylesheet _count ++ ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( stylesheet _count , 2 , "should not throw an error in IE while looping over document.styleSheets and return proper amount" ) ;
2011-03-30 17:17:48 +00:00
2008-12-19 05:43:37 +00:00
} ) ;
test ( "jQuery.makeArray" , function ( ) {
2009-12-10 05:43:20 +00:00
expect ( 17 ) ;
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
2012-07-05 19:52:13 +00:00
equal ( ( function ( arg1 , arg2 ) { 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
2011-04-11 20:33:29 +00:00
ok ( jQuery . makeArray ( document . getElementById ( "form" ) ) . length >= 13 , "Pass makeArray a form (treat as elements)" ) ;
2009-12-10 05:43:20 +00:00
// For #5610
2011-11-06 20:27:42 +00:00
deepEqual ( jQuery . makeArray ( { length : "0" } ) , [ ] , "Make sure object is coerced properly." ) ;
deepEqual ( jQuery . makeArray ( { length : "5" } ) , [ ] , "Make sure object is coerced properly." ) ;
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
2011-11-06 20:27:42 +00:00
var test = function ( ) { equal ( this , thisObject , "Make sure that scope is set properly." ) ; } ;
2009-12-31 20:17:52 +00:00
var thisObject = { foo : "bar" , method : test } ;
// 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
var test2 = function ( a ) { equal ( a , "pre-applied" , "Ensure arguments can be pre-applied." ) ; } ;
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
var test3 = function ( a , b ) { equal ( b , "normal" , "Ensure arguments can be pre-applied and passed as usual." ) ; } ;
jQuery . proxy ( test3 , null , "pre-applied" ) ( "normal" ) ;
2011-01-21 15:33:50 +00:00
// Test old syntax
2012-07-05 19:52:13 +00:00
var 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-07-19 15:54:14 +00:00
// jQuery 1.9 improved currying with `this` object
var fn = function ( ) {
equal ( Array . prototype . join . call ( arguments , "," ) , "arg1,arg2,arg3" , "args passed" ) ;
equal ( this . foo , "bar" , "this-object passed" ) ;
} ;
var cb = jQuery . proxy ( fn , null , "arg1" , "arg2" ) ;
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 ( ) {
expect ( 11 ) ;
equal ( jQuery . parseHTML ( ) , null , "Nothing in, null out." ) ;
equal ( jQuery . parseHTML ( null ) , null , "Nothing in, null out." ) ;
equal ( jQuery . parseHTML ( "" ) , null , "Nothing in, null out." ) ;
raises ( function ( ) {
jQuery . parseHTML ( "<div>" , document . getElementById ( "form" ) ) ;
} , "Passing an element as the context raises an exception (context should be a document)" ) ;
var elems = jQuery . parseHTML ( jQuery ( "body" ) . html ( ) ) ;
ok ( elems . length > 10 , "Parse a large html string" ) ;
equal ( jQuery . type ( elems ) , "array" , "parseHTML returns an array rather than a nodelist" ) ;
var script = "<script>undefined()</script>" ;
equal ( jQuery . parseHTML ( script ) . length , 0 , "Passing a script is not allowed by default" ) ;
raises ( function ( ) {
jQuery ( jQuery . parseHTML ( script , true ) ) . appendTo ( "#qunit-fixture" ) ;
} , "Passing a script is allowed if allowScripts is true" ) ;
var html = script + "<div></div>" ;
equal ( jQuery . parseHTML ( html ) [ 0 ] . nodeName . toLowerCase ( ) , "div" , "Ignore scripts by default" ) ;
raises ( function ( ) {
jQuery ( jQuery . parseHTML ( html , true ) ) . appendTo ( "#qunit-fixture" ) ;
} , "Passing a script is allowed if allowScripts is true" ) ;
equal ( jQuery . parseHTML ( "text" ) [ 0 ] . nodeType , 3 , "Parsing text returns a text node" ) ;
} ) ;
2010-01-23 22:08:26 +00:00
test ( "jQuery.parseJSON" , function ( ) {
2012-10-20 01:59:33 +00:00
expect ( 9 ) ;
2011-01-05 21:41:23 +00:00
2012-10-20 01:59:33 +00:00
equal ( jQuery . parseJSON ( null ) , null , "Actual null returns null" ) ;
equal ( jQuery . isEmptyObject ( jQuery . parseJSON ( "{}" ) ) , true , "Empty object returns empty object" ) ;
deepEqual ( jQuery . parseJSON ( "{\"test\":1}" ) , { "test" : 1 } , "Plain object parses" ) ;
deepEqual ( jQuery . parseJSON ( "\n{\"test\":1}" ) , { "test" : 1 } , "Leading whitespaces are ignored." ) ;
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" ) ;
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" ) ;
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
} ) ;
2012-10-10 00:42:33 +00:00
// Skip this test because IE6 takes too long; reinstate in the compat plugin
if ( jQuery . sub _runs _too _slow _in _IE6 ) {
2012-06-29 16:37:33 +00:00
2011-01-31 13:21:42 +00:00
test ( "jQuery.sub() - Static Methods" , function ( ) {
2012-05-18 17:28:50 +00:00
expect ( 18 ) ;
var Subclass = jQuery . sub ( ) ;
Subclass . extend ( {
2012-07-05 19:52:13 +00:00
"topLevelMethod" : function ( ) { return this . debug ; } ,
"debug" : false ,
"config" : {
"locale" : "en_US"
2012-05-18 17:28:50 +00:00
} ,
2012-07-05 19:52:13 +00:00
"setup" : function ( config ) {
this . extend ( true , this [ "config" ] , config ) ;
2012-05-18 17:28:50 +00:00
}
} ) ;
2012-07-05 19:52:13 +00:00
Subclass . fn . extend ( { "subClassMethod" : function ( ) { return this ; } } ) ;
2012-05-18 17:28:50 +00:00
//Test Simple Subclass
2012-07-05 19:52:13 +00:00
ok ( Subclass [ "topLevelMethod" ] ( ) === false , "Subclass.topLevelMethod thought debug was true" ) ;
ok ( Subclass [ "config" ] [ "locale" ] == "en_US" , Subclass [ "config" ] [ "locale" ] + " is wrong!" ) ;
deepEqual ( Subclass [ "config" ] [ "test" ] , undefined , "Subclass.config.test is set incorrectly" ) ;
2012-05-18 17:28:50 +00:00
equal ( jQuery . ajax , Subclass . ajax , "The subclass failed to get all top level methods" ) ;
//Create a SubSubclass
var SubSubclass = Subclass . sub ( ) ;
//Make Sure the SubSubclass inherited properly
2012-07-05 19:52:13 +00:00
ok ( SubSubclass [ "topLevelMethod" ] ( ) === false , "SubSubclass.topLevelMethod thought debug was true" ) ;
ok ( SubSubclass [ "config" ] [ "locale" ] == "en_US" , SubSubclass [ "config" ] [ "locale" ] + " is wrong!" ) ;
deepEqual ( SubSubclass [ "config" ] [ "test" ] , undefined , "SubSubclass.config.test is set incorrectly" ) ;
2012-05-18 17:28:50 +00:00
equal ( jQuery . ajax , SubSubclass . ajax , "The subsubclass failed to get all top level methods" ) ;
//Modify The Subclass and test the Modifications
2012-07-05 19:52:13 +00:00
SubSubclass . fn . extend ( { "subSubClassMethod" : function ( ) { return this ; } } ) ;
SubSubclass [ "setup" ] ( { "locale" : "es_MX" , "test" : "worked" } ) ;
SubSubclass [ "debug" ] = true ;
2012-05-18 17:28:50 +00:00
SubSubclass . ajax = function ( ) { return false ; } ;
2012-07-05 19:52:13 +00:00
ok ( SubSubclass [ "topLevelMethod" ] ( ) , "SubSubclass.topLevelMethod thought debug was false" ) ;
deepEqual ( SubSubclass ( document ) [ "subClassMethod" ] , Subclass . fn [ "subClassMethod" ] , "Methods Differ!" ) ;
ok ( SubSubclass [ "config" ] [ "locale" ] == "es_MX" , SubSubclass [ "config" ] [ "locale" ] + " is wrong!" ) ;
ok ( SubSubclass [ "config" ] [ "test" ] == "worked" , "SubSubclass.config.test is set incorrectly" ) ;
2012-05-18 17:28:50 +00:00
notEqual ( jQuery . ajax , SubSubclass . ajax , "The subsubclass failed to get all top level methods" ) ;
//This shows that the modifications to the SubSubClass did not bubble back up to it's superclass
2012-07-05 19:52:13 +00:00
ok ( Subclass [ "topLevelMethod" ] ( ) === false , "Subclass.topLevelMethod thought debug was true" ) ;
ok ( Subclass [ "config" ] [ "locale" ] == "en_US" , Subclass [ "config" ] [ "locale" ] + " is wrong!" ) ;
deepEqual ( Subclass [ "config" ] [ "test" ] , undefined , "Subclass.config.test is set incorrectly" ) ;
deepEqual ( Subclass ( document ) [ "subSubClassMethod" ] , undefined , "subSubClassMethod set incorrectly" ) ;
2012-05-18 17:28:50 +00:00
equal ( jQuery . ajax , Subclass . ajax , "The subclass failed to get all top level methods" ) ;
2011-01-27 18:35:06 +00:00
} ) ;
2011-01-31 13:21:42 +00:00
test ( "jQuery.sub() - .fn Methods" , function ( ) {
2010-10-10 00:32:54 +00:00
expect ( 378 ) ;
2011-01-31 13:21:42 +00:00
var Subclass = jQuery . sub ( ) ,
SubclassSubclass = Subclass . sub ( ) ,
2010-10-10 00:32:54 +00:00
jQueryDocument = jQuery ( document ) ,
selectors , contexts , methods , method , arg , description ;
2011-04-11 20:33:29 +00:00
jQueryDocument . toString = function ( ) { return "jQueryDocument" ; } ;
2010-10-10 00:32:54 +00:00
Subclass . fn . subclassMethod = function ( ) { } ;
SubclassSubclass . fn . subclassSubclassMethod = function ( ) { } ;
selectors = [
2011-04-11 20:33:29 +00:00
"body" ,
"html, body" ,
"<div></div>"
2011-01-14 16:17:32 +00:00
] ;
2010-10-10 00:32:54 +00:00
contexts = [ undefined , document , jQueryDocument ] ;
2012-07-05 19:52:13 +00:00
jQuery . expandedEach = jQuery . each ;
2010-10-10 00:32:54 +00:00
jQuery . each ( selectors , function ( i , selector ) {
2012-07-05 19:52:13 +00:00
jQuery . expandedEach ( { // all methods that return a new jQuery instance
"eq" : 1 ,
"add" : document ,
"end" : undefined ,
"has" : undefined ,
"closest" : "div" ,
"filter" : document ,
"find" : "div"
} , function ( method , arg ) {
2010-10-10 00:32:54 +00:00
jQuery . each ( contexts , function ( i , context ) {
2011-04-11 20:33:29 +00:00
description = "(\"" + selector + "\", " + context + ")." + method + "(" + ( arg || "" ) + ")" ;
2010-10-10 00:32:54 +00:00
2011-11-06 20:27:42 +00:00
deepEqual (
2012-07-05 19:52:13 +00:00
( function ( var _args ) { return jQuery . fn [ method ] . apply ( jQuery ( selector , context ) , arguments ) . subclassMethod ; } ) ( arg ) ,
undefined , "jQuery" + description + " doesn't have Subclass methods"
2010-10-10 00:32:54 +00:00
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2012-07-05 19:52:13 +00:00
( function ( var _args ) { return jQuery . fn [ method ] . apply ( jQuery ( selector , context ) , arguments ) . subclassSubclassMethod ; } ) ( arg ) ,
undefined , "jQuery" + description + " doesn't have SubclassSubclass methods"
2010-10-10 00:32:54 +00:00
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2010-10-10 00:32:54 +00:00
Subclass ( selector , context ) [ method ] ( arg ) . subclassMethod , Subclass . fn . subclassMethod ,
2011-04-11 20:33:29 +00:00
"Subclass" + description + " has Subclass methods"
2010-10-10 00:32:54 +00:00
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2010-10-10 00:32:54 +00:00
Subclass ( selector , context ) [ method ] ( arg ) . subclassSubclassMethod , undefined ,
2011-04-11 20:33:29 +00:00
"Subclass" + description + " doesn't have SubclassSubclass methods"
2010-10-10 00:32:54 +00:00
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2010-10-10 00:32:54 +00:00
SubclassSubclass ( selector , context ) [ method ] ( arg ) . subclassMethod , Subclass . fn . subclassMethod ,
2011-04-11 20:33:29 +00:00
"SubclassSubclass" + description + " has Subclass methods"
2010-10-10 00:32:54 +00:00
) ;
2011-11-06 20:27:42 +00:00
deepEqual (
2010-10-10 00:32:54 +00:00
SubclassSubclass ( selector , context ) [ method ] ( arg ) . subclassSubclassMethod , SubclassSubclass . fn . subclassSubclassMethod ,
2011-04-11 20:33:29 +00:00
"SubclassSubclass" + description + " has SubclassSubclass methods"
2010-10-10 00:32:54 +00:00
) ;
} ) ;
} ) ;
} ) ;
} ) ;
2011-05-25 19:10:49 +00:00
2012-06-29 16:37:33 +00:00
} // jQuery.sub
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 ) ;
} ) ;
} ) ;