2007-03-25 01:58:19 +01:00
module ( "selector" ) ;
test ( "element" , function ( ) {
2009-02-17 18:43:05 +01:00
expect ( 18 ) ;
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" ) ;
2009-02-15 19:20:01 +01:00
isSet ( jQuery ( "p" , document . getElementsByTagName ( "div" ) ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
isSet ( jQuery ( "p" , "div" ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
isSet ( jQuery ( "p" , jQuery ( "div" ) ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a context." ) ;
isSet ( jQuery ( "div" ) . find ( "p" ) , q ( "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ) , "Finding elements with a 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' ) ;
2009-02-14 17:59:10 +01:00
// Check for unique-ness and sort order
2009-02-17 18:43:05 +01:00
isSet ( jQuery ( "*" ) , jQuery ( "*, *" ) , "Check for duplicates: *, *" ) ;
2009-02-14 17:59:10 +01:00
isSet ( jQuery ( "p" ) , jQuery ( "p, div p" ) , "Check for duplicates: p, div p" ) ;
t ( "Checking sort order" , "h2, h1" , [ "header" , "banner" , "userAgent" ] ) ;
2009-02-14 19:10:45 +01:00
t ( "Checking sort order" , "h2:first, h1:first" , [ "header" , "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" ] ) ;
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 ( ) {
2009-02-16 19:23:59 +01:00
expect ( 7 ) ;
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" ) ;
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 ( ) {
2009-02-15 23:46:54 +01:00
expect ( 28 ) ;
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" ) ;
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
isSet ( jQuery ( ".blog" , document . getElementsByTagName ( "p" ) ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
isSet ( jQuery ( ".blog" , "p" ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
isSet ( jQuery ( ".blog" , jQuery ( "p" ) ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
isSet ( jQuery ( "p" ) . find ( ".blog" ) , q ( "mark" , "simon" ) , "Finding elements with a context." ) ;
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" ) ;
div . innerHTML = "<div class='test e'></div><div class='test'></div>" ;
isSet ( jQuery ( ".e" , div ) , [ div . firstChild ] , "Finding a second class." ) ;
div . lastChild . className = "e" ;
isSet ( jQuery ( ".e" , div ) , [ 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 ( ) {
2009-02-15 23:33:19 +01:00
expect ( 11 ) ;
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" ] )
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" ) ;
2009-02-15 23:33:19 +01:00
var a = jQuery ( '<a id="tName1ID" name="tName1">tName1 A</a><a id="tName2ID" name="tName2">tName2 A</a><div id="tName1">tName1 Div</div>' ) . appendTo ( '#main' ) ;
t ( "Find elements that have similar IDs" , "[name=tName1]" , [ "tName1ID" ] ) ;
t ( "Find elements that have similar IDs" , "[name=tName2]" , [ "tName2ID" ] ) ;
a . remove ( ) ;
2009-01-05 01:21:13 +01:00
} ) ;
2007-03-25 01:58:19 +01:00
test ( "multiple" , function ( ) {
expect ( 4 ) ;
2008-12-20 02:19:17 +01:00
2009-01-21 23:57:07 +01:00
t ( "Comma Support" , "h2, p" , [ "banner" , "userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Comma Support" , "h2 , p" , [ "banner" , "userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Comma Support" , "h2 , p" , [ "banner" , "userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
t ( "Comma Support" , "h2,p" , [ "banner" , "userAgent" , "firstp" , "ap" , "sndp" , "en" , "sap" , "first" ] ) ;
2007-03-25 01:58:19 +01:00
} ) ;
test ( "child and adjacent" , function ( ) {
2009-02-16 18:58:33 +01:00
expect ( 49 ) ;
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" ] ) ;
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" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Comma, Child, and Adjacent" , "a + a, code > a" , [ "groups" , "anchor1" , "anchor2" ] ) ;
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" , [ ] ) ;
t ( "No element not selector" , ".container div:not(.excluded) div" , [ ] ) ;
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" ] ) ;
2009-02-16 18:58:33 +01:00
t ( "Not Nth Child" , "p:not(:nth-child(1))" , [ "ap" , "en" , "sap" , "first" ] ) ;
2009-01-21 23:01:50 +01:00
// 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" , [ ] ) ;
reset ( ) ;
2007-03-25 04:45:12 +02:00
t ( "Last Child" , "p:last-child" , [ "sap" ] ) ;
2009-02-10 00:29:57 +01:00
t ( "Last Child" , "a:last-child" , [ "simon1" , "anchor1" , "mark" , "yahoo" , "anchor2" , "simon" , "liveLink1" , "liveLink2" ] ) ;
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-02-14 18:13:08 +01:00
expect ( 37 ) ;
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" ] ) ;
2009-02-09 16:18:07 +01:00
jQuery ( "form input" ) [ 0 ] . test = 0 ;
jQuery ( "form input" ) [ 1 ] . test = 1 ;
2009-02-14 18:13:08 +01:00
// Disabled tests - expandos don't work in all browsers
//t( "Expando attribute", "form input[test]", ["text1", "text2"] );
//t( "Expando attribute value", "form input[test=0]", ["text1"] );
//t( "Expando attribute value", "form input[test=1]", ["text2"] );
2008-12-20 02:19:17 +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" ] ) ;
2008-12-20 02:19:17 +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" ] ) ;
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" ] ) ;
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
t ( "Empty values" , "#select1 option[value='']" , [ "option1a" ] ) ;
t ( "Empty values" , "#select1 option[value!='']" , [ "option1b" , "option1c" , "option1d" ] ) ;
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 ( ) {
2009-03-18 18:55:07 +01:00
expect ( 78 ) ;
2007-03-25 01:58:19 +01:00
t ( "First Child" , "p:first-child" , [ "firstp" , "sndp" ] ) ;
t ( "Last Child" , "p:last-child" , [ "sap" ] ) ;
2009-02-10 00:29:57 +01:00
t ( "Only Child" , "a:only-child" , [ "simon1" , "anchor1" , "yahoo" , "anchor2" , "liveLink1" , "liveLink2" ] ) ;
2007-03-25 01:58:19 +01:00
t ( "Empty" , "ul:empty" , [ "firstUL" ] ) ;
2009-02-18 20:43:14 +01:00
t ( "Enabled UI Element" , "#form input:not([type=hidden]):enabled" , [ "text1" , "radio1" , "radio2" , "check1" , "check2" , "hidden2" , "name" , "search" ] ) ;
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-20 20:44:08 +01:00
t ( "Text Contains" , "a:contains('Google Groups (Link)')" , [ "groups" ] ) ;
t ( "Text Contains" , "a:contains('(Link)')" , [ "groups" ] ) ;
2009-02-17 16:58:11 +01:00
t ( "Element Preceded By" , "p ~ div" , [ "foo" , "moretests" , "tabindex-tests" , "liveHandlerOrder" ] ) ;
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" ] ) ;
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)" , [ ] ) ;
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" ] ) ;
2009-02-16 16:52:15 +01:00
t ( "Is Visible" , "#form input:visible" , [ ] ) ;
2009-02-17 16:58:11 +01:00
t ( "Is Visible" , "div:visible:not(.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-03-18 18:55:07 +01:00
var $div = jQuery ( '#nothiddendivchild' ) ;
$div . width ( 0 ) . height ( 0 ) ;
t ( "Is Hidden" , '#nothiddendivchild:hidden' , [ 'nothiddendivchild' ] ) ;
t ( "Is Not Hidden" , '#nothiddendivchild:visible' , [ ] ) ;
$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' , [ ] ) ;
$div . width ( '' ) . height ( '' ) ;
2009-01-19 19:09:11 +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" ] ) ;
2009-01-22 01:11:11 +01:00
t ( "Check position filtering" , "div.nothiddendiv:not(:lt(0))" , [ "nothiddendiv" ] ) ;
2009-01-19 19:09:11 +01:00
t ( "Check element position" , "div div:eq(0)" , [ "nothiddendivchild" ] ) ;
2009-02-17 16:58:11 +01:00
t ( "Check element position" , "div div:eq(5)" , [ "t2037" ] ) ;
t ( "Check element position" , "div div:eq(27)" , [ "hide" ] ) ;
2009-01-19 19:09:11 +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" ] ) ;
2007-09-05 19:06:05 +02:00
2009-02-18 20:43:14 +01:00
t ( "Form element :input" , "#form :input" , [ "text1" , "text2" , "radio1" , "radio2" , "check1" , "check2" , "hidden1" , "hidden2" , "name" , "search" , "button" , "area1" , "select1" , "select2" , "select3" ] ) ;
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
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
} ) ;