2007-03-25 01:58:19 +01:00
module ( "selector" ) ;
test ( "element" , function ( ) {
2007-08-19 09:28:41 +02:00
expect ( 9 ) ;
2009-01-13 17:40:19 +01:00
reset ( ) ;
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" ) ;
2007-03-25 20:06:18 +02: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' ) ;
2007-03-25 01:58:19 +01:00
} ) ;
2007-07-30 04:52:24 +02:00
if ( location . protocol != "file:" ) {
test ( "Element Selector with underscore" , function ( ) {
expect ( 1 ) ;
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" ) ;
2007-07-30 04:52:24 +02:00
start ( ) ;
} ) ;
} ) ;
}
2007-03-25 01:58:19 +01:00
test ( "broken" , function ( ) {
expect ( 7 ) ;
2008-12-20 02:19:17 +01:00
function broken ( name , selector ) {
try {
2009-01-05 21:43:58 +01:00
jQuery ( selector ) ;
2008-12-20 02:19:17 +01:00
} catch ( e ) {
ok ( typeof e === "string" && e . indexOf ( "Syntax error" ) >= 0 ,
name + ": " + selector ) ;
}
}
2009-01-13 17:40:19 +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" , "{}" , [ ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "id" , function ( ) {
2007-08-27 06:58:02 +02:00
expect ( 25 ) ;
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 > #台北" , [ "台北" ] ) ;
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" ] ) ;
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" , [ ] ) ;
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 > *" , [ ] ) ;
2007-03-25 01:58:19 +01:00
2008-05-29 01:18:25 +02:00
jQuery ( '<a name="tName1">tName1 A</a><a name="tName2">tName2 A</a><div id="tName1">tName1 Div</div>' ) . appendTo ( '#main' ) ;
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" ) ;
2007-05-13 19:20:03 +02:00
t ( "ID Selector on Form with an input that has a name of 'id'" , "#lengthtest" , [ "lengthtest" ] ) ;
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
2008-05-29 01:18:25 +02:00
isSet ( jQuery ( "body" ) . find ( "div#form" ) , [ ] , "ID selector within the context of another element" ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "class" , function ( ) {
2008-12-20 02:19:17 +01:00
expect ( 15 ) ;
2007-03-25 01:58:19 +01:00
t ( "Class Selector" , ".blog" , [ "mark" , "simon" ] ) ;
t ( "Class Selector" , ".blog.link" , [ "simon" ] ) ;
t ( "Class Selector w/ Element" , "a.blog" , [ "mark" , "simon" ] ) ;
t ( "Parent Class Selector" , "p .blog" , [ "mark" , "simon" ] ) ;
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" ] ) ;
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" ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
2009-01-05 01:21:13 +01:00
test ( "name" , function ( ) {
expect ( 7 ) ;
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" ] ) ;
t ( "Name selector non-input" , "*[name=iframe]" , [ "iframe" ] ) ;
t ( "Name selector for grouped input" , "input[name='types[]']" , [ "types_all" , "types_anime" , "types_movie" ] )
isSet ( jQuery ( "#form" ) . find ( "input[name=action]" ) , q ( "text1" ) , "Name selector within the context of another element" ) ;
isSet ( jQuery ( "#form" ) . find ( "input[name='foo[bar]']" ) , q ( "hidden2" ) , "Name selector for grouped form element within the context of another element" ) ;
} ) ;
2007-03-25 01:58:19 +01:00
test ( "multiple" , function ( ) {
expect ( 4 ) ;
2008-12-20 02:19:17 +01:00
var results = [ "mark" , "simon" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ;
if ( document . querySelectorAll ) {
results = [ "firstp" , "ap" , "mark" , "sndp" , "en" , "sap" , "simon" , "first" ] ;
}
t ( "Comma Support" , "a.blog, p" , results ) ;
t ( "Comma Support" , "a.blog , p" , results ) ;
t ( "Comma Support" , "a.blog ,p" , results ) ;
t ( "Comma Support" , "a.blog,p" , results ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "child and adjacent" , function ( ) {
2009-01-13 17:40:19 +01:00
expect ( 41 ) ;
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" ] ) ;
t ( "Adjacent" , "a + a" , [ "groups" ] ) ;
t ( "Adjacent" , "a +a" , [ "groups" ] ) ;
t ( "Adjacent" , "a+ a" , [ "groups" ] ) ;
t ( "Adjacent" , "a+a" , [ "groups" ] ) ;
t ( "Adjacent" , "p + p" , [ "ap" , "en" , "sap" ] ) ;
t ( "Comma, Child, and Adjacent" , "a + a, code > a" , [ "groups" , "anchor1" , "anchor2" ] ) ;
2009-01-05 01:21:13 +01:00
2009-01-13 17:40:19 +01:00
isSet ( jQuery ( "> :first" , document . getElementById ( "nothiddendiv" ) ) , q ( "nothiddendivchild" ) , "Verify child context positional selctor" ) ;
isSet ( jQuery ( "> :eq(0)" , document . getElementById ( "nothiddendiv" ) ) , q ( "nothiddendivchild" ) , "Verify child context positional selctor" ) ;
isSet ( jQuery ( "> *:first" , document . getElementById ( "nothiddendiv" ) ) , q ( "nothiddendivchild" ) , "Verify child context positional selctor" ) ;
2009-01-05 01:21:13 +01:00
t ( "Non-existant ancestors" , ".fototab > .thumbnails > a" , [ ] ) ;
2007-03-25 04:45:12 +02:00
2007-03-25 01:58:19 +01:00
t ( "First Child" , "p:first-child" , [ "firstp" , "sndp" ] ) ;
2007-03-25 04:45:12 +02:00
t ( "Nth Child" , "p:nth-child(1)" , [ "firstp" , "sndp" ] ) ;
t ( "Last Child" , "p:last-child" , [ "sap" ] ) ;
2007-06-29 22:26:14 +02:00
t ( "Last Child" , "a:last-child" , [ "simon1" , "anchor1" , "mark" , "yahoo" , "anchor2" , "simon" ] ) ;
2007-03-25 04:45:12 +02:00
2009-01-13 17:40:19 +01:00
t ( "Nth-child" , "#main form#form > *:nth-child(2)" , [ "text1" ] ) ;
t ( "Nth-child" , "#main form#form > :nth-child(2)" , [ "text1" ] ) ;
2007-11-16 20:01:53 +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" ] ) ;
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" ] ) ;
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" ] ) ;
t ( "Nth-child" , "#form select:first option:nth-child(-n+3)" , [ "option1a" , "option1b" , "option1c" ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "attributes" , function ( ) {
2009-01-13 17:40:19 +01:00
expect ( 27 ) ;
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" ] ) ;
2007-03-25 01:58:19 +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" ] ) ;
2008-12-20 02:19:17 +01:00
var results = [ "hidden1" , "radio1" , "radio2" ] ;
if ( document . querySelectorAll ) {
results = [ "radio1" , "radio2" , "hidden1" ] ;
}
t ( "Multiple Attribute Equals" , "#form input[type='hidden'],#form input[type='radio']" , results ) ;
t ( "Multiple Attribute Equals" , "#form input[type=\"hidden\"],#form input[type='radio']" , results ) ;
t ( "Multiple Attribute Equals" , "#form input[type=hidden],#form input[type=radio]" , results ) ;
2007-03-25 01:58:19 +01:00
2007-09-04 04:55:38 +02:00
t ( "Attribute selector using UTF8" , "span[lang=中文]" , [ "台北" ] ) ;
2007-03-25 01:58:19 +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" ] ) ;
2007-03-25 01:58:19 +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" ] ) ;
2007-03-25 01:58:19 +01:00
2007-09-04 04:55:38 +02:00
t ( "Grouped Form Elements" , "input[name='foo[bar]']" , [ "hidden2" ] ) ;
2007-03-25 01:58:19 +01:00
2007-09-05 19:06:05 +02:00
t ( ":not() Existing attribute" , "#form select:not([multiple])" , [ "select1" , "select2" ] ) ;
t ( ":not() Equals attribute" , "#form select:not([name=select1])" , [ "select2" , "select3" ] ) ;
t ( ":not() Equals quoted attribute" , "#form select:not([name='select1'])" , [ "select2" , "select3" ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
2007-03-25 04:45:12 +02:00
test ( "pseudo (:) selectors" , function ( ) {
2008-12-20 02:19:17 +01:00
expect ( 34 ) ;
2007-03-25 01:58:19 +01:00
t ( "First Child" , "p:first-child" , [ "firstp" , "sndp" ] ) ;
t ( "Last Child" , "p:last-child" , [ "sap" ] ) ;
t ( "Only Child" , "a:only-child" , [ "simon1" , "anchor1" , "yahoo" , "anchor2" ] ) ;
t ( "Empty" , "ul:empty" , [ "firstUL" ] ) ;
2008-12-20 02:19:17 +01:00
t ( "Enabled UI Element" , "#form input:not([type=hidden]):enabled" , [ "text1" , "radio1" , "radio2" , "check1" , "check2" , "hidden2" , "name" ] ) ;
2007-09-05 19:06:05 +02:00
t ( "Disabled UI Element" , "#form input:disabled" , [ "text2" ] ) ;
t ( "Checked UI Element" , "#form input:checked" , [ "radio2" , "check1" ] ) ;
t ( "Selected Option Element" , "#form option:selected" , [ "option1a" , "option2d" , "option3b" , "option3c" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Text Contains" , "a:contains('Google')" , [ "google" , "groups" ] ) ;
t ( "Text Contains" , "a:contains('Google Groups')" , [ "groups" ] ) ;
2009-01-05 18:34:42 +01:00
t ( "Element Preceded By" , "p ~ div" , [ "foo" , "fx-queue" , "fx-tests" , "moretests" , "tabindex-tests" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Not" , "a.blog:not(.link)" , [ "mark" ] ) ;
2008-07-23 19:00:32 +02:00
t ( "Not - multiple" , "#form option:not(:contains('Nothing'),#option1b,:selected)" , [ "option1c" , "option1d" , "option2b" , "option2c" , "option3d" , "option3e" ] ) ;
2008-12-20 02:19:17 +01:00
//t( "Not - complex", "#form option:not([id^='opt']:nth-child(-n+3))", [ "option1a", "option1d", "option2d", "option3d", "option3e"] );
2007-12-13 23:24:59 +01:00
t ( "Not - recursive" , "#form option:not(:not(:selected))[id^='option3']" , [ "option3b" , "option3c" ] ) ;
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" ] ) ;
t ( "Is A Parent" , "p:parent" , [ "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
2007-09-05 19:06:05 +02:00
t ( "Is Visible" , "#form input:visible" , [ "text1" , "text2" , "radio1" , "radio2" , "check1" , "check2" , "name" ] ) ;
t ( "Is Hidden" , "#form input:hidden" , [ "hidden1" , "hidden2" ] ) ;
t ( "Form element :input" , "#form :input" , [ "text1" , "text2" , "radio1" , "radio2" , "check1" , "check2" , "hidden1" , "hidden2" , "name" , "button" , "area1" , "select1" , "select2" , "select3" ] ) ;
t ( "Form element :radio" , "#form :radio" , [ "radio1" , "radio2" ] ) ;
t ( "Form element :checkbox" , "#form :checkbox" , [ "check1" , "check2" ] ) ;
t ( "Form element :text" , "#form :text" , [ "text1" , "text2" , "hidden2" , "name" ] ) ;
t ( "Form element :radio:checked" , "#form :radio:checked" , [ "radio2" ] ) ;
t ( "Form element :checkbox:checked" , "#form :checkbox:checked" , [ "check1" ] ) ;
t ( "Form element :checkbox:checked, :radio:checked" , "#form :checkbox:checked, #form :radio:checked" , [ "check1" , "radio2" ] ) ;
2007-08-31 07:43:24 +02:00
t ( "Headers" , ":header" , [ "header" , "banner" , "userAgent" ] ) ;
2007-09-04 04:55:38 +02:00
t ( "Has Children - :has()" , "p:has(a)" , [ "firstp" , "ap" , "en" , "sap" ] ) ;
2007-04-28 17:39:30 +02:00
} ) ;