UNPKG

dojo

Version:

Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.

1,157 lines (949 loc) 43 kB
define([ 'intern!object', 'intern/chai!assert', 'sinon', '../../NodeList', '../../dom-attr', '../../dom-construct', '../../query', '../../NodeList-manipulate', '../../NodeList-traverse' ], function (registerSuite, assert, sinon, NodeList, attr, construct, query) { registerSuite({ name: 'dojo/NodeList-manipulate', // Test this private method because a lot of public methods defer to it. // Better to test all in one place so that the consumers can rely on it to "do the right thing" // instead of checking implementation details themselves "_placeMultiple": { "returns original node list": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList._placeMultiple(document.createElement("div"), "last"); //assert assert.strictEqual(result, nodeList); }, "string + string calls dojo/dom-construct::place with correct arguments": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes), queryResults = [ document.createElement("span"), document.createElement("span") ], container = document.createElement("div"), mock = sinon.spy(construct, "place"), position = "last"; for (var i in nodes) { nodes[i].className = "class" + i; } for (var i in queryResults) { container.appendChild(queryResults[i]); } document.body.appendChild(container); //act nodeList._placeMultiple("span", position); //assert //last node in nodelist placed with dojo/dom-construct::place into first query result node assert.deepEqual(mock.args[0], [nodes[1], queryResults[0], position]); //addiitional nodes in nodelist place into first query result before the last node assert.equal(nodes[1].previousSibling, nodes[0]); //last node in nodelist is cloned and that clone is placed with dojo/dom-construct::place into additional query result nodes assert.notEqual(mock.args[1][0], nodes[1]); assert.equal(mock.args[1][0].outerHTML, nodes[1].outerHTML); //addiitional nodes in nodelist place into first query result before the last node assert.notEqual(queryResults[1].children[1], nodes[1]); assert.equal(queryResults[1].children[1].outerHTML, nodes[1].outerHTML); mock.restore(); }, "Node + string calls dojo/dom-construct::place with correct arguments": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes), queryNode = document.createElement("span"), container = document.createElement("div"), mock = sinon.spy(construct, "place"), position = "last"; for (var i in nodes) { nodes[i].className = "class" + i; } container.appendChild(queryNode); document.body.appendChild(container); //act nodeList._placeMultiple(queryNode, position); //assert //last node in nodelist placed with dojo/dom-construct::place into queryNode assert.deepEqual(mock.args[0], [nodes[1], queryNode, position]); //addiitional nodes in nodelist place into queryNode before the last node assert.equal(nodes[1].previousSibling, nodes[0]); mock.restore(); }, "NodeList + string calls dojo/dom-construct::place with correct arguments": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes), queryResults = [ document.createElement("span"), document.createElement("span") ], queryNodeList = new NodeList(queryResults), container = document.createElement("div"), mock = sinon.spy(construct, "place"), position = "last"; for (var i in nodes) { nodes[i].className = "class" + i; } for (var i in queryResults) { container.appendChild(queryResults[i]); } document.body.appendChild(container); //act nodeList._placeMultiple(queryNodeList, position); //assert //last node in nodelist placed with dojo/dom-construct::place into first query result node assert.deepEqual(mock.args[0], [nodes[1], queryResults[0], position]); //addiitional nodes in nodelist place into first query result before the last node assert.equal(nodes[1].previousSibling, nodes[0]); //last node in nodelist is cloned and that clone is placed with dojo/dom-construct::place into additional query result nodes assert.notEqual(mock.args[1][0], nodes[1]); assert.equal(mock.args[1][0].outerHTML, nodes[1].outerHTML); //addiitional nodes in nodelist place into first query result before the last node assert.notEqual(queryResults[1].children[1], nodes[1]); assert.equal(queryResults[1].children[1].outerHTML, nodes[1].outerHTML); mock.restore(); } }, "innerHTML()": { "when argument present => delegate to addContent": function () { //arrange var expected = "foo", argument = "bar", nodes = ["bar", "baz"], nodeList = new NodeList(nodes), mock = sinon.stub(nodeList, "addContent").returns(expected); //act var result = nodeList.innerHTML(argument); //assert assert.equal(result, expected); assert.deepEqual(mock.args[0], [argument, "only"]); mock.restore(); }, "when no argument, return first nodes innerHTML": function () { //arrange var node = document.createElement("div"), otherNode = document.createElement("div"), expected = "the expected result", nodeList = new NodeList([node, otherNode]); node.innerHTML = expected; otherNode = "this is not the expected content"; //act var result = nodeList.innerHTML(); //assert assert.equal(result, expected); } }, "text()": { "string => attr.set": function () { //arrange var nodes = [ document.createElement("div"), document.createElement("div") ], nodeList = new NodeList(nodes), expected = "the expected content", mock = sinon.spy(attr, "set"); //act var result = nodeList.text(expected); //assert for (var i in nodes) { assert.deepEqual(mock.args[i], [nodes[i], "textContent", expected]); } assert.equal(result, nodeList); mock.restore(); }, "no args => attr.get": function () { //arrange var nodes = [ document.createElement("div"), document.createElement("div") ], nodeList = new NodeList(nodes), expected = [ "the first expected content", "the second expected content" ], mock = sinon.stub(attr, "get"); for (var i in nodes) { mock.withArgs(nodes[i]).returns(expected[i]); } //act var result = nodeList.text(); //assert assert.equal(result, expected[0] + expected[1]); for (var i in nodes) { assert.deepEqual(mock.args[i], [nodes[i], "textContent"]); } mock.restore(); } }, "val()": { "empty nodelist::val() = undefined": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList.val(); //assert assert.isUndefined(result); }, "nodeList([<select/>, ...]);:val() = value of first element": function () { //arrange var expected = "the value", firstNode = document.createElement("select"), nextNode = document.createElement("input"), notSelectedOption = document.createElement("option"), selectedOption = document.createElement("option"), nodeList = new NodeList([firstNode, nextNode]); notSelectedOption.value = "not the expected value"; selectedOption.value = expected; firstNode.add(notSelectedOption); firstNode.add(selectedOption); selectedOption.selected = true; //act var result = nodeList.val(); //assert assert.equal(result, expected); }, "nodeList([<select multiple/>, ...])::val() = array of selected options": function () { //arrange var expected = ["blue", "yellow"], notExpected = "red", node = document.createElement("select"), notSelectedOption = document.createElement("option"), firstSelectedOption = document.createElement("option"), secondSelectedOption = document.createElement("option"), nodeList = new NodeList([node]); node.multiple = true; notSelectedOption.value = notExpected; firstSelectedOption.value = expected[0]; secondSelectedOption.value = expected[1]; node.add(firstSelectedOption); node.add(notSelectedOption); node.add(secondSelectedOption); firstSelectedOption.selected = true; secondSelectedOption.selected = true; //act var result = nodeList.val(); //assert assert.deepEqual(result, expected); }, "nodeList([<input/>, <input/>])::val(string) => sets the value of the input elements": function () { //arrange var expected = "the value", nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes); for (var i in nodes) { nodes[i].value = "the old value"; } //act var result = nodeList.val(expected); //assert for (var i in nodes) { assert.equal(expected, nodes[i].value); } assert.equal(result, nodeList); }, "nodeList([<input/>, <input/>])::val(array) => sets the value of the input elements": function () { //arrange var expected = [ "the first value", "the second value" ], nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes); for (var i in nodes) { nodes[i].value = "the old value"; } //act var result = nodeList.val(expected); //assert for (var i in nodes) { assert.equal(expected[i], nodes[i].value); } assert.equal(result, nodeList); }, "nodeList([<select/>])::val(string) => sets correct options to selected": function () { //arrange var expected = "the value", node = document.createElement("select"), notSelectedOption = document.createElement("option"), selectedOption = document.createElement("option"), nodeList = new NodeList([node]); notSelectedOption.value = "not the expected value"; selectedOption.value = expected; node.add(notSelectedOption); node.add(selectedOption); //act var result = nodeList.val(expected); //assert assert.isTrue(selectedOption.selected); assert.isFalse(notSelectedOption.selected); assert.equal(result, nodeList); }, "nodeList([<input type='checkbox'/>, <input type='checkbox'/>])::val(string) => selects correct elements": function () { //arrange var expected = "the value", nodeToCheck = document.createElement("input"), nodeToNotCheck = document.createElement("input"), nodes = [nodeToNotCheck, nodeToCheck], nodeList = new NodeList(nodes); for (var i in nodes) { nodes[i].type = "checkbox"; } nodeToCheck.value = expected; nodeToNotCheck.value = "not expected value"; nodeToCheck.checked = false; nodeToNotCheck.checked = true; //act var result = nodeList.val(expected); //assert assert.isTrue(nodeToCheck.checked); assert.isFalse(nodeToNotCheck.checked); assert.equal(result, nodeList); }, "nodeList([<input type='radio'/>])::val(string) => selects correct elements": function () { //arrange var expected = "the value", nodeToCheck = document.createElement("input"), nodeToNotCheck = document.createElement("input"), nodes = [nodeToNotCheck, nodeToCheck], nodeList = new NodeList(nodes); for (var i in nodes) { nodes[i].type = "radio"; nodes[i].name = "theName" + i; } nodeToCheck.value = expected; nodeToNotCheck.value = "not expected value"; nodeToCheck.checked = false; nodeToNotCheck.checked = true; //act var result = nodeList.val(expected); //assert assert.isTrue(nodeToCheck.checked); assert.isFalse(nodeToNotCheck.checked); assert.equal(result, nodeList); } }, "append()": { "any => this.addContent(any, 'last')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "addContent").returns(expected); //act var result = nodeList.append(arg); //assert assert.deepEqual(mock.args[0], [arg, "last"]); assert.equal(result, expected); mock.restore(); } }, "appendTo()": { "string => this._placeMultiple(string, 'last')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "_placeMultiple").returns(expected); //act var result = nodeList.appendTo(arg); //assert assert.deepEqual(mock.args[0], [arg, "last"]); assert.equal(result, expected); mock.restore(); } }, "prepend()": { "string => this.prepend(string, 'first')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "addContent").returns(expected); //act var result = nodeList.prepend(arg); //assert assert.deepEqual(mock.args[0], [arg, "first"]); assert.equal(result, expected); mock.restore(); } }, "prependTo()": { "string => this._placeMultiple(string, 'first')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "_placeMultiple").returns(expected); //act var result = nodeList.prependTo(arg); //assert assert.deepEqual(mock.args[0], [arg, "first"]); assert.equal(result, expected); mock.restore(); } }, "after()": { "string => this.after(string, 'after')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "addContent").returns(expected); //act var result = nodeList.after(arg); //assert assert.deepEqual(mock.args[0], [arg, "after"]); assert.equal(result, expected); mock.restore(); } }, "insertAfter()": { "string => this._placeMultiple(string, 'after')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "_placeMultiple").returns(expected); //act var result = nodeList.insertAfter(arg); //assert assert.deepEqual(mock.args[0], [arg, "after"]); assert.equal(result, expected); mock.restore(); } }, "before()": { "string => this.after(string, 'before')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "addContent").returns(expected); //act var result = nodeList.before(arg); //assert assert.deepEqual(mock.args[0], [arg, "before"]); assert.equal(result, expected); mock.restore(); } }, "insertBefore()": { "string => this._placeMultiple(string, 'before')": function () { //arrange var arg = { foo: "bar" }, expected = "the result", nodeList = new NodeList(), mock = sinon.stub(nodeList, "_placeMultiple").returns(expected); //act var result = nodeList.insertBefore(arg); //assert assert.deepEqual(mock.args[0], [arg, "before"]); assert.equal(result, expected); mock.restore(); } }, "remove()": { "remove is alias of NodeList.prototype.orphan": function () { //arrange var nodeList = new NodeList(); //act //assert assert.strictEqual(nodeList.remove, NodeList.prototype.orphan); } }, "wrap()": { "returns nodeList": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList.wrap("<div></div>"); //assert assert.strictEqual(result, nodeList); }, "inserts nodes at the lowest level of the wrapper": function () { //arrange var node = document.createElement("input"), nodeList = new NodeList([node]), container = document.createElement("div") container.appendChild(node); //act nodeList.wrap("<div><span><b></b></span></div>"); //assert assert.equal(node.parentNode.nodeName.toLowerCase(), "b"); }, "wraps all nodes in nodelist": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes), container = document.createElement("div") for (var i in nodes) { container.appendChild(nodes[i]); } //act nodeList.wrap("<span></span>"); //assert for (var i in nodes) { assert.equal(nodes[i].parentNode.nodeName.toLowerCase(), "span"); } } }, "wrapAll()": { "returns original nodeList": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList.wrapAll("<div></div>"); //assert assert.strictEqual(result, nodeList); }, "wraps all nodes in the wrapper as direct children": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input"), document.createElement("input")], nodeList = new NodeList(nodes), containers = [ document.createElement("div"), document.createElement("div"), document.createElement("div")]; for (var i in nodes) { containers[i].appendChild(nodes[i]); } //act nodeList.wrapAll("<div></div>"); //assert var parent = nodes[0].parentElement; for (var i in nodes) { assert.strictEqual(parent, nodes[i].parentElement); } }, "wrapper located in the same location as the first node": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes), containers = [ document.createElement("div"), document.createElement("div"), document.createElement("div")]; for (var i in nodes) { containers[i].appendChild(nodes[i]); } //act nodeList.wrapAll("<div></div>"); //assert var parent = nodes[0].parentElement; assert.strictEqual(parent.parentElement, containers[0]); } }, "wrapInner()": { "returns the original node list": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList.wrapInner("<div></div>"); //assert assert.strictEqual(result, nodeList); }, "wraps the direct children with the wrapper": function () { //arrange var children = [ document.createElement("input"), document.createElement("input") ], container = document.createElement("div"), nodeList = new NodeList(container); for (var i in children) { container.appendChild(children[i]); } //act nodeList.wrapInner("<span></span>"); //assert for (var i in children) { assert.equal(children[i].parentElement.nodeName.toLowerCase(), "span"); } } }, "replaceWith()": { "returns the original node list": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList.replaceWith("<div></div>"); //assert assert.strictEqual(result, nodeList); }, "content is passed through the _normalize method": function () { //arrange var nodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), container = document.createElement("div"), arg = "<div></div>", expected = document.createElement("div"), mock = sinon.stub(nodeList, "_normalize").returns(expected); for (var i in nodes) { container.appendChild(nodes[i]); } //act nodeList.replaceWith(arg); //assert assert.isTrue(mock.calledWith(arg, nodes[0])); mock.restore(); }, "calls _place method with correct arguments": function () { //arrange var nodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), container = document.createElement("div"), arg = "<div></div>", expected = document.createElement("div"), _normalizeMock = sinon.stub(nodeList, "_normalize").returns(arg), mock = sinon.stub(nodeList, "_place"); for (var i in nodes) { container.appendChild(nodes[i]); } //act nodeList.replaceWith(arg); //assert assert.isTrue(mock.calledWith(arg, nodes[0], "before", false)); assert.isTrue(mock.calledWith(arg, nodes[1], "before", true)); _normalizeMock.restore(); mock.restore(); }, "removes original nodes": function () { //arrange var nodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), container = document.createElement("div"), arg = "<div></div>", expected = document.createElement("div"), _normalizeMock = sinon.stub(nodeList, "_normalize").returns(arg), _placeMock = sinon.stub(nodeList, "_place"); for (var i in nodes) { container.appendChild(nodes[i]); } //act nodeList.replaceWith(arg); //assert for (var i in nodes) { assert.notEqual(container, nodes[i].parentElement); } _normalizeMock.restore(); _placeMock.restore(); } }, "replaceAll()": { "returns the original node list": function () { //arrange var nodeList = new NodeList(); //act var result = nodeList.replaceAll("div"); //assert assert.strictEqual(result, nodeList); }, "content is passed through the _normalize method": function () { //arrange var nodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), container = document.createElement("div"), queryNodes = [ document.createElement("div"), document.createElement("div") ], queryNodeList = new NodeList(queryNodes), expectedContent = document.createElement("b"), _normalizeMock = sinon.stub(nodeList, "_normalize").returns(expectedContent), _placeMock = sinon.spy(nodeList, "_place"); for (var i in nodes) { container.appendChild(nodes[i]); } for (var i in queryNodes) { container.appendChild(queryNodes[i]); } document.body.appendChild(container); //act nodeList.replaceAll("div div"); //assert assert.isTrue(_normalizeMock.calledWith(nodeList, nodes[0])); _normalizeMock.restore(); _placeMock.restore(); }, "calls _place method with correct arguments": function () { //arrange var nodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), container = document.createElement("div"), queryNodes = [ document.createElement("div"), document.createElement("div") ], queryNodeList = new NodeList(queryNodes), expectedContent = document.createElement("b"), _normalizeMock = sinon.stub(nodeList, "_normalize").returns(expectedContent), _placeMock = sinon.spy(nodeList, "_place"); for (var i in nodes) { container.appendChild(nodes[i]); } for (var i in queryNodes) { container.appendChild(queryNodes[i]); } document.body.appendChild(container); //act nodeList.replaceAll("div div"); //assert assert.isTrue(_placeMock.calledWith(expectedContent, queryNodes[0], "before", false)); assert.isTrue(_placeMock.calledWith(expectedContent, queryNodes[1], "before", true)); _normalizeMock.restore(); _placeMock.restore(); }, "removes original nodes": function () { //arrange var nodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), container = document.createElement("div"), queryNodes = [ document.createElement("div"), document.createElement("div") ], queryNodeList = new NodeList(queryNodes), expectedContent = document.createElement("b"), _normalizeMock = sinon.stub(nodeList, "_normalize").returns(expectedContent), _placeMock = sinon.spy(nodeList, "_place"); for (var i in nodes) { container.appendChild(nodes[i]); } for (var i in queryNodes) { container.appendChild(queryNodes[i]); } document.body.appendChild(container); //act nodeList.replaceAll("div div"); //assert assert.isFalse(container.contains(queryNodes[0])); assert.isFalse(container.contains(queryNodes[1])); _normalizeMock.restore(); _placeMock.restore(); } }, "clone()": { "returns node list populated with clones of originals": function () { //arrange var nodes = [ document.createElement("input"), document.createElement("input") ], nodeList = new NodeList(nodes); for (var i in nodes) { nodes[i].className = "nodeClass" + i; } //act var result = nodeList.clone(); //assert assert.notStrictEqual(result, nodeList); for (var i in nodes) { assert.notStrictEqual(result[i], nodes[i]); assert.equal(result[i].outerHTML, nodes[i].outerHTML); } } }, "validation tests": (function () { var container; function verify(/*dojo.NodeList*/nl, /*Array*/ids, /*String*/ comment) { comment = comment || "verify"; for (var i = 0, node; (node = nl[i]) ; i++) { assert.isTrue(node.id == ids[i] || node == ids[i], comment + " " + i) } //Make sure lengths are equal. assert.equal(i, ids.length, comment + " length"); } var divs; return { setup: function () { var html = '<div>' + ' <h1 id="firstH1">testing dojo.NodeList-traverse</h1>' + ' <div id="sq100" class="testDiv">' + ' 100px square, abs' + ' </div>' + ' <div id="t" class="testDiv">' + ' <span id="c1">c1</span>' + ' </div>' + ' <div id="third" class="third testDiv">' + ' <!-- This is the third top level div -->' + ' <span id="crass">Crass, baby</span>' + ' The third div' + ' <span id="classy" class="classy">Classy, baby</span>' + ' The third div, again' + ' <!-- Another comment -->' + ' <span id="yeah">Yeah, baby</span>' + ' </div>' + ' <div id="level1" class="foo">' + ' <div id="level2" class="bar">' + ' <div id="level3" class="foo">' + ' <div id="level4" class="bar">' + ' <div id="level5" class="bar">' + ' <div id="level6" class="bang">foo bar bar bang</div>' + ' </div>' + ' </div>' + ' </div>' + ' </div>' + ' </div>' + '</div>'; container = construct.toDom(html); document.body.appendChild(container); divs = query("div.testDiv"); }, teardown: function () { document.body.removeChild(container); }, "children": function () { verify(divs.last().children(), ["crass", "classy", "yeah"]); }, "closest": function () { // test simple selector var classy = query("#classy"); var closestDiv = classy.closest("div"); verify(closestDiv, ["third"], "closest('div')"); verify(closestDiv.end().closest(".classy"), ["classy"], "closestDiv.end().closest('.classy')"); // test descendant selector var bang = query(".bang"); var closestFooBar = bang.closest(".foo > .bar"); verify(closestFooBar, ["level4"], ".foo > .bar"); // test descendant selector that doesn't match (".foo" alone matches nodes, but not // ".bogus .foo") var closestBogusFoo = bang.closest(".bogus .foo"); verify(closestBogusFoo, [], ".bogus .foo"); // positive test that scope argument works: .foo > .bar should match a scope // of "level2" or above closestFooBar = bang.closest(".foo > .bar", "level2"); verify(closestFooBar, ["level4"], ".foo > .bar query relative to level2"); // > .bar should match a scope of level3 or level1 var topBar = bang.closest("> .bar", "level3"); verify(topBar, ["level4"], "> .bar query relative to level3"); // negative test that scope argument works: .foo > .bar relative to level3 // doesn't match since .foo is level3, rather than a child of level3 closestFooBar = bang.closest(".foo > .bar", "level3"); verify(closestFooBar, [], ".foo > .bar query relative to level3"); // complex test of multiple elements in NodeList // Only some of the elements in query("div") have a ".foo" ancestor, // and three of those elements have the *same* .foo ancestor, so // closest(".foo") should result in list of just two elements var closestFoo = query("div").closest(".foo"); verify(closestFoo, ["level1", "level3"], ".foo from div"); }, "parent": function () { verify(query("#classy").parent(), ["third"]); }, "parents": function () { var classy = query("#classy"); verify(classy.parents(), ["third", container, document.body, document.body.parentElement]); verify(classy.parents(".third"), ["third"]); verify(classy.parents("body"), [document.body]); }, "siblings": function () { verify(query("#classy").siblings(), ["crass", "yeah"]); }, "next": function () { verify(query("#crass").next(), ["classy"]); }, "nextAll": function () { verify(query("#crass").nextAll(), ["classy", "yeah"]); verify(query("#crass").nextAll("#yeah"), ["yeah"]); }, "prev": function () { verify(query("#classy").prev(), ["crass"]); }, "prevAll": function () { verify(query("#yeah").prevAll(), ["classy", "crass"]); verify(query("#yeah").prevAll("#crass"), ["crass"]); }, "andSelf": function () { verify(query("#yeah").prevAll().andSelf(), ["classy", "crass", "yeah"]); }, "first": function () { verify(divs.first(), ["sq100"]); }, "last": function () { verify(divs.last(), ["third"]); }, "even": function () { var even = divs.even(); verify(even, ["t"]); verify(even.end(), ["sq100", "t", "third"]); }, "odd": function () { var odd = divs.odd(); verify(odd, ["sq100", "third"]); verify(odd.end(), ["sq100", "t", "third"]); } } })() }); });