blob: 68f539a9e79edd974bd2e2f7aaa3cc09883771f8 [file] [log] [blame]
goog.setTestOnly('query_test');
goog.require('goog.dom');
goog.require('goog.userAgent');
function testBasicSelectors() {
assertQuery(4, 'h3');
assertQuery(1, 'h1:first-child');
assertQuery(2, 'h3:first-child');
assertQuery(1, '#t');
assertQuery(1, '#bug');
assertQuery(4, '#t h3');
assertQuery(1, 'div#t');
assertQuery(4, 'div#t h3');
assertQuery(0, 'span#t');
assertQuery(1, '#t div > h3');
assertQuery(2, '.foo');
assertQuery(1, '.foo.bar');
assertQuery(2, '.baz');
assertQuery(3, '#t > h3');
}
function testSyntacticEquivalents() {
// syntactic equivalents
assertQuery(12, '#t > *');
assertQuery(12, '#t >');
assertQuery(3, '.foo > *');
assertQuery(3, '.foo >');
}
function testWithARootById() {
// Broken in latest chrome.
if (goog.userAgent.WEBKIT) {
return;
}
// with a root, by ID
assertQuery(3, '> *', 'container');
assertQuery(3, '> h3', 't');
}
function testCompoundQueries() {
// compound queries
assertQuery(2, '.foo, .bar');
assertQuery(2, '.foo,.bar');
}
function testMultipleClassAttributes() {
// multiple class attribute
assertQuery(1, '.foo.bar');
assertQuery(2, '.foo');
assertQuery(2, '.baz');
}
function testCaseSensitivity() {
// case sensitivity
assertQuery(1, 'span.baz');
assertQuery(1, 'sPaN.baz');
assertQuery(1, 'SPAN.baz');
assertQuery(1, '[class = \"foo bar\"]');
assertQuery(2, '[foo~=\"bar\"]');
assertQuery(2, '[ foo ~= \"bar\" ]');
}
function testAttributes() {
assertQuery(3, '[foo]');
assertQuery(1, '[foo$=\"thud\"]');
assertQuery(1, '[foo$=thud]');
assertQuery(1, '[foo$=\"thudish\"]');
assertQuery(1, '#t [foo$=thud]');
assertQuery(1, '#t [ title $= thud ]');
assertQuery(0, '#t span[ title $= thud ]');
assertQuery(2, '[foo|=\"bar\"]');
assertQuery(1, '[foo|=\"bar-baz\"]');
assertQuery(0, '[foo|=\"baz\"]');
}
function testDescendantSelectors() {
// Broken in latest chrome.
if (goog.userAgent.WEBKIT) {
return;
}
assertQuery(3, '>', 'container');
assertQuery(3, '> *', 'container');
assertQuery(2, '> [qux]', 'container');
assertEquals('child1', goog.dom.query('> [qux]', 'container')[0].id);
assertEquals('child3', goog.dom.query('> [qux]', 'container')[1].id);
assertQuery(3, '>', 'container');
assertQuery(3, '> *', 'container');
}
function testSiblingSelectors() {
assertQuery(1, '+', 'container');
assertQuery(3, '~', 'container');
assertQuery(1, '.foo + span');
assertQuery(4, '.foo ~ span');
assertQuery(1, '#foo ~ *');
assertQuery(1, '#foo ~');
}
function testSubSelectors() {
// sub-selector parsing
assertQuery(1, '#t span.foo:not(span:first-child)');
assertQuery(1, '#t span.foo:not(:first-child)');
}
function testNthChild() {
assertEquals(goog.dom.$('_foo'), goog.dom.query('.foo:nth-child(2)')[0]);
assertQuery(2, '#t > h3:nth-child(odd)');
assertQuery(3, '#t h3:nth-child(odd)');
assertQuery(3, '#t h3:nth-child(2n+1)');
assertQuery(1, '#t h3:nth-child(even)');
assertQuery(1, '#t h3:nth-child(2n)');
assertQuery(1, '#t h3:nth-child(2n+3)');
assertQuery(2, '#t h3:nth-child(1)');
assertQuery(1, '#t > h3:nth-child(1)');
assertQuery(3, '#t :nth-child(3)');
assertQuery(0, '#t > div:nth-child(1)');
assertQuery(7, '#t span');
assertQuery(3, '#t > *:nth-child(n+10)');
assertQuery(1, '#t > *:nth-child(n+12)');
assertQuery(10, '#t > *:nth-child(-n+10)');
assertQuery(5, '#t > *:nth-child(-2n+10)');
assertQuery(6, '#t > *:nth-child(2n+2)');
assertQuery(5, '#t > *:nth-child(2n+4)');
assertQuery(5, '#t > *:nth-child(2n+4)');
assertQuery(12, '#t > *:nth-child(n-5)');
assertQuery(6, '#t > *:nth-child(2n-5)');
}
function testEmptyPseudoSelector() {
assertQuery(4, '#t > span:empty');
assertQuery(6, '#t span:empty');
assertQuery(0, 'h3 span:empty');
assertQuery(1, 'h3 :not(:empty)');
}
function testIdsWithColons() {
assertQuery(1, '#silly\\:id\\:\\:with\\:colons');
}
function testOrder() {
var els = goog.dom.query('.myupperclass .myclass input');
assertEquals('myid1', els[0].id);
assertEquals('myid2', els[1].id);
}
function testCorrectDocumentInFrame() {
var frameDocument = window.frames['ifr'].document;
frameDocument.body.innerHTML =
document.getElementById('iframe-test').innerHTML;
var els = goog.dom.query('#if1 .if2 div', document);
var frameEls = goog.dom.query('#if1 .if2 div', frameDocument);
assertEquals(els.length, frameEls.length);
assertEquals(1, frameEls.length);
assertNotEquals(document.getElementById('if3'),
frameDocument.getElementById('if3'));
}
/**
* @param {number} expectedNumberOfNodes
* @param {...*} var_args
*/
function assertQuery(expectedNumberOfNodes, var_args) {
var args = Array.prototype.slice.call(arguments, 1);
assertEquals(expectedNumberOfNodes,
goog.dom.query.apply(null, args).length);
}