2011-01-18 00:08:51 +01:00
module ( "selector" , { teardown : moduleTeardown } ) ;
2007-03-25 01:58:19 +01:00
test ( "element" , function ( ) {
2010-11-02 00:29:11 +01:00
expect ( 21 ) ;
2010-10-22 07:48:32 +02:00
QUnit . reset ( ) ;
2009-01-13 17:40:19 +01:00
2008-05-29 01:18:25 +02:00
ok ( jQuery ( "*" ) . size ( ) >= 30 , "Select all" ) ;
var all = jQuery ( "*" ) , good = true ;
2007-08-19 09:28:41 +02:00
for ( var i = 0 ; i < all . length ; i ++ )
if ( all [ i ] . nodeType == 8 )
good = false ;
ok ( good , "Select all elements, no comment nodes" ) ;
2007-07-29 21:07:21 +02:00
t ( "Element Selector" , "p" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Element Selector" , "body" , [ "body" ] ) ;
t ( "Element Selector" , "html" , [ "html" ] ) ;
2007-07-29 21:07:21 +02:00
t ( "Parent Element" , "div p" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
2008-05-29 01:18:25 +02:00
equals ( jQuery ( "param" , "#object1" ) . length , 2 , "Object/param as context" ) ;
2009-02-15 19:20:01 +01:00
2009-09-29 21:49:43 +02:00
same ( jQuery ( "p" , document . getElementsByTagName ( "div" ) ) . get ( ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
same ( jQuery ( "p" , "div" ) . get ( ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
same ( jQuery ( "p" , jQuery ( "div" ) ) . get ( ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
same ( jQuery ( "div" ) . find ( "p" ) . get ( ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
2009-12-19 23:50:56 +01:00
2010-10-22 07:48:32 +02:00
same ( jQuery ( "#form" ) . find ( "select" ) . get ( ) , q ( "select1" , "select2" , "select3" , "select4" , "select5" ) , "Finding selects with a context." ) ;
2010-12-30 07:34:48 +01:00
2008-05-29 01:18:25 +02:00
ok ( jQuery ( "#length" ) . length , '<input name="length"> cannot be found under IE, see #945' ) ;
ok ( jQuery ( "#lengthtest input" ) . length , '<input name="length"> cannot be found under IE, see #945' ) ;
2009-02-14 17:59:10 +01:00
// Check for unique-ness and sort order
2010-10-22 07:48:32 +02:00
same ( jQuery ( "p, div p" ) . get ( ) , jQuery ( "p" ) . get ( ) , "Check for duplicates: p, div p" ) ;
2009-02-14 17:59:10 +01:00
2009-09-30 00:48:25 +02:00
t ( "Checking sort order" , "h2, h1" , [ "qunit-header" , "qunit-banner" , "qunit-userAgent" ] ) ;
t ( "Checking sort order" , "h2:first, h1:first" , [ "qunit-header" , "qunit-banner" ] ) ;
2009-02-14 17:59:10 +01:00
t ( "Checking sort order" , "p, p a" , [ "firstp" , "simon1" , "ap" , "google" , "groups" , "anchor1" , "mark" , "sndp" , "en" , "yahoo" , "sap" , "anchor2" , "simon" , "first" ] ) ;
2010-11-02 00:29:11 +01:00
// Test Conflict ID
same ( jQuery ( "#lengthtest" ) . find ( "#idTest" ) . get ( ) , q ( "idTest" ) , "Finding element with id of ID." ) ;
same ( jQuery ( "#lengthtest" ) . find ( "[name='id']" ) . get ( ) , q ( "idTest" ) , "Finding element with id of ID." ) ;
same ( jQuery ( "#lengthtest" ) . find ( "input[id='idTest']" ) . get ( ) , q ( "idTest" ) , "Finding elements with a context." ) ;
2007-03-25 01:58:19 +01:00
} ) ;
2007-07-30 04:52:24 +02:00
if ( location . protocol != "file:" ) {
2009-01-22 00:19:30 +01:00
test ( "XML Document Selectors" , function ( ) {
2010-10-22 07:48:32 +02:00
expect ( 8 ) ;
2007-07-30 04:52:24 +02:00
stop ( ) ;
2008-05-29 01:18:25 +02:00
jQuery . get ( "data/with_fries.xml" , function ( xml ) {
equals ( jQuery ( "foo_bar" , xml ) . length , 1 , "Element Selector with underscore" ) ;
2009-02-16 19:23:59 +01:00
equals ( jQuery ( ".component" , xml ) . length , 1 , "Class selector" ) ;
equals ( jQuery ( "[class*=component]" , xml ) . length , 1 , "Attribute selector for class" ) ;
2009-01-22 00:19:30 +01:00
equals ( jQuery ( "property[name=prop2]" , xml ) . length , 1 , "Attribute selector with name" ) ;
equals ( jQuery ( "[name=prop2]" , xml ) . length , 1 , "Attribute selector with name" ) ;
2009-01-22 00:31:29 +01:00
equals ( jQuery ( "#seite1" , xml ) . length , 1 , "Attribute selector with ID" ) ;
equals ( jQuery ( "component#seite1" , xml ) . length , 1 , "Attribute selector with ID" ) ;
2010-10-22 07:48:32 +02:00
equals ( jQuery ( "component" , xml ) . filter ( "#seite1" ) . length , 1 , "Attribute selector filter with ID" ) ;
2007-07-30 04:52:24 +02:00
start ( ) ;
} ) ;
} ) ;
}
2007-03-25 01:58:19 +01:00
test ( "broken" , function ( ) {
2011-01-18 00:12:42 +01:00
expect ( 19 ) ;
2011-01-17 23:44:42 +01:00
2008-12-20 02:19:17 +01:00
function broken ( name , selector ) {
try {
2009-01-05 21:43:58 +01:00
jQuery ( selector ) ;
2010-01-12 05:55:02 +01:00
ok ( false , name + ": " + selector ) ;
2008-12-20 02:19:17 +01:00
} catch ( e ) {
2011-01-17 23:44:42 +01:00
ok ( typeof e === "string" && e . indexOf ( "Syntax error" ) >= 0 ,
2008-12-20 02:19:17 +01:00
name + ": " + selector ) ;
}
}
2010-12-30 07:34:48 +01:00
2008-12-20 02:19:17 +01:00
broken ( "Broken Selector" , "[" , [ ] ) ;
broken ( "Broken Selector" , "(" , [ ] ) ;
broken ( "Broken Selector" , "{" , [ ] ) ;
broken ( "Broken Selector" , "<" , [ ] ) ;
broken ( "Broken Selector" , "()" , [ ] ) ;
broken ( "Broken Selector" , "<>" , [ ] ) ;
broken ( "Broken Selector" , "{}" , [ ] ) ;
2010-01-12 05:55:02 +01:00
broken ( "Doesn't exist" , ":visble" , [ ] ) ;
2011-01-17 23:44:42 +01:00
broken ( "Nth-child" , ":nth-child" , [ ] ) ;
broken ( "Nth-child" , ":nth-child(-)" , [ ] ) ;
2011-01-18 00:12:42 +01:00
// Sigh. WebKit thinks this is a real selector in qSA
// They've already fixed this and it'll be coming into
// current browsers soon.
//broken( "Nth-child", ":nth-child(asdf)", [] );
2011-01-17 23:44:42 +01:00
broken ( "Nth-child" , ":nth-child(2n+-0)" , [ ] ) ;
broken ( "Nth-child" , ":nth-child(2+0)" , [ ] ) ;
broken ( "Nth-child" , ":nth-child(- 1n)" , [ ] ) ;
broken ( "Nth-child" , ":nth-child(-1 n)" , [ ] ) ;
broken ( "First-child" , ":first-child(n)" , [ ] ) ;
broken ( "Last-child" , ":last-child(n)" , [ ] ) ;
broken ( "Only-child" , ":only-child(n)" , [ ] ) ;
// Make sure attribute value quoting works correctly. See: #6093
var attrbad = jQuery ( '<input type="hidden" value="2" name="foo.baz" id="attrbad1"/><input type="hidden" value="2" name="foo[baz]" id="attrbad2"/>' ) . appendTo ( "body" ) ;
broken ( "Attribute not escaped" , "input[name=foo.baz]" , [ ] ) ;
broken ( "Attribute not escaped" , "input[name=foo[baz]]" , [ ] ) ;
attrbad . remove ( ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "id" , function ( ) {
2011-01-17 23:44:42 +01:00
expect ( 29 ) ;
2007-03-25 01:58:19 +01:00
t ( "ID Selector" , "#body" , [ "body" ] ) ;
t ( "ID Selector w/ Element" , "body#body" , [ "body" ] ) ;
t ( "ID Selector w/ Element" , "ul#first" , [ ] ) ;
t ( "ID selector with existing ID descendant" , "#firstp #simon1" , [ "simon1" ] ) ;
t ( "ID selector with non-existant descendant" , "#firstp #foobar" , [ ] ) ;
t ( "ID selector using UTF8" , "#台北Táiběi" , [ "台北Táiběi" ] ) ;
t ( "Multiple ID selectors using UTF8" , "#台北Táiběi, #台北" , [ "台北Táiběi" , "台北" ] ) ;
t ( "Descendant ID selector using UTF8" , "div #台北" , [ "台北" ] ) ;
t ( "Child ID selector using UTF8" , "form > #台北" , [ "台北" ] ) ;
2010-12-30 07:34:48 +01:00
2007-03-25 04:04:03 +02:00
t ( "Escaped ID" , "#foo\\:bar" , [ "foo:bar" ] ) ;
t ( "Escaped ID" , "#test\\.foo\\[5\\]bar" , [ "test.foo[5]bar" ] ) ;
t ( "Descendant escaped ID" , "div #foo\\:bar" , [ "foo:bar" ] ) ;
t ( "Descendant escaped ID" , "div #test\\.foo\\[5\\]bar" , [ "test.foo[5]bar" ] ) ;
t ( "Child escaped ID" , "form > #foo\\:bar" , [ "foo:bar" ] ) ;
t ( "Child escaped ID" , "form > #test\\.foo\\[5\\]bar" , [ "test.foo[5]bar" ] ) ;
2010-12-30 07:34:48 +01:00
2007-11-17 00:39:23 +01:00
t ( "ID Selector, child ID present" , "#form > #radio1" , [ "radio1" ] ) ; // bug #267
t ( "ID Selector, not an ancestor ID" , "#form #first" , [ ] ) ;
2007-03-25 01:58:19 +01:00
t ( "ID Selector, not a child ID" , "#form > #option1a" , [ ] ) ;
2010-12-30 07:34:48 +01:00
2007-09-04 04:55:38 +02:00
t ( "All Children of ID" , "#foo > *" , [ "sndp" , "en" , "sap" ] ) ;
2008-08-21 19:08:50 +02:00
t ( "All Children of ID with no children" , "#firstUL > *" , [ ] ) ;
2010-12-30 07:34:48 +01:00
2009-12-17 19:34:38 +01:00
var a = jQuery ( '<div><a name="tName1">tName1 A</a><a name="tName2">tName2 A</a><div id="tName1">tName1 Div</div></div>' ) . appendTo ( '#main' ) ;
2008-05-29 01:18:25 +02:00
equals ( jQuery ( "#tName1" ) [ 0 ] . id , 'tName1' , "ID selector with same value for a name attribute" ) ;
equals ( jQuery ( "#tName2" ) . length , 0 , "ID selector non-existing but name attribute on an A tag" ) ;
2009-12-17 19:34:38 +01:00
a . remove ( ) ;
2007-05-13 19:20:03 +02:00
t ( "ID Selector on Form with an input that has a name of 'id'" , "#lengthtest" , [ "lengthtest" ] ) ;
2010-12-30 07:34:48 +01:00
2007-03-25 01:58:19 +01:00
t ( "ID selector with non-existant ancestor" , "#asdfasdf #foobar" , [ ] ) ; // bug #986
2007-08-27 06:58:02 +02:00
2009-09-29 21:49:43 +02:00
same ( jQuery ( "body" ) . find ( "div#form" ) . get ( ) , [ ] , "ID selector within the context of another element" ) ;
2009-02-07 17:54:11 +01:00
2011-01-17 23:44:42 +01:00
//#7533
equal ( jQuery ( "<div id=\"A'B~C.D[E]\"><p>foo</p></div>" ) . find ( "p" ) . length , 1 , "Find where context root is a node and has an ID with CSS3 meta characters" ) ;
2009-02-07 17:54:11 +01:00
t ( "Underscore ID" , "#types_all" , [ "types_all" ] ) ;
t ( "Dash ID" , "#fx-queue" , [ "fx-queue" ] ) ;
2009-02-15 23:46:54 +01:00
t ( "ID with weird characters in it" , "#name\\+value" , [ "name+value" ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "class" , function ( ) {
2009-02-15 19:20:01 +01:00
expect ( 22 ) ;
2007-03-25 01:58:19 +01:00
t ( "Class Selector" , ".blog" , [ "mark" , "simon" ] ) ;
2009-01-21 23:57:07 +01:00
t ( "Class Selector" , ".GROUPS" , [ "groups" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Class Selector" , ".blog.link" , [ "simon" ] ) ;
t ( "Class Selector w/ Element" , "a.blog" , [ "mark" , "simon" ] ) ;
t ( "Parent Class Selector" , "p .blog" , [ "mark" , "simon" ] ) ;
2009-02-15 19:20:01 +01:00
2009-09-29 21:49:43 +02:00
same ( jQuery ( ".blog" , document . getElementsByTagName ( "p" ) ) . get ( ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
same ( jQuery ( ".blog" , "p" ) . get ( ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
same ( jQuery ( ".blog" , jQuery ( "p" ) ) . get ( ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
same ( jQuery ( "p" ) . find ( ".blog" ) . get ( ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
2010-12-30 07:34:48 +01:00
2007-03-25 01:58:19 +01:00
t ( "Class selector using UTF8" , ".台北Táiběi" , [ "utf8class1" ] ) ;
2008-12-20 02:19:17 +01:00
//t( "Class selector using UTF8", ".台北", ["utf8class1","utf8class2"] );
2007-03-25 01:58:19 +01:00
t ( "Class selector using UTF8" , ".台北Táiběi.台北" , [ "utf8class1" ] ) ;
t ( "Class selector using UTF8" , ".台北Táiběi, .台北" , [ "utf8class1" , "utf8class2" ] ) ;
t ( "Descendant class selector using UTF8" , "div .台北Táiběi" , [ "utf8class1" ] ) ;
t ( "Child class selector using UTF8" , "form > .台北Táiběi" , [ "utf8class1" ] ) ;
2009-01-21 23:57:07 +01:00
2007-03-25 04:04:03 +02:00
t ( "Escaped Class" , ".foo\\:bar" , [ "foo:bar" ] ) ;
t ( "Escaped Class" , ".test\\.foo\\[5\\]bar" , [ "test.foo[5]bar" ] ) ;
t ( "Descendant scaped Class" , "div .foo\\:bar" , [ "foo:bar" ] ) ;
t ( "Descendant scaped Class" , "div .test\\.foo\\[5\\]bar" , [ "test.foo[5]bar" ] ) ;
t ( "Child escaped Class" , "form > .foo\\:bar" , [ "foo:bar" ] ) ;
t ( "Child escaped Class" , "form > .test\\.foo\\[5\\]bar" , [ "test.foo[5]bar" ] ) ;
2009-02-07 17:54:11 +01:00
var div = document . createElement ( "div" ) ;
2011-01-17 23:44:42 +01:00
div . innerHTML = "<div class='test e'></div><div class='test'></div>" ;
2009-09-29 21:49:43 +02:00
same ( jQuery ( ".e" , div ) . get ( ) , [ div . firstChild ] , "Finding a second class." ) ;
2009-02-07 17:54:11 +01:00
div . lastChild . className = "e" ;
2009-09-29 21:49:43 +02:00
same ( jQuery ( ".e" , div ) . get ( ) , [ div . firstChild , div . lastChild ] , "Finding a modified class." ) ;
2007-03-25 01:58:19 +01:00
} ) ;
2009-01-05 01:21:13 +01:00
test ( "name" , function ( ) {
2010-10-22 07:48:32 +02:00
expect ( 15 ) ;
2009-01-05 01:21:13 +01:00
t ( "Name selector" , "input[name=action]" , [ "text1" ] ) ;
t ( "Name selector with single quotes" , "input[name='action']" , [ "text1" ] ) ;
t ( "Name selector with double quotes" , 'input[name="action"]' , [ "text1" ] ) ;
2009-02-14 23:24:55 +01:00
t ( "Name selector non-input" , "[name=test]" , [ "length" , "fx-queue" ] ) ;
t ( "Name selector non-input" , "[name=div]" , [ "fadein" ] ) ;
2009-01-05 01:21:13 +01:00
t ( "Name selector non-input" , "*[name=iframe]" , [ "iframe" ] ) ;
t ( "Name selector for grouped input" , "input[name='types[]']" , [ "types_all" , "types_anime" , "types_movie" ] )
2009-09-29 21:49:43 +02:00
same ( jQuery ( "#form" ) . find ( "input[name=action]" ) . get ( ) , q ( "text1" ) , "Name selector within the context of another element" ) ;
same ( jQuery ( "#form" ) . find ( "input[name='foo[bar]']" ) . get ( ) , q ( "hidden2" ) , "Name selector for grouped form element within the context of another element" ) ;
2009-02-15 23:33:19 +01:00
2010-10-22 07:48:32 +02:00
var form = jQuery ( "<form><input name='id'/></form>" ) . appendTo ( "body" ) ;
equals ( form . find ( "input" ) . length , 1 , "Make sure that rooted queries on forms (with possible expandos) work." ) ;
form . remove ( ) ;
2009-12-17 19:23:39 +01:00
var a = jQuery ( '<div><a id="tName1ID" name="tName1">tName1 A</a><a id="tName2ID" name="tName2">tName2 A</a><div id="tName1">tName1 Div</div></div>' ) . appendTo ( '#main' ) . children ( ) ;
equals ( a . length , 3 , "Make sure the right number of elements were inserted." ) ;
equals ( a [ 1 ] . id , "tName2ID" , "Make sure the right number of elements were inserted." ) ;
2009-02-15 23:33:19 +01:00
2010-10-22 07:48:32 +02:00
equals ( jQuery ( "[name=tName1]" ) [ 0 ] , a [ 0 ] , "Find elements that have similar IDs" ) ;
equals ( jQuery ( "[name=tName2]" ) [ 0 ] , a [ 1 ] , "Find elements that have similar IDs" ) ;
2009-12-17 19:23:39 +01:00
t ( "Find elements that have similar IDs" , "#tName2ID" , [ "tName2ID" ] ) ;
2009-02-15 23:33:19 +01:00
a . remove ( ) ;
2009-01-05 01:21:13 +01:00
} ) ;
2007-03-25 01:58:19 +01:00
test ( "multiple" , function ( ) {
expect ( 4 ) ;
2010-12-30 07:34:48 +01:00
2009-09-29 23:34:12 +02:00
t ( "Comma Support" , "h2, p" , [ "qunit-banner" , "qunit-userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Comma Support" , "h2 , p" , [ "qunit-banner" , "qunit-userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Comma Support" , "h2 , p" , [ "qunit-banner" , "qunit-userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Comma Support" , "h2,p" , [ "qunit-banner" , "qunit-userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "child and adjacent" , function ( ) {
2011-01-17 23:44:42 +01:00
expect ( 31 ) ;
2007-03-25 01:58:19 +01:00
t ( "Child" , "p > a" , [ "simon1" , "google" , "groups" , "mark" , "yahoo" , "simon" ] ) ;
t ( "Child" , "p> a" , [ "simon1" , "google" , "groups" , "mark" , "yahoo" , "simon" ] ) ;
t ( "Child" , "p >a" , [ "simon1" , "google" , "groups" , "mark" , "yahoo" , "simon" ] ) ;
t ( "Child" , "p>a" , [ "simon1" , "google" , "groups" , "mark" , "yahoo" , "simon" ] ) ;
t ( "Child w/ Class" , "p > a.blog" , [ "mark" , "simon" ] ) ;
t ( "All Children" , "code > *" , [ "anchor1" , "anchor2" ] ) ;
t ( "All Grandchildren" , "p > * > *" , [ "anchor1" , "anchor2" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Adjacent" , "a + a" , [ "groups" ] ) ;
t ( "Adjacent" , "a +a" , [ "groups" ] ) ;
t ( "Adjacent" , "a+ a" , [ "groups" ] ) ;
t ( "Adjacent" , "a+a" , [ "groups" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Adjacent" , "p + p" , [ "ap" , "en" , "sap" ] ) ;
2009-02-16 16:36:42 +01:00
t ( "Adjacent" , "p#firstp + p" , [ "ap" ] ) ;
t ( "Adjacent" , "p[lang=en] + p" , [ "sap" ] ) ;
t ( "Adjacent" , "a.GROUPS + code + a" , [ "mark" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Comma, Child, and Adjacent" , "a + a, code > a" , [ "groups" , "anchor1" , "anchor2" ] ) ;
2009-12-19 23:50:56 +01:00
t ( "Element Preceded By" , "p ~ div" , [ "foo" , "moretests" , "tabindex-tests" , "liveHandlerOrder" , "siblingTest" ] ) ;
t ( "Element Preceded By" , "#first ~ div" , [ "moretests" , "tabindex-tests" , "liveHandlerOrder" , "siblingTest" ] ) ;
t ( "Element Preceded By" , "#groups ~ a" , [ "mark" ] ) ;
t ( "Element Preceded By" , "#length ~ input" , [ "idTest" ] ) ;
t ( "Element Preceded By" , "#siblingfirst ~ em" , [ "siblingnext" ] ) ;
2011-01-17 23:44:42 +01:00
same ( jQuery ( "#siblingfirst" ) . find ( "~ em" ) . get ( ) , q ( "siblingnext" ) , "Element Preceded By with a context." ) ;
same ( jQuery ( "#siblingfirst" ) . find ( "+ em" ) . get ( ) , q ( "siblingnext" ) , "Element Directly Preceded By with a context." ) ;
var a = jQuery ( "<div id='foo'></div><p id='bar'></p><p id='bar2'></p>" ) ;
same ( jQuery ( "~ p" , a [ 0 ] ) . get ( ) , [ a [ 1 ] , a [ 2 ] ] , "Detached Element Directly Preceded By with a context." ) ;
same ( jQuery ( "+ p" , a [ 0 ] ) . get ( ) , [ a [ 1 ] ] , "Detached Element Preceded By with a context." ) ;
2009-01-05 01:21:13 +01:00
2009-01-19 19:09:11 +01:00
t ( "Verify deep class selector" , "div.blah > p > a" , [ ] ) ;
t ( "No element deep selector" , "div.foo > span > a" , [ ] ) ;
2009-09-29 21:49:43 +02:00
same ( jQuery ( "> :first" , document . getElementById ( "nothiddendiv" ) ) . get ( ) , q ( "nothiddendivchild" ) , "Verify child context positional selctor" ) ;
same ( jQuery ( "> :eq(0)" , document . getElementById ( "nothiddendiv" ) ) . get ( ) , q ( "nothiddendivchild" ) , "Verify child context positional selctor" ) ;
same ( jQuery ( "> *:first" , document . getElementById ( "nothiddendiv" ) ) . get ( ) , q ( "nothiddendivchild" ) , "Verify child context positional selctor" ) ;
2009-01-13 17:40:19 +01:00
2009-01-05 01:21:13 +01:00
t ( "Non-existant ancestors" , ".fototab > .thumbnails > a" , [ ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "attributes" , function ( ) {
2011-01-17 23:44:42 +01:00
expect ( 41 ) ;
2007-09-04 04:55:38 +02:00
t ( "Attribute Exists" , "a[title]" , [ "google" ] ) ;
t ( "Attribute Exists" , "*[title]" , [ "google" ] ) ;
t ( "Attribute Exists" , "[title]" , [ "google" ] ) ;
2009-01-13 17:40:19 +01:00
t ( "Attribute Exists" , "a[ title ]" , [ "google" ] ) ;
2010-12-30 07:34:48 +01:00
2007-09-04 04:55:38 +02:00
t ( "Attribute Equals" , "a[rel='bookmark']" , [ "simon1" ] ) ;
t ( "Attribute Equals" , 'a[rel="bookmark"]' , [ "simon1" ] ) ;
t ( "Attribute Equals" , "a[rel=bookmark]" , [ "simon1" ] ) ;
2009-01-05 01:21:13 +01:00
t ( "Attribute Equals" , "a[href='http://www.google.com/']" , [ "google" ] ) ;
2009-01-13 17:40:19 +01:00
t ( "Attribute Equals" , "a[ rel = 'bookmark' ]" , [ "simon1" ] ) ;
document . getElementById ( "anchor2" ) . href = "#2" ;
t ( "href Attribute" , "p a[href^=#]" , [ "anchor2" ] ) ;
t ( "href Attribute" , "p a[href*=#]" , [ "simon1" , "anchor2" ] ) ;
t ( "for Attribute" , "form label[for]" , [ "label-for" ] ) ;
t ( "for Attribute in form" , "#form [for=action]" , [ "label-for" ] ) ;
2009-02-09 16:18:07 +01:00
2009-01-20 20:44:08 +01:00
t ( "Attribute containing []" , "input[name^='foo[']" , [ "hidden2" ] ) ;
t ( "Attribute containing []" , "input[name^='foo[bar]']" , [ "hidden2" ] ) ;
t ( "Attribute containing []" , "input[name*='[bar]']" , [ "hidden2" ] ) ;
t ( "Attribute containing []" , "input[name$='bar]']" , [ "hidden2" ] ) ;
t ( "Attribute containing []" , "input[name$='[bar]']" , [ "hidden2" ] ) ;
t ( "Attribute containing []" , "input[name$='foo[bar]']" , [ "hidden2" ] ) ;
t ( "Attribute containing []" , "input[name*='foo[bar]']" , [ "hidden2" ] ) ;
2010-12-30 07:34:48 +01:00
2009-01-21 23:57:07 +01:00
t ( "Multiple Attribute Equals" , "#form input[type='radio'], #form input[type='hidden']" , [ "radio1" , "radio2" , "hidden1" ] ) ;
t ( "Multiple Attribute Equals" , "#form input[type='radio'], #form input[type=\"hidden\"]" , [ "radio1" , "radio2" , "hidden1" ] ) ;
t ( "Multiple Attribute Equals" , "#form input[type='radio'], #form input[type=hidden]" , [ "radio1" , "radio2" , "hidden1" ] ) ;
2010-12-30 07:34:48 +01:00
2007-09-04 04:55:38 +02:00
t ( "Attribute selector using UTF8" , "span[lang=中文]" , [ "台北" ] ) ;
2010-12-30 07:34:48 +01:00
2007-09-04 04:55:38 +02:00
t ( "Attribute Begins With" , "a[href ^= 'http://www']" , [ "google" , "yahoo" ] ) ;
t ( "Attribute Ends With" , "a[href $= 'org/']" , [ "mark" ] ) ;
t ( "Attribute Contains" , "a[href *= 'google']" , [ "google" , "groups" ] ) ;
2009-01-21 23:36:21 +01:00
t ( "Attribute Is Not Equal" , "#ap a[hreflang!='en']" , [ "google" , "groups" , "anchor1" ] ) ;
2009-02-07 18:41:30 +01:00
2010-11-09 20:03:11 +01:00
var opt = document . getElementById ( "option1a" ) ,
match = ( window . Sizzle || window . jQuery . find ) . matchesSelector ;
opt . setAttribute ( "test" , "" ) ;
ok ( match ( opt , "[id*=option1][type!=checkbox]" ) , "Attribute Is Not Equal Matches" ) ;
ok ( match ( opt , "[id*=option1]" ) , "Attribute With No Quotes Contains Matches" ) ;
ok ( match ( opt , "[test=]" ) , "Attribute With No Quotes No Content Matches" ) ;
ok ( match ( opt , "[id=option1a]" ) , "Attribute With No Quotes Equals Matches" ) ;
ok ( match ( document . getElementById ( "simon1" ) , "a[href*=#]" ) , "Attribute With No Quotes Href Contains Matches" ) ;
2010-10-22 07:48:32 +02:00
2009-02-07 18:41:30 +01:00
t ( "Empty values" , "#select1 option[value='']" , [ "option1a" ] ) ;
t ( "Empty values" , "#select1 option[value!='']" , [ "option1b" , "option1c" , "option1d" ] ) ;
2010-12-30 07:34:48 +01:00
2008-12-20 02:19:17 +01:00
t ( "Select options via :selected" , "#select1 option:selected" , [ "option1a" ] ) ;
t ( "Select options via :selected" , "#select2 option:selected" , [ "option2d" ] ) ;
t ( "Select options via :selected" , "#select3 option:selected" , [ "option3b" , "option3c" ] ) ;
2010-12-30 07:34:48 +01:00
2007-09-04 04:55:38 +02:00
t ( "Grouped Form Elements" , "input[name='foo[bar]']" , [ "hidden2" ] ) ;
2011-01-17 23:44:42 +01:00
// Make sure attribute value quoting works correctly. See: #6093
var attrbad = jQuery ( '<input type="hidden" value="2" name="foo.baz" id="attrbad1"/><input type="hidden" value="2" name="foo[baz]" id="attrbad2"/>' ) . appendTo ( "body" ) ;
t ( "Find escaped attribute value" , "input[name=foo\\.baz]" , [ "attrbad1" ] ) ;
t ( "Find escaped attribute value" , "input[name=foo\\[baz\\]]" , [ "attrbad2" ] ) ;
attrbad . remove ( ) ;
2007-03-25 01:58:19 +01:00
} ) ;
2009-12-03 17:45:38 +01:00
test ( "pseudo - child" , function ( ) {
2011-01-17 23:44:42 +01:00
expect ( 38 ) ;
2007-03-25 01:58:19 +01:00
t ( "First Child" , "p:first-child" , [ "firstp" , "sndp" ] ) ;
t ( "Last Child" , "p:last-child" , [ "sap" ] ) ;
2010-10-22 07:48:32 +02:00
t ( "Only Child" , "#main a:only-child" , [ "simon1" , "anchor1" , "yahoo" , "anchor2" , "liveLink1" , "liveLink2" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Empty" , "ul:empty" , [ "firstUL" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Is A Parent" , "p:parent" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "First Child" , "p:first-child" , [ "firstp" , "sndp" ] ) ;
t ( "Nth Child" , "p:nth-child(1)" , [ "firstp" , "sndp" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Nth Child With Whitespace" , "p:nth-child( 1 )" , [ "firstp" , "sndp" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Not Nth Child" , "p:not(:nth-child(1))" , [ "ap" , "en" , "sap" , "first" ] ) ;
// Verify that the child position isn't being cached improperly
jQuery ( "p:first-child" ) . after ( "<div></div>" ) ;
jQuery ( "p:first-child" ) . before ( "<div></div>" ) . next ( ) . remove ( ) ;
t ( "First Child" , "p:first-child" , [ ] ) ;
2010-10-22 07:48:32 +02:00
QUnit . reset ( ) ;
2010-12-30 07:34:48 +01:00
2009-12-03 17:45:38 +01:00
t ( "Last Child" , "p:last-child" , [ "sap" ] ) ;
2010-10-22 07:48:32 +02:00
t ( "Last Child" , "#main a:last-child" , [ "simon1" , "anchor1" , "mark" , "yahoo" , "anchor2" , "simon" , "liveLink1" , "liveLink2" ] ) ;
2010-12-30 07:34:48 +01:00
2009-12-03 17:45:38 +01:00
t ( "Nth-child" , "#main form#form > *:nth-child(2)" , [ "text1" ] ) ;
t ( "Nth-child" , "#main form#form > :nth-child(2)" , [ "text1" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(-1)" , [ ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(3)" , [ "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(0n+3)" , [ "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(1n+0)" , [ "option1a" , "option1b" , "option1c" , "option1d" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(1n)" , [ "option1a" , "option1b" , "option1c" , "option1d" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(n)" , [ "option1a" , "option1b" , "option1c" , "option1d" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(+n)" , [ "option1a" , "option1b" , "option1c" , "option1d" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(even)" , [ "option1b" , "option1d" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(odd)" , [ "option1a" , "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(2n)" , [ "option1b" , "option1d" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(2n+1)" , [ "option1a" , "option1c" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(2n + 1)" , [ "option1a" , "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(+2n + 1)" , [ "option1a" , "option1c" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(3n)" , [ "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n+1)" , [ "option1a" , "option1d" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n+2)" , [ "option1b" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n+3)" , [ "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n-1)" , [ "option1b" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n-2)" , [ "option1a" , "option1d" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n-3)" , [ "option1c" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(3n+0)" , [ "option1c" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(-1n+3)" , [ "option1a" , "option1b" , "option1c" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(-n+3)" , [ "option1a" , "option1b" , "option1c" ] ) ;
2011-01-17 23:44:42 +01:00
t ( "Nth-child" , "#form select:first option:nth-child(-1n + 3)" , [ "option1a" , "option1b" , "option1c" ] ) ;
2009-12-03 17:45:38 +01:00
} ) ;
test ( "pseudo - misc" , function ( ) {
2010-10-22 07:48:32 +02:00
expect ( 7 ) ;
2009-12-03 17:45:38 +01:00
t ( "Headers" , ":header" , [ "qunit-header" , "qunit-banner" , "qunit-userAgent" ] ) ;
t ( "Has Children - :has()" , "p:has(a)" , [ "firstp" , "ap" , "en" , "sap" ] ) ;
2010-12-30 07:34:48 +01:00
2010-10-22 07:48:32 +02:00
var select = document . getElementById ( "select1" ) ;
ok ( ( window . Sizzle || window . jQuery . find ) . matchesSelector ( select , ":has(option)" ) , "Has Option Matches" ) ;
2009-12-03 17:45:38 +01:00
2010-10-22 07:48:32 +02:00
t ( "Text Contains" , "a:contains(Google)" , [ "google" , "groups" ] ) ;
t ( "Text Contains" , "a:contains(Google Groups)" , [ "groups" ] ) ;
2009-01-20 20:44:08 +01:00
2010-10-22 07:48:32 +02:00
t ( "Text Contains" , "a:contains(Google Groups (Link))" , [ "groups" ] ) ;
t ( "Text Contains" , "a:contains((Link))" , [ "groups" ] ) ;
2009-12-03 17:45:38 +01:00
} ) ;
2009-01-20 20:44:08 +01:00
2009-12-03 17:45:38 +01:00
test ( "pseudo - :not" , function ( ) {
2009-12-19 23:50:56 +01:00
expect ( 24 ) ;
2007-03-25 01:58:19 +01:00
t ( "Not" , "a.blog:not(.link)" , [ "mark" ] ) ;
2010-10-22 07:48:32 +02:00
t ( "Not - multiple" , "#form option:not(:contains(Nothing),#option1b,:selected)" , [ "option1c" , "option1d" , "option2b" , "option2c" , "option3d" , "option3e" , "option4e" , "option5b" , "option5c" ] ) ;
2007-12-13 23:24:59 +01:00
t ( "Not - recursive" , "#form option:not(:not(:selected))[id^='option3']" , [ "option3b" , "option3c" ] ) ;
2009-02-15 22:13:33 +01:00
t ( ":not() failing interior" , "p:not(.foo)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not() failing interior" , "p:not(div.foo)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not() failing interior" , "p:not(p.foo)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not() failing interior" , "p:not(#blargh)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not() failing interior" , "p:not(div#blargh)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not() failing interior" , "p:not(p#blargh)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not Multiple" , "p:not(a)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not Multiple" , "p:not(a, b)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not Multiple" , "p:not(a, b, div)" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( ":not Multiple" , "p:not(p)" , [ ] ) ;
t ( ":not Multiple" , "p:not(a,p)" , [ ] ) ;
t ( ":not Multiple" , "p:not(p,a)" , [ ] ) ;
t ( ":not Multiple" , "p:not(a,p,b)" , [ ] ) ;
t ( ":not Multiple" , ":input:not(:image,:input,:submit)" , [ ] ) ;
2009-12-19 23:50:56 +01:00
t ( "No element not selector" , ".container div:not(.excluded) div" , [ ] ) ;
2010-10-22 07:48:32 +02:00
t ( ":not() Existing attribute" , "#form select:not([multiple])" , [ "select1" , "select2" , "select5" ] ) ;
t ( ":not() Equals attribute" , "#form select:not([name=select1])" , [ "select2" , "select3" , "select4" , "select5" ] ) ;
t ( ":not() Equals quoted attribute" , "#form select:not([name='select1'])" , [ "select2" , "select3" , "select4" , "select5" ] ) ;
2009-12-19 23:50:56 +01:00
t ( ":not() Multiple Class" , "#foo a:not(.blog)" , [ "yahoo" , "anchor2" ] ) ;
t ( ":not() Multiple Class" , "#foo a:not(.link)" , [ "yahoo" , "anchor2" ] ) ;
t ( ":not() Multiple Class" , "#foo a:not(.blog.link)" , [ "yahoo" , "anchor2" ] ) ;
2009-12-03 17:45:38 +01:00
} ) ;
2010-12-30 07:34:48 +01:00
test ( "pseudo - position" , function ( ) {
2009-12-03 17:45:38 +01:00
expect ( 25 ) ;
2007-03-25 01:58:19 +01:00
t ( "nth Element" , "p:nth(1)" , [ "ap" ] ) ;
t ( "First Element" , "p:first" , [ "firstp" ] ) ;
t ( "Last Element" , "p:last" , [ "first" ] ) ;
t ( "Even Elements" , "p:even" , [ "firstp" , "sndp" , "sap" ] ) ;
t ( "Odd Elements" , "p:odd" , [ "ap" , "en" , "first" ] ) ;
t ( "Position Equals" , "p:eq(1)" , [ "ap" ] ) ;
t ( "Position Greater Than" , "p:gt(0)" , [ "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Position Less Than" , "p:lt(3)" , [ "firstp" , "ap" , "sndp" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Check position filtering" , "div#nothiddendiv:eq(0)" , [ "nothiddendiv" ] ) ;
t ( "Check position filtering" , "div#nothiddendiv:last" , [ "nothiddendiv" ] ) ;
t ( "Check position filtering" , "div#nothiddendiv:not(:gt(0))" , [ "nothiddendiv" ] ) ;
t ( "Check position filtering" , "#foo > :not(:first)" , [ "en" , "sap" ] ) ;
t ( "Check position filtering" , "select > :not(:gt(2))" , [ "option1a" , "option1b" , "option1c" ] ) ;
t ( "Check position filtering" , "select:lt(2) :not(:first)" , [ "option1b" , "option1c" , "option1d" , "option2a" , "option2b" , "option2c" , "option2d" ] ) ;
t ( "Check position filtering" , "div.nothiddendiv:eq(0)" , [ "nothiddendiv" ] ) ;
t ( "Check position filtering" , "div.nothiddendiv:last" , [ "nothiddendiv" ] ) ;
t ( "Check position filtering" , "div.nothiddendiv:not(:lt(0))" , [ "nothiddendiv" ] ) ;
t ( "Check element position" , "div div:eq(0)" , [ "nothiddendivchild" ] ) ;
t ( "Check element position" , "div div:eq(5)" , [ "t2037" ] ) ;
2009-12-19 23:50:56 +01:00
t ( "Check element position" , "div div:eq(28)" , [ "hide" ] ) ;
2009-12-03 17:45:38 +01:00
t ( "Check element position" , "div div:first" , [ "nothiddendivchild" ] ) ;
t ( "Check element position" , "div > div:first" , [ "nothiddendivchild" ] ) ;
t ( "Check element position" , "#dl div:first div:first" , [ "foo" ] ) ;
t ( "Check element position" , "#dl div:first > div:first" , [ "foo" ] ) ;
t ( "Check element position" , "div#nothiddendiv:first > div:first" , [ "nothiddendivchild" ] ) ;
} ) ;
2009-12-08 00:33:14 +01:00
if ( ( window . Sizzle || jQuery . find ) . selectors . filters . visibility ) {
2009-12-03 17:45:38 +01:00
test ( "pseudo - visibility" , function ( ) {
2009-12-03 18:26:25 +01:00
expect ( 11 ) ;
2009-12-03 17:45:38 +01:00
2009-02-16 16:52:15 +01:00
t ( "Is Visible" , "#form input:visible" , [ ] ) ;
2009-09-29 23:40:17 +02:00
t ( "Is Visible" , "div:visible:not(#qunit-testrunner-toolbar):lt(2)" , [ "nothiddendiv" , "nothiddendivchild" ] ) ;
2009-02-18 20:43:14 +01:00
t ( "Is Hidden" , "#form input:hidden" , [ "text1" , "text2" , "radio1" , "radio2" , "check1" , "check2" , "hidden1" , "hidden2" , "name" , "search" ] ) ;
2009-02-16 16:52:15 +01:00
t ( "Is Hidden" , "#main:hidden" , [ "main" ] ) ;
t ( "Is Hidden" , "#dl:hidden" , [ "dl" ] ) ;
2009-12-03 18:26:25 +01:00
var $div = jQuery ( '<div/>' ) . appendTo ( "body" ) ;
2009-05-04 02:19:57 +02:00
$div . css ( { fontSize : 0 , lineHeight : 0 } ) ; // IE also needs to set font-size and line-height to 0
2009-03-18 18:55:07 +01:00
$div . width ( 1 ) . height ( 0 ) ;
t ( "Is Visible" , '#nothiddendivchild:visible' , [ 'nothiddendivchild' ] ) ;
t ( "Is Not Visible" , '#nothiddendivchild:hidden' , [ ] ) ;
$div . width ( 0 ) . height ( 1 ) ;
t ( "Is Visible" , '#nothiddendivchild:visible' , [ 'nothiddendivchild' ] ) ;
t ( "Is Not Visible" , '#nothiddendivchild:hidden' , [ ] ) ;
$div . width ( 1 ) . height ( 1 ) ;
t ( "Is Visible" , '#nothiddendivchild:visible' , [ 'nothiddendivchild' ] ) ;
t ( "Is Not Visible" , '#nothiddendivchild:hidden' , [ ] ) ;
2009-12-03 18:26:25 +01:00
$div . remove ( ) ;
2009-12-03 17:45:38 +01:00
} ) ;
2009-12-08 00:31:25 +01:00
}
2009-01-19 19:09:11 +01:00
2009-12-03 17:45:38 +01:00
test ( "pseudo - form" , function ( ) {
expect ( 8 ) ;
2009-01-19 19:09:11 +01:00
2010-10-22 07:48:32 +02:00
t ( "Form element :input" , "#form :input" , [ "text1" , "text2" , "radio1" , "radio2" , "check1" , "check2" , "hidden1" , "hidden2" , "name" , "search" , "button" , "area1" , "select1" , "select2" , "select3" , "select4" , "select5" ] ) ;
2007-09-05 19:06:05 +02:00
t ( "Form element :radio" , "#form :radio" , [ "radio1" , "radio2" ] ) ;
t ( "Form element :checkbox" , "#form :checkbox" , [ "check1" , "check2" ] ) ;
2009-02-19 22:35:33 +01:00
t ( "Form element :text" , "#form :text:not(#search)" , [ "text1" , "text2" , "hidden2" , "name" ] ) ;
2007-09-05 19:06:05 +02:00
t ( "Form element :radio:checked" , "#form :radio:checked" , [ "radio2" ] ) ;
t ( "Form element :checkbox:checked" , "#form :checkbox:checked" , [ "check1" ] ) ;
2009-02-14 17:59:10 +01:00
t ( "Form element :radio:checked, :checkbox:checked" , "#form :radio:checked, #form :checkbox:checked" , [ "radio2" , "check1" ] ) ;
2007-08-31 07:43:24 +02:00
2010-10-22 07:48:32 +02:00
t ( "Selected Option Element" , "#form option:selected" , [ "option1a" , "option2d" , "option3b" , "option3c" , "option4b" , "option4c" , "option4d" , "option5a" ] ) ;
2007-04-28 17:39:30 +02:00
} ) ;