1 var test = require("tape")
3 module.exports = testDomElement
5 function testDomElement(document) {
7 var cleanup = require('./cleanup')(document)
9 test("can getElementsByClassName", function(assert) {
10 function append_div(classNames, parent) {
11 var div = document.createElement("div")
12 div.className = classNames
13 parent.appendChild(div)
17 function assertMatch(classNames, expectedElements, parent) {
18 var parent = parent || document
19 var result = parent.getElementsByClassName(classNames)
20 assert.equal(result.length, expectedElements.length)
21 for (var i = 0; i < expectedElements.length; i++) {
22 assert.notEqual(expectedElements.indexOf(result[i]), -1)
26 var divA = append_div("A", document.body)
27 var divB = append_div("B", document.body)
28 var divC = append_div("C", document.body)
30 var divA1 = append_div("A1", divA)
31 var divA2 = append_div("A2", divA)
32 var divB1 = append_div("B1", divB)
33 var divB2 = append_div("B2", divB)
34 var divB2a = append_div("B2a", divB2)
35 var divB2b = append_div("B2b", divB2)
37 assertMatch("A", [divA])
38 assertMatch("B", [divB])
39 assertMatch("C", [divC])
40 assertMatch("A1", [divA1])
41 assertMatch("A2", [divA2])
42 assertMatch("B1", [divB1])
43 assertMatch("B2", [divB2])
44 assertMatch("B2a", [divB2a])
45 assertMatch("B2b", [divB2b])
47 assertMatch("A1", [divA1], divA)
48 assertMatch("A2", [divA2], divA)
49 assertMatch("A1", [], divB)
50 assertMatch("A2", [], divC)
51 assertMatch("B1", [divB1], divB)
52 assertMatch("B2", [divB2], divB)
53 assertMatch("B2a", [divB2a], divB)
54 assertMatch("B2a", [divB2a], divB2)
55 assertMatch("B2b", [], divA)
61 test("does not serialize innerText as an attribute", function(assert) {
62 var div = document.createElement("div")
63 div.innerText = "Test <&>"
64 assert.equal(div.toString(), "<div>Test <&></div>")
69 test("does not serialize innerHTML as an attribute", function(assert) {
70 var div = document.createElement("div")
71 div.innerHTML = "Test <img />"
72 assert.equal(div.toString(), "<div>Test <img /></div>")
77 test("can getElementsByTagName", function(assert) {
78 var parent = document.createElement("div")
79 var child1 = document.createElement("span")
80 var child2 = document.createElement("span")
85 child1.appendChild(child2)
86 parent.appendChild(child1)
88 var elems = parent.getElementsByTagName("SPAN")
90 assert.equal(elems.length, 2)
91 assert.equal(elems[0].id, "foo")
92 assert.equal(elems[1].id, "bar")
98 test("can getElementsByTagName with *", function(assert) {
99 var e1 = document.createElement("div")
100 var e2 = document.createElement("p")
101 var e3 = document.createElement("span")
105 // non-elements should be ignored
106 e3.appendChild(document.createTextNode('foo'))
107 e3.appendChild(document.createComment('bar'))
109 var elems = e1.getElementsByTagName("*")
111 assert.equal(elems.length, 2)
112 assert.equal(elems[0].tagName, "P")
113 assert.equal(elems[1].tagName, "SPAN")
119 test("getElement* methods can be passed to map()", function(assert) {
120 var container = document.createElement("div")
121 var e1 = document.createElement("div")
122 var e2 = document.createElement("span")
123 container.appendChild(e1)
124 container.appendChild(e2)
127 ["div", "span"].map(container.getElementsByTagName.bind(container)),
135 ["foo", "bar"].map(container.getElementsByClassName.bind(container)),
143 test("can serialize comment nodes", function(assert) {
144 var div = document.createElement("div")
145 div.appendChild(document.createComment("test"))
146 assert.equal(div.toString(), "<div><!--test--></div>")
151 test("can serialize style property", function(assert) {
152 var div = document.createElement("div")
153 div.style.fontSize = "16px"
154 assert.equal(div.toString(), "<div style=\"font-size:16px;\"></div>")
159 test("can serialize style as a string", function(assert) {
160 var div = document.createElement("div")
161 div.setAttribute('style', 'display: none')
162 assert.equal(div.toString(), "<div style=\"display: none\"></div>")
167 test("can serialize text nodes", function(assert) {
168 var div = document.createElement("div")
169 div.appendChild(document.createTextNode('<test> "&'))
170 assert.equal(div.toString(), '<div><test> "&</div>')
175 test("escapes serialized attribute values", function(assert) {
176 var div = document.createElement("div")
177 div.setAttribute("data-foo", '<p>"&')
178 assert.equal(div.toString(), '<div data-foo="<p>"&"></div>')
183 test("can check if an element contains another", function(assert) {
184 var parent = document.createElement("div")
185 var sibling = document.createElement("div")
186 var child1 = document.createElement("div")
187 var child2 = document.createElement("div")
189 child1.appendChild(child2)
190 parent.appendChild(child1)
192 assert.equal(parent.contains(parent), true)
193 assert.equal(parent.contains(sibling), false)
194 assert.equal(parent.contains(child1), true)
195 assert.equal(parent.contains(child2), true)
201 test("can handle non string attribute values", function(assert) {
202 var div = document.createElement("div")
203 div.setAttribute("data-number", 100)
204 div.setAttribute("data-boolean", true)
205 div.setAttribute("data-null", null)
206 assert.equal(div.toString(), '<div data-number="100" data-boolean="true" data-null=""></div>')
211 test("can serialize textarea correctly", function(assert) {
212 var input = document.createElement("textarea")
213 input.setAttribute("name", "comment")
214 input.innerHTML = "user input here"
215 assert.equal(input.toString(), '<textarea name="comment">user input here</textarea>')