var arrayAssert = YAHOO.util.ArrayAssert,
	assert = YAHOO.util.Assert,
	css3TestSuite = new YAHOO.tool.TestSuite("CSS Selector Tests"),
	showTODO = true;

// ID tests
var testCaseId =  new YAHOO.tool.TestCase( {
	name : "ID Tests",	
	testId : function() {		
		var r = $( "#loadediframe", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));				
		arrayAssert.itemsAreEqual( ["loadediframe"], a, "#loadediframe Should contain element with id === loadediframe");				
	},
	testIdWithElementBody : function() {		 
	 	var r = $("#body");
	 	var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));						
 		arrayAssert.itemsAreEqual( ["body"], a, "body#body Should contain element with id === body");				
	},
 	testIdWithElement1 : function() {		 
	 	var r = $("body#body")/* .elements */
	 	var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));						
 		arrayAssert.itemsAreEqual( ["body"], a, "body#body Should contain element with id === body");				
	},	
	testIdWithElement2 : function() {
		var r = $("ul#first", "#CSSTESTS")/* .elements */
	 	var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));						
		arrayAssert.itemsAreEqual( ["first"], a, "ul#first Should contain element with id === first");				
	},
	testIdWithNonExistantDescendant : function() {		
		arrayAssert.isEmpty($("#firstp #foobar", "#CSSTESTS")/* .elements */, "#firstp #foobar Should be empty");		
	},
	testIdChild : function() {	
		var r = $("#form > #radio1", "#CSSTESTS")/* .elements */
	 	var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual( ["radio1"], a, "#form > #radio1 Should contain element with id === radio1");				
	},
	testIdDescendant : function() {	
		var r = $("#firstp #simon1", "#CSSTESTS")/* .elements */
	 	var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));					
		arrayAssert.itemsAreEqual( ["simon1"], a, "#firstp #simon1 Should contain element with id === simon1");		
	},
	testIdUTF8 : function() {	
		var r = $("#台北Táiběi", "#CSSTESTS")/* .elements */
	 	var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ))		
		arrayAssert.itemsAreEqual( ["台北Táiběi"], a, "#台北Táiběi Should contain element with id === radio1");				
	},
	testIdGroupsUTF8 : function() {
		var r = $("#台北Táiběi, #台北", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ))		
		arrayAssert.itemsAreEqual(["台北Táiběi","台北"], a, "台北Táiběi","台北 Should match ['台北Táiběi','台北']");	
	},
	testIdDescendantUTF8 : function() {
		var r = $( "div #台北", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		 arrayAssert.itemsAreEqual( ["台北"] , a, "div #台北 Should match ['台北']");
	},
	testIdAllChildren : function() {		
		var r = $("#foo > *", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["sndp", "en", "sap"], a, "#foo > * Should match ['sndp', 'en', 'sap']");	
	},
	testIdNoChildren : function() {
		arrayAssert.isEmpty( $( "#firstUL > *", "#CSSTESTS" ), "#firstUL > * Should be empty");
	},
	testIdNotAChild : function() {
		arrayAssert.isEmpty( $( "#form > #option1a", "#CSSTESTS" ), "#form > #option1a Should be empty" );	
	},
	testIdNotAncestor : function() {
		arrayAssert.isEmpty( $( "#form #first", "#CSSTESTS" )/* .elements */, "#form #first Should be empty" );
	},
	testIdWithNonExistantAncestor : function(){
		arrayAssert.isEmpty( $( "#asdfasdf #foobar", "#CSSTESTS" )/* .elements */, "#asdfasdf #foobar Should be empty because ancestor does not exist.");
	},
	testIdUTF8_1 : function() {		
		var css = "form > #台北", 
		    expected = ["台北"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testIdNameSame : function() {		
		var css = "#tName1", 
		    expected = ['tName1'],
		    r = $(css)/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testIdDoesntExistButNameDoes : function() {		
		var css = "#tName2", 		    
		    r = $(css);
		arrayAssert.isEmpty(r, " Should be empty"); 
	}
} );

// Class tests
var testCaseClass = new YAHOO.tool.TestCase( {
	name : "Class Tests",	
	testClass : function() {
		var r = $( ".blog", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["mark","simon"], a, ".blog Should match ['mark','simon']");		
	},
	testClass_2 : function() {
		var r = $( ".blog.link", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["simon"], a, ".blog.link Should match ['simon']");			
	},
	testClassElement : function() {
		var r = $( "a.blog", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["mark","simon"], a, "a.blog Should match ['mark','simon']");			
	},
	testClassParent : function() {
		var r = $( "p .blog", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["simon","mark"], a, "p blog Should match ['simon','mark']");			
	},
	testClassUTF8 : function() {
		var r = $( ".台北Táiběi", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["utf8class1"], a, ".台北Táiběi Should match ['utf8class1']");			
	},
	testClassUTF8_2 : function() {
		var r = $( ".台北", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		
		// there is a bug in opera that fails this test ( it only returns utf8class2.
		// this is in element.getElementByClassName. It seems to occur only with utf8 and an element with more than one class.	
		if( !/opera/i.test( navigator.userAgent ) )
			arrayAssert.itemsAreEqual(["utf8class1","utf8class2"], a, ".台北 Should match ['utf8class1','utf8class2']" + " - " + a);			
	},
	testClassUTF8_3 : function() {
		var r = $( ".台北Táiběi.台北", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		// there is a bug in opera that fails this test ( it only returns utf8class2.
		// this is in element.getElementByClassName. It seems to occur only with utf8 and an element with more than one class.
		if( !/opera/i.test( navigator.userAgent ) )
			arrayAssert.itemsAreEqual(["utf8class1"], a, ".台北Táiběi.台北 Should match ['utf8class1']" + " - " + a);			
	},
	testClassGroupsUTF8 : function() { 		
		var r = $( ".台北Táiběi, .台北", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["utf8class1","utf8class2"], a, ".台北Táiběi, .台北 Should match ['utf8class2','utf8class1']");			
 	},
	testClassDescendantUTF8 : function() { 				
		var r = $( "div .台北Táiběi", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["utf8class1"], a, "div .台北Táiběi Should match ['utf8class1']");			
	},
	testClassChildUTF8 : function() { 				
		var r = $( "form > .台北Táiběi", "#CSSTESTS" )/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));			
		arrayAssert.itemsAreEqual(["utf8class1"], a, "form > .台北Táiběi Should match ['utf8class1']");			
	}
} );

// Tag Name
var testCaseTagName = new YAHOO.tool.TestCase( {
	name: "TagName Tests",
	testTagName_P : function() {	
		var r = $("*", "#CSSTESTS")/* .elements */;
		arrayAssert.itemsAreEqual(30, a.length, "there are 30 items");				
	},
	testTagName_P : function() {	
		var r = $("p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["firstp","ap","sndp","en","sap","first"], a, "p Should match ['firstp','ap','sndp','en','sap','first']");				
	},
	testTagName_body : function() {	
		var r = $("body")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["body"], a, "body Should match " + ["body"]);				
	},
	testTagName_html : function() {	
		var r = $("html")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["html"], a, "html Should match " + ["html"]);				
	},
	testTagNameDescendant : function() {		
		var r = $("div p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["sndp", "en", "sap", "firstp","ap", "first"], a, "div p Should match " + ["sndp", "en", "sap", "firstp","ap", "first"]);		
	},
	testTagNameNonStandardName : function() {		
		var r = $("foo_bar", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(['foobar'], a, "div p Should match " + ['foobar']);		
	},
	testTagNameParam : function() {
		var r = $("param", "#object1")/* .elements */;
		arrayAssert.itemsAreEqual(2, r.length, "there are 2 items");				
	}	
} );

// Attribute
var testCaseAttribute = new YAHOO.tool.TestCase( {
	name: "Attribute Tests",
	testAttributeExists : function() {
		var css = "a[title]", 
		    expected = ["google"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));						
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeExists2 : function() {		
		var css = "*[title]", 
		    expected = ["google"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeExists3 : function() {		
		var css = "[title]"
		    expected = ["google"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEquals : function() {		
		var css = "a[rel='bookmark']", 
		    expected = ["simon1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEquals2 : function() {		
		var css = "a[rel=bookmark]", 
		    expected = ["simon1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEquals3 : function() {
		var css = "#form input[type='hidden'],#form input[type='radio']", 
		    expected = ["hidden1","radio2","radio1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEquals4 : function() {
		var css = "#form input[type=\"hidden\"],#form input[type='radio']", 
		    expected = ["hidden1","radio2","radio1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEquals5 : function() {
		var css = "#form input[type=hidden],#form input[type=radio]", 
		    expected = ["hidden1","radio2","radio1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEqualsUTF8 : function() {
		var css = "span[lang=中文]", 
		    expected = ["台北"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeBegins : function() {
		var css = "a[href ^= 'http://www']", 
		    expected = ["yahoo","google"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeEnds : function() {
		var css = "a[href $= 'org/']", 
		    expected = ["mark"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeContains : function() {
		var css = "a[href *= 'google']", 
		    expected = ["groups", "google"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeSelected : function() {
		var css = "#select1 option:selected", 
		    expected = ["option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeSelected2 : function() {
		var css = "#select2 option:selected", 
		    expected = ["option2d"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeSelected3 : function() {
		var css = "#select3 option:selected", 
		    expected = ["option3c", "option3b"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeGroupForm : function() {
		if(showTODO) 
			return true
		else
			assert.fail("TODO: implement escaped characters");
			
		var css = "input[name='foo[bar]']", 
		    expected = ["hidden2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testAttributeNotExisting : function() {		
		var css = "#form select:not([multiple])", 
		    expected = ["select2", "select1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected + " - " + a);
	},
	testAttributeNotEquals : function() {
		var css = "#form select:not([name=select1])",
		    expected =  ["select3", "select2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected + " - " + a);
	},
	testAttributeNotEqualsQuated : function() {
		var css = "#form select:not([name='select1'])",
		    expected = ["select3", "select2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected + " - " + a);
	}
} );

// Pseudos
var testCasePseudo = new YAHOO.tool.TestCase( {
	name: "Pseudos Tests",
	testPsuedoFirstChild : function() {		
		var css = "p:first-child", 
		    expected = ["sndp","firstp"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoLastChild : function() {		
		var css = "p:last-child", 
		    expected = ["sap"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoOnlyChild : function() {		
		var css = "a:only-child", 
		    expected = ["anchor2","yahoo","anchor1","simon1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoEmpty : function() {		
		var css = "ul:empty",  
		    expected = ["firstUL"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoEnabled: function() {				
		var css = "#form input:enabled", 
		    expected = ["name","hidden2","check2","check1","radio2","radio1","text1"];
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoDisabled : function() {				
		var css = "#form input:disabled", 
		    expected = ["text2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoChecked : function() {					
		var css = "#form input:checked", 
		    expected = ["check1","radio2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoSelected : function() {
		var css = "#form option:selected", 
		    expected = ["option3c","option3b","option2d","option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoContains : function() {						
		var css = "a:contains('Google')", 
		    expected = ["groups","google"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoContains2 : function() {							
		var css = "a:contains('Google Groups')", 
		    expected = ["groups"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoPreceded : function() {
		var css = "p ~ div",
		    expected =  ["foo","fx-queue","fx-tests", "moretests"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoNot : function() {				
		var css = "a.blog:not(.link)", 
		    expected =  ["mark"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected + " - " + a);
	},
	testPsuedoNotMultiple : function() {
		var css = "#form option:not(:contains('Nothing'),#option1b,:selected)", 
			expected =  ["option3e", "option3d", "option2c", "option2b", "option1d", "option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected  + " - " + a);
	},
	testPsuedoNotComplex : function() {				
		var css = "#form option:not([id^='opt']:nth-child(-n+3))", 
		    expected =  [ "option3e", "option3d", "option2d", "option1d"],  
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected  + " - " + a);
	},
	testPsuedoNotRecursive : function() {				
		var css = "#form option:not(:not(:selected))[id^='option3']", 
		    expected =  [ "option3b", "option3c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected  + " - " + a);
	},
	testPsuedoNth : function() {
		var css = "p:nth(1)", 
		    expected =  ["ap"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFirst : function() {
		var css = "p:first", 
		    expected =  ["firstp"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoLast : function() {
		var css = "p:last", 
		    expected =  ["first"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoEven : function() {
		var css = "p:even", 
		    expected =  ["sap","sndp","firstp"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoOdd : function() {
		var css = "p:odd", 
		    expected =  ["first", "en", "ap"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoPosEq : function() {
		var css = "p:eq(1)", 
		    expected =  ["ap"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoPosGt : function() {
		var css = "p:gt(0)", 
		    expected =  ["first","sap","en","sndp", "ap"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoPosLt : function() {
		var css = "p:lt(3)", 
		    expected =  ["sndp","ap","firstp"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoIsParent : function() {	
		var css = "p:parent", 		    
		    expected = ["first","sap","en","sndp","ap","firstp"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoVisible : function() {
		var css = "#form input:visible", 
		    expected = ["name","check2","check1","radio2","radio1","text2","text1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoHidden : function() {
		var css = "#form input:hidden", 
		    expected =  ["hidden2","hidden1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormInput : function() {	
		var css = "#form :input", 
		    expected =  ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "button", "area1", "select1", "select2", "select3"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		    expected = expected.reverse();
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormRadio : function() {
		var css = "#form :radio", 
		    expected =  ["radio2", "radio1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormCheckbox : function() {
		var css = "#form :checkbox", 
		    expected =  ["check2", "check1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormText : function() {
		var css = "#form :text", 
		    expected =  ["name","hidden2","text2","text1"],//["text1", "text2", "hidden2", "name"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormRadioChecked : function() {		
		var css = "#form :radio:checked", 
		    expected =  ["radio2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormCheckboxChecked : function() {
		var css = "#form :checkbox:checked", 
		    expected =  ["check1"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoFormCheckboxChecked2 : function() {
		var css = "#form :checkbox:checked, #form :radio:checked", 
		    expected =  ["check1", "radio2"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoHeader : function() {	
		var css = ":header", 
		    expected =  ["userAgent","banner","header"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testPsuedoHas : function() {		
		var css = "p:has(a)", 
		    expected =  ["sap","en","ap","firstp"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected + " - " + a);
	}
} );

// Combinators
var testCaseCombinator = new YAHOO.tool.TestCase( {
	name: "Combinators Tests",
	testChild : function() {				
		var r = $("p > a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["simon","yahoo","google","groups","mark","simon1"], a, "p > a Should match " + ["simon","yahoo","google","groups","mark","simon1"]);		
	},
	testChild2 : function() {				
		var r = $("p> a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["simon","yahoo","google","groups","mark","simon1"], a, "p> a Should match " + ["simon","yahoo","google","groups","mark","simon1"]);		
	},
	testChild3 : function() {				
		var r = $("p >a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["simon","yahoo","google","groups","mark","simon1"], a, "p >a Should match " + ["simon","yahoo","google","groups","mark","simon1"]);		
	},
	testChild4 : function() {				
		var r = $("p>a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["simon","yahoo","google","groups","mark","simon1"], a, "p>a Should match " + ["simon","yahoo","google","groups","mark","simon1"]);		
	},
	testChildrenAll : function() {				
		var r = $("code > *")/* .elements */
		var a = [];
		var expected;
		// Safari returns these in a different order.
		if( /webkit/i.test( navigator.userAgent ) ) 
			expected = ["anchor1","anchor2"]
		else
			expected = ["anchor2","anchor1"];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, "code > * Should match " + expected + " - " + a);		
	},
	testChildWithClass : function() {			
		var r = $("p > a.blog", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["simon","mark"], a, "p > a.blog Should match " + ["simon","mark"]);		
	},
	testChildAllGrandchildren : function() {			
		var r = $("p > * > *", "#CSSTESTS")/* .elements */
		var a = [];		
		var expected = ["anchor2","anchor1"];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		
		arrayAssert.containsItems(expected, a, "p > * > * Should match " + expected + " - " + a );
		assert.areEqual(expected.length, a.length, "p > * > * should contains " + expected.length + " elements - " + expected + " - " + a );	
	},
	testAdjacent : function() {	
		var r = $("a + a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["groups"], a, "a + a Should match " + ["groups"]);		
	},
	testtestAdjacent2 : function() {
		var r = $("a +a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["groups"], a, "a +a Should match " + ["groups"]);		
	},
	testtestAdjacent3 : function() {	
		var r = $("a+ a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["groups"], a, "a+ a Should match " + ["groups"]);		
	},
	testtestAdjacent4 : function() {
		var r = $("a+a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["groups"], a, "a+a Should match " + ["groups"]);		
	},
	testtestAdjacent5 : function() {				
		var r = $("p + p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["ap","en","sap"], a, "p + p Should match " + ["ap","en","sap"]);		
	},
	testAdjacentAndChild : function() {					
		var r = $("a + a, code > a", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["groups","anchor2","anchor1"], a, "a + a, code > a Should match " + ["groups","anchor1","anchor2"]);		
	},
	testFirstChild : function() {		
		var r = $("p:first-child", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["sndp","firstp"], a, "p:first-child Should match " + ["firstp","sndp"]);		
	},
	testNthChild1 : function() {					
		var r = $("p:nth-child(1)", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["sndp","firstp"], a, "p:nth-child(1) Should match " + ["firstp","sndp"]);		
	},
	testLastChild : function() {					
		var r = $("p:last-child", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["sap"], a, "p:last-child Should match " + ["sap"]);		
	},
	testLastChild2 : function() {					
		var r = $("a:last-child", "#CSSTESTS")/* .elements */
		var a = [];
		var expected = ["simon1","anchor1","mark","yahoo","anchor2","simon"];
		expected = expected.reverse();
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, "a:last-child Should match " + ["simon1","anchor1","mark","yahoo","anchor2","simon"]);		
	},
	testNthChildComb : function() {					
		var r = $("#main form#form > *:nth-child(2)", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["text2"], a, "#main form#form > *:nth-child(2) Should match " + ["text2"]);		
	},
	testNthChildComb2 : function() {	
		var r = $("#main form#form > :nth-child(2)", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["text2"], a, "#main form#form > :nth-child(2) Should match " + ["text2"]);		
	},
	testNthChildComb3 : function() {	
		var css = "#form select:first option:nth-child(3)",
		    expected = ["option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);		
	},
	testNthChildComb4 : function() {	
		var css = "#form select:first option:nth-child(0n+3)",		
		    expected = ["option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);		
	},
	testNthChildComb5 : function() {	
		var css = "#form select:first option:nth-child(1n+0)",
		    expected = ["option1d", "option1c", "option1b", "option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);		
	},
	testNthChildComb6 : function() {	
		var css = "#form select:first option:nth-child(1n)", 
		    expected = ["option1d", "option1c", "option1b", "option1a"],//["option1a", "option1b", "option1c", "option1d"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);		
	},
	testNthChildComb7 : function() {	
		var css = "#form select:first option:nth-child(n)", 
		    expected = ["option1d", "option1c", "option1b", "option1a"],//["option1a", "option1b", "option1c", "option1d"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb8 : function() {	
		var css = "#form select:first option:nth-child(even)", 		
		    expected = ["option1d", "option1b"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb9 : function() {	
		var css = "#form select:first option:nth-child(odd)", 		
		    expected = ["option1c", "option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb10 : function() {	
		var css = "#form select:first option:nth-child(2n)", 		
		    expected = ["option1d", "option1b"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb11 : function() {	
		var css = "#form select:first option:nth-child(2n+1)", 		
		    expected = ["option1c", "option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb12 : function() {	
		var css = "#form select:first option:nth-child(3n)", 
		    expected = ["option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb13 : function() {	
		var css = "#form select:first option:nth-child(3n+1)", 
		    expected = ["option1d", "option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb14 : function() {	
		var css = "#form select:first option:nth-child(3n+2)", 
		    expected = ["option1b"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb15 : function() {	
		var css = "#form select:first option:nth-child(3n+3)", 
		    expected = ["option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb16 : function() {	
		var css = "#form select:first option:nth-child(3n-1)", 
		    expected = ["option1b"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb17 : function() {	
		var css = "#form select:first option:nth-child(3n-2)", 
		    expected = ["option1d", "option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb18 : function() {	
		var css = "#form select:first option:nth-child(3n-3)", 
		    expected = ["option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb19 : function() {	
		var css = "#form select:first option:nth-child(3n+0)", 
		    expected = ["option1c"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	},
	testNthChildComb20 : function() {
		var css = "#form select:first option:nth-child(-n+3)", 
		    expected = ["option1c", "option1b", "option1a"],
		    r = $(css, "#CSSTESTS")/* .elements */,
		    a = [];		
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, css + " Should match " + expected);
	}
} );

// Groups
var testCaseGroups = new YAHOO.tool.TestCase( {
	name: "Groups Tests",
	testGroup : function() {		
		var r = $("a.blog, p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["mark","simon","firstp","ap","sndp","en","sap","first"], a, "a.blog, p Should match ['mark','simon','firstp','ap','sndp','en','sap','first']");				
	},
	testGroup2 : function() {		
		var r = $("a.blog , p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["mark","simon","firstp","ap","sndp","en","sap","first"], a, "a.blog , p Should match ['mark','simon','firstp','ap','sndp','en','sap','first']");				
	},
	testGroup3 : function() {		
		var r = $("a.blog ,p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["mark","simon","firstp","ap","sndp","en","sap","first"], a, "a.blog ,p Should match ['mark','simon','firstp','ap','sndp','en','sap','first']");				
	},
	testGroup4 : function() {		
		var r = $("a.blog,p", "#CSSTESTS")/* .elements */
		var a = [];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(["mark","simon","firstp","ap","sndp","en","sap","first"], a, "a.blog,p Should match ['mark','simon','firstp','ap','sndp','en','sap','first']");				
	}
} );

// Groups
var testCaseDOMManip = new YAHOO.tool.TestCase( {
	name: "DOM Manip Tests",
	testDOMManip : function() {		
		var r = $("ul", "#CSSTESTS")/* .elements */
		var a = [];
		var expected = ['firstUL'];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, "ul Should match " + expected + " - " + a);				
	},
	testDOMManip2 : function() {		
		var ul = document.createElement("ul");
		ul.id = "secondUL";
		$('#CSSTESTS')[0].appendChild(ul);
		
		var r = $("ul", "#CSSTESTS")/* .elements */
		var a = [];
		var expected = ['firstUL', 'secondUL'];
		for( var i = 0; i<r.length; i++)
			a.push(r[i].getAttribute( "id" ));		
		arrayAssert.itemsAreEqual(expected, a, "ul Should match " + expected + " - " + a);				
	}
	
} );


window.onload = function() {
	var logger = new YAHOO.tool.TestLogger("testLogger");
	var testRunner = YAHOO.tool.TestRunner;
	
	css3TestSuite.add( testCaseId );
	css3TestSuite.add( testCaseClass );
	css3TestSuite.add( testCaseTagName );
	css3TestSuite.add( testCaseAttribute );
	css3TestSuite.add( testCasePseudo );
	css3TestSuite.add( testCaseCombinator );
	css3TestSuite.add( testCaseGroups );
	css3TestSuite.add( testCaseDOMManip );
		
	testRunner.add(css3TestSuite);	
	testRunner.run();
}