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( '