Plato on Github
Report Home
dojo/tests/unit/NodeList-traverse.js
Maintainability
66.63
Lines of code
962
Difficulty
81.58
Estimated Errors
7.74
Function weight
By Complexity
By SLOC
define([ 'intern!object', 'intern/chai!assert', 'sinon', '../../NodeList', '../../_base/lang', '../../dom-construct', '../../query', '../../NodeList-traverse' ], function (registerSuite, assert, sinon, NodeList, lang, domConstruct, query) { registerSuite({ name: 'dojo/NodeList-traverse', "children()": { "returns children of nodes": function () { //arrange var containers = [ document.createElement("div"), document.createElement("div") ], children = [ [ document.createElement("span"), document.createElement("span") ], [ document.createElement("input"), document.createElement("input") ] ], allChildren = children[0].concat(children[1]), nodeList = new NodeList(containers); for (var i in containers) { for (var j in children[i]) { containers[i].appendChild(children[i][j]); } document.body.appendChild(containers[i]); } //act var result = nodeList.children(); //assert for (var i = 0; i < result.length; i++) { assert.propertyVal(allChildren, result[i]); } for (var i in containers) { document.body.removeChild(containers[i]); } }, "filters children with query, if present": function () { //arrange var containers = [ document.createElement("div"), document.createElement("div") ], children = [ [ document.createElement("span"), document.createElement("span") ], [ document.createElement("input"), document.createElement("input") ] ], query = "span", allChildren = children[0].concat(children[1]), nodeList = new NodeList(containers); for (var i in containers) { for (var j in children[i]) { containers[i].appendChild(children[i][j]); } document.body.appendChild(containers[i]); } //act var result = nodeList.children(query); //assert for (var i = 0; i < result.length; i++) { assert.equal(result[i].nodeName.toLowerCase(), "span"); } } }, "closest()": (function () { var root, containers, nodes, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("span"), document.createElement("span") ]; nodes = [ [ document.createElement("b"), document.createElement("b") ], [ document.createElement("i"), document.createElement("i") ] ]; nodeList = new NodeList(nodes[0].concat(nodes[1])); document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); for (var j in nodes[i]) { containers[i].appendChild(nodes[i][j]); } } }, teardown: function () { document.body.removeChild(root); }, "returns closest parent that matches query": function () { //arrange //act var result = nodeList.closest("span"); //assert assert.equal(result.length, containers.length); for (var i in containers) { assert.propertyVal(result, containers[i]); } }, "returns empty NodeList if no parent matches query": function () { //arrange //act var result = nodeList.closest("h1"); //assert assert.equal(result.length, 0); } }; })(), "parent()": (function () { var containers, expected, nodes, root, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("h1"), document.createElement("h1") ]; expected = [ document.createElement("span"), document.createElement("i") ]; nodes = [ document.createElement("b"), document.createElement("b") ]; document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); containers[i].appendChild(expected[i]); expected[i].appendChild(nodes[i]); } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns parents of nodes in NodeList": function () { //arrange //act var result = nodeList.parent(); //assert assert.equal(result.length, expected.length); for (var i in expected) { assert.propertyVal(result, expected[i]); } }, "filters returned parents by query, if present": function () { //arrange //act var result = nodeList.parent("i"); //assert assert.equal(result.length, 1); assert.equal(result[0], expected[1]); } }; })(), "parents()": (function () { var containers, expected, nodes, root, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("h1"), document.createElement("h1") ]; expected = [ document.createElement("span"), document.createElement("i") ]; nodes = [ document.createElement("b"), document.createElement("b") ]; document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); containers[i].appendChild(expected[i]); expected[i].appendChild(nodes[i]); } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns parents of nodes in NodeList": function () { //arrange //act var result = nodeList.parents(); //assert assert.equal(result.length, expected.length + containers.length + 3 /*root, body, html*/); for (var i in expected) { assert.propertyVal(result, expected[i]); } for (var i in containers) { assert.propertyVal(result, containers[i]); } assert.propertyVal(result, root); assert.propertyVal(result, document.body); assert.propertyVal(result, document.body.parentElement); }, "filters returned parents by query, if present": function () { //arrange //act var result = nodeList.parents("i"); //assert assert.equal(result.length, 1); assert.propertyVal(result[0], expected[1]); } }; })(), "siblings()": (function () { var containers, expected, nodes, root, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("h1"), document.createElement("h1") ]; expected = [ document.createElement("span"), document.createElement("i") ]; nodes = [ document.createElement("b"), document.createElement("b") ]; document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); containers[i].appendChild(nodes[i]); containers[i].appendChild(expected[i]); } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns siblings of nodes in NodeList": function () { //arrange //act var result = nodeList.siblings(); //assert assert.equal(result.length, expected.length); for (var i in expected) { assert.propertyVal(result, expected[i]); } for (var i in containers) { assert.propertyVal(result, containers[i]); } }, "filters returned siblings by query, if present": function () { //arrange //act var result = nodeList.siblings("i"); //assert assert.equal(result.length, 1); assert.propertyVal(result[0], expected[1]); } }; })(), "next()": (function () { var root, containers, nodes, expected, notExpected, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("h1"), document.createElement("h1") ]; nodes = [ document.createElement("span"), document.createElement("span") ]; expected = [ document.createElement("i"), document.createElement("b") ]; notExpected = [ document.createElement("button"), document.createElement("button") ]; document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); containers[i].appendChild(nodes[i]); containers[i].appendChild(expected[i]); containers[i].appendChild(notExpected[i]); } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns NodeList consisting of next siblings of nodes in this NodeList": function () { //arrange //act var result = nodeList.next(); //assert assert.equal(result.length, expected.length); for (var i in expected) { assert.propertyVal(result, expected[i]); } }, "filters returned nodes by query, if provided": function () { //arrange //act var result = nodeList.next("b"); //assert assert.equal(result.length, 1); assert.propertyVal(result[0], expected[1]); } }; })(), "nextAll()": (function () { var root, containers, previousSiblings, nodes, nextSiblings, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("div"), document.createElement("div") ]; previousSiblings = [ document.createElement("h1"), document.createElement("h1") ]; nodes = [ document.createElement("table"), document.createElement("table") ]; nextSiblings = [ [ document.createElement("button"), document.createElement("button") ], [ document.createElement("b"), document.createElement("b") ] ]; nodeList = new NodeList(nodes); document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); containers[i].appendChild(previousSiblings[i]); containers[i].appendChild(nodes[i]); for (var j in nextSiblings[i]) { containers[i].appendChild(nextSiblings[i][j]); } } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns all siblings after nodes in nodelist": function () { //arrange //act var result = nodeList.nextAll(); //assert var allSiblings = nextSiblings[0].concat(nextSiblings[1]); assert.equal(result.length, allSiblings.length); for (var i in allSiblings) { assert.propertyVal(result, allSiblings[i]); } }, "filters returned values by query, if provided": function () { //arrange //act var result = nodeList.nextAll("button"); //assert assert.equal(result.length, nextSiblings[0].length); for (var i in nextSiblings[0]) { assert.propertyVal(result, nextSiblings[0][i]); } } }; })(), "prev()": (function () { var root, containers, nodes, expected, notExpected, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("h1"), document.createElement("h1") ]; nodes = [ document.createElement("span"), document.createElement("span") ]; expected = [ document.createElement("i"), document.createElement("b") ]; notExpected = [ document.createElement("button"), document.createElement("button") ]; document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); containers[i].appendChild(notExpected[i]); containers[i].appendChild(expected[i]); containers[i].appendChild(nodes[i]); } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns NodeList consisting of previous siblings of nodes in this NodeList": function () { //arrange //act var result = nodeList.prev(); //assert assert.equal(result.length, expected.length); for (var i in expected) { assert.propertyVal(result, expected[i]); } }, "filters returned nodes by query, if provided": function () { //arrange //act var result = nodeList.prev("b"); //assert assert.equal(result.length, 1); assert.propertyVal(result[0], expected[1]); } }; })(), "prevAll()": (function () { var root, containers, previousSiblings, nodes, nextSiblings, nodeList; return { setup: function () { root = document.createElement("div"); containers = [ document.createElement("div"), document.createElement("div") ]; nextSiblings = [ document.createElement("h1"), document.createElement("h1") ]; nodes = [ document.createElement("table"), document.createElement("table") ]; previousSiblings = [ [ document.createElement("button"), document.createElement("button") ], [ document.createElement("b"), document.createElement("b") ] ]; nodeList = new NodeList(nodes); document.body.appendChild(root); for (var i in containers) { root.appendChild(containers[i]); for (var j in previousSiblings[i]) { containers[i].appendChild(previousSiblings[i][j]); } containers[i].appendChild(nodes[i]); containers[i].appendChild(nextSiblings[i]); } nodeList = new NodeList(nodes); }, teardown: function () { document.body.removeChild(root); }, "returns all siblings before nodes in nodelist": function () { //arrange //act var result = nodeList.prevAll(); //assert var allSiblings = previousSiblings[0].concat(previousSiblings[1]); assert.equal(result.length, allSiblings.length); for (var i in allSiblings) { assert.propertyVal(result, allSiblings[i]); } }, "filters returned values by query, if provided": function () { //arrange //act var result = nodeList.prevAll("button"); //assert assert.equal(result.length, previousSiblings[0].length); for (var i in previousSiblings[0]) { assert.propertyVal(result, previousSiblings[0][i]); } } }; })(), "andSelf()": { "returns concatenation of nodeList's parent to itself": function () { //arrange var nodes = [ document.createElement("div"), document.createElement("div") ], parentNodes = [ document.createElement("span"), document.createElement("span") ], nodeList = new NodeList(nodes), parentNodeList = new NodeList(parentNodes); nodeList._parent = parentNodeList; //act var result = nodeList.andSelf(); //assert var allNodes = nodes.concat(parentNodes); assert.equal(result.length, allNodes.length); for (var i in allNodes) { assert.propertyVal(result, allNodes[i]); } } }, "first()": { "returns first node from the NodeList": function () { //arrange var expected = document.createElement("div"), notExpected = [ document.createElement("span"), document.createElement("button") ], nodes = [expected].concat(notExpected), nodeList = new NodeList(nodes); //act var result = nodeList.first(); console.dir(result); //assert assert.equal(result.length, 1); assert.equal(result[0], expected); } }, "last()": { "returns last node from the NodeList": function () { //arrange var expected = document.createElement("div"), notExpected = [ document.createElement("span"), document.createElement("button") ], nodes = notExpected.concat([expected]), nodeList = new NodeList(nodes); //act var result = nodeList.last(); console.dir(result); //assert assert.equal(result.length, 1); assert.equal(result[0], expected); } }, "even()": { "returns even entries from the nodeList": function () { //arrange var odd = [ document.createElement("div"), document.createElement("div"), document.createElement("div") ], even = [ document.createElement("div"), document.createElement("div") ], nodes = [], nodeList; for (var i in odd) { nodes.push(odd[i]); if (even[i]) { nodes.push(even[i]); } } nodeList = new NodeList(nodes); //act var result = nodeList.even(); //assert assert.equal(result.length, even.length); for (var i in even) { assert.propertyVal(result, even[i]); } } }, "odd()": { "returns odd entries from the nodeList": function () { //arrange var odd = [ document.createElement("div"), document.createElement("div"), document.createElement("div") ], even = [ document.createElement("div"), document.createElement("div") ], nodes = [], nodeList; for (var i in odd) { nodes.push(odd[i]); if (even[i]) { nodes.push(even[i]); } } nodeList = new NodeList(nodes); //act var result = nodeList.odd(); //assert assert.equal(result.length, odd.length); for (var i in odd) { assert.propertyVal(result, odd[i]); } } }, "validation tests": (function () { function verify(/*dojo.NodeList*/nl, /*Array*/ids, /*String*/ comment) { comment = comment || "verify"; for (var i = 0, node; (node = nl[i]) ; i++) { assert.isTrue(ids[i] == node.id || ids[i] == node, comment + " " + i); } //Make sure lengths are equal. assert.equal(i, ids.length, comment + " length"); } var container, divs; return { setup: function () { container = document.createElement("div"); container = domConstruct.toDom( '<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>'); 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"]); } } })() }); });