UNPKG

14.3 kBJavaScriptView Raw
1var undef
2, test = require("tape")
3, DOM = require("./dom-lite.js")
4, document = DOM.document
5
6
7function append_el(id, parent, tag) {
8 var el = document.createElement(tag || "div")
9 el.id = id
10 parent.appendChild(el)
11 return el
12}
13
14
15test("getElementById, getElementsByTagName, getElementsByClassName, querySelector", function (assert) {
16 document = new DOM.Document()
17
18 var result
19 , el1 = append_el(1, document.body)
20 , el2 = append_el(2, document.body)
21 , el11 = append_el(11, el1)
22 , el12 = append_el(12, el1)
23 , el21 = append_el(21, el2)
24 , el22 = append_el(22, el2)
25 , el221 = append_el(221, el22, "span")
26 , el222 = append_el(222, el22)
27 , el3 = append_el(3, document.body)
28
29 el21.className = "findme first"
30 el222.setAttribute("type", "text/css")
31 el221.className = "findme"
32
33 assert.equal(document.body.appendChild(el3), el3)
34
35 assert.equal(document.getElementById(1), el1)
36 assert.equal(document.getElementById("2"), el2)
37 assert.equal(document.getElementById(3), el3)
38 assert.equal(document.getElementById(11), el11)
39 assert.equal(document.getElementById(12), el12)
40 assert.equal(document.getElementById(21), el21)
41 assert.equal(document.getElementById(22), el22)
42 assert.equal(document.getElementById(221), el221)
43 assert.equal(document.getElementById(222), el222)
44
45 assert.equal(document.getElementsByTagName("div").length, 8)
46
47 result = document.getElementsByTagName("span")
48 assert.equal(result.length, 1)
49 assert.equal(result[0], el221)
50
51 assert.deepEqual(document.getElementsByClassName("findme")
52 , [el21, el221])
53
54 assert.equal(document.querySelector("html"), document.documentElement)
55 assert.equal(document.querySelector("body"), document.body)
56
57 assert.equal(document.querySelector("span"), el221)
58 assert.equal(document.querySelector("#22"), el22)
59 assert.equal(document.querySelector("div#22"), el22)
60 assert.equal(document.querySelector("span#22"), null)
61
62 assert.equal(document.querySelector(".findme"), el21)
63 assert.equal(document.querySelector(".not_found"), null)
64 assert.equal(document.querySelector("div.findme"), el21)
65 assert.equal(document.querySelector("div.not_found"), null)
66 assert.equal(document.querySelector("span.first"), null)
67 assert.equal(document.querySelector("span.not_found"), null)
68 assert.equal(document.querySelector("#21.findme"), el21)
69 assert.equal(document.querySelector("div#21.findme"), el21)
70
71 assert.deepEqual(document.querySelectorAll("div")
72 , [el1, el11, el12, el2, el21, el22, el222, el3])
73
74 assert.deepEqual(document.querySelectorAll(".findme")
75 , [el21, el221])
76
77 assert.deepEqual(document.querySelectorAll("span.findme")
78 , [el221])
79
80 assert.deepEqual(document.querySelectorAll("html")
81 , [document.documentElement])
82
83 assert.deepEqual(document.querySelectorAll("body")
84 , [document.body])
85
86 assert.deepEqual(document.querySelectorAll("span.findme, div.findme")
87 , [el21, el221])
88
89 assert.deepEqual(document.querySelectorAll("body span.findme, div.findme")
90 , [el21, el221])
91
92 assert.deepEqual(el1.querySelectorAll("div")
93 , [el11, el12])
94
95 assert.end()
96})
97
98
99test("Element.matches and Element.closest", function (assert) {
100 document = new DOM.Document()
101
102 var el1 = append_el(1, document.body, "div")
103 , s1 = append_el("s1", document.body, "span")
104 , s2 = append_el(2, document.body, "span")
105 , a1 = append_el(3, s2, "a")
106 , in1 = append_el("in1", el1, "input")
107 , in2 = append_el("in2", el1, "input")
108
109 s2.lang = "en"
110 s2.name = "map[]"
111 s2.setAttribute("data-space", "a b")
112 s2.setAttribute("data-plus", "a+b")
113 s2.setAttribute("data-comma", "a,b")
114 s2.setAttribute("data-x1", "a,b]")
115 s2.setAttribute("data-x2", "a,b[")
116 s2.setAttribute("data-x3", "a,b(")
117 s2.setAttribute("data-x4", "a,b)")
118
119 a1.href = "#A link 1"
120 a1.lang = "en-US"
121 a1.foo = "en'US"
122
123 in1.disabled = true
124 in2.required = true
125
126 assert.equal(el1.matches("div"), true)
127 assert.equal(el1.matches("div, span"), true)
128 assert.equal(el1.matches("span"), false)
129 assert.equal(el1.matches("#1"), true)
130 assert.equal(el1.matches("#2"), false)
131 assert.equal(el1.matches("div#1"), true)
132 assert.equal(el1.matches("div#2"), false)
133
134 assert.equal(el1.matches("body > div#1"), true)
135 assert.equal(el1.matches("body > *"), true)
136 assert.equal(el1.matches("*"), true)
137 assert.equal(el1.matches("body > div#2"), false)
138 assert.equal(el1.matches("html > div#1"), false)
139 assert.equal(el1.matches("html > div#2"), false)
140
141 assert.equal(el1.matches("div + div"), false)
142 assert.equal(s1.matches("div + span"), true)
143 assert.equal(s2.matches("div + span"), false)
144 assert.equal(s2.matches("div + div"), false)
145
146 assert.equal(el1.matches("div ~ div"), false)
147 assert.equal(s1.matches("div ~ span"), true)
148 assert.equal(s2.matches("div ~ span"), true)
149 assert.equal(s2.matches("div ~ div"), false)
150
151 assert.equal(el1.matches("body div#1"), true)
152 assert.equal(el1.matches("html div#1"), true)
153
154 assert.equal(s2.matches(":empty"), false)
155 assert.equal(s2.matches(":link"), false)
156 assert.equal(a1.matches("a:empty"), true)
157 assert.equal(a1.matches("i:empty"), false)
158 assert.equal(a1.matches(":link"), true)
159
160 assert.equal(in1.matches(":enabled"), false)
161 assert.equal(in2.matches(":enabled"), true)
162 assert.equal(in1.matches(":optional"), true)
163 assert.equal(in2.matches(":optional"), false)
164
165 assert.equal(el1.matches('[id=1]'), true)
166 assert.equal(el1.matches('body [id=1]'), true)
167 assert.equal(el1.matches('[id=true]'), false)
168
169 assert.equal(s2.matches('[id=2]'), true)
170 assert.equal(s2.matches('[id=2][lang=en]'), true)
171 assert.equal(s2.matches('[id=2][lang="en"]'), true)
172 assert.equal(s2.matches('[id="2"][lang=en]'), true)
173 assert.equal(s2.matches('[id="2"][lang="en"]'), true)
174 assert.equal(s2.matches('[name="map[]"]'), true)
175 assert.equal(s2.matches('body [name="map[]"]'), true)
176
177 assert.equal(s2.matches('[data-space]'), true)
178 assert.equal(s2.matches('[data-space][data-plus]'), true)
179 assert.equal(s2.matches('[data-plu]'), false)
180 assert.equal(s2.matches('[data-space="a b"]'), true)
181 assert.equal(s2.matches('[data-plus="a b"]'), false)
182 assert.equal(s2.matches('[data-plus="a+b"]'), true)
183 assert.equal(s2.matches('[data-comma="a,b"]'), true)
184 assert.equal(s2.matches('div, [data-comma="a,b"]'), true)
185 assert.equal(s2.matches('div[data-comma="a,b"]'), false)
186 assert.equal(s2.matches('span[data-comma="a,b"]'), true)
187 assert.equal(s2.matches('[data-x1="a,b]"]'), true)
188 assert.equal(s2.matches('[data-x1="a,b["]'), false)
189 assert.equal(s2.matches('[data-x2="a,b["]'), true)
190 assert.equal(s2.matches('[data-x2="a,b]"]'), false)
191 assert.equal(s2.matches('[data-x3="a,b("]'), true)
192 assert.equal(s2.matches('[data-x3="a,b)"]'), false)
193 assert.equal(s2.matches('[data-x4="a,b)"]'), true)
194 assert.equal(s2.matches('[data-x4="a,b("]'), false)
195
196 assert.equal(s2.matches('div, [data-x1="a,b]"]'), true)
197 assert.equal(s2.matches('div, [data-x1="a,b["]'), false)
198 assert.equal(s2.matches('div, [data-x2="a,b["]'), true)
199 assert.equal(s2.matches('div, [data-x2="a,b]"]'), false)
200 assert.equal(s2.matches('div, [data-x3="a,b("]'), true)
201 assert.equal(s2.matches('div, [data-x3="a,b)"]'), false)
202 assert.equal(s2.matches('div, [data-x4="a,b)"]'), true)
203 assert.equal(s2.matches('div, [data-x4="a,b("]'), false)
204
205 assert.equal(s2.matches('body > [data-space]'), true)
206 assert.equal(s2.matches('body > [data-space][data-plus]'), true)
207 assert.equal(s2.matches('body > [data-plu]'), false)
208 assert.equal(s2.matches('body > [data-space="a b"]'), true)
209 assert.equal(s2.matches('body > [data-plus="a b"]'), false)
210 assert.equal(s2.matches('body > [data-plus="a+b"]'), true)
211
212 assert.equal(a1.matches('[data-space] a'), true)
213 assert.equal(a1.matches('[data-space][data-plus] a'), true)
214 assert.equal(a1.matches('[data-plu] a'), false)
215 assert.equal(a1.matches('[data-space="a b"] a'), true)
216 assert.equal(a1.matches('[data-plus="a b"] a'), false)
217 assert.equal(a1.matches('[data-plus="a+b"] a'), true)
218
219 assert.equal(a1.matches('[href="#A link 1"]'), true)
220 assert.equal(a1.matches("a[href='#A link 1']"), true)
221 assert.equal(a1.matches('[href="#A"]'), false)
222 assert.equal(a1.matches('[href^="#A"]'), true)
223 assert.equal(a1.matches('[href^="A"]'), false)
224 assert.equal(a1.matches('[href^="#Aa"]'), false)
225 assert.equal(a1.matches('[foo^="en"]'), true)
226 assert.equal(a1.matches('[foo^="en\'"]'), true)
227 assert.equal(a1.matches('[href$=" 1"]'), true)
228 assert.equal(a1.matches('[href$=" 1"]'), false)
229 assert.equal(a1.matches('[href*="#A"]'), true)
230 assert.equal(a1.matches('[href*="#Aa"]'), false)
231 assert.equal(a1.matches('[href*="link"]'), true)
232 assert.equal(a1.matches('[href*=" 1"]'), true)
233 assert.equal(a1.matches('[href*=" 1"]'), false)
234 assert.equal(a1.matches('[href~="link"]'), true)
235 assert.equal(a1.matches('[href~="#A"]'), true)
236 assert.equal(a1.matches('[href~="A"]'), false)
237 assert.equal(s2.matches('[lang|="en"]'), true)
238 assert.equal(a1.matches('[lang|="en"]'), true)
239 assert.equal(a1.matches('[lang|="e"]'), false)
240 assert.equal(a1.matches('[lang|="en-"]'), false)
241
242 assert.equal(el1.matches("div:first-child"), true)
243 assert.equal(el1.matches("div:not(:first-child)"), false)
244
245 assert.equal(el1.matches("div:first-of-type"), true)
246 assert.equal(in1.matches(":first-of-type"), true)
247 assert.equal(in2.matches(":first-of-type"), false)
248 assert.equal(el1.matches("div:not(:first-of-type)"), false)
249
250 assert.equal(el1.matches("div:last-of-type"), true)
251 assert.equal(in1.matches(":last-of-type"), false)
252 assert.equal(in2.matches(":last-of-type"), true)
253 assert.equal(el1.matches("div:not(:last-of-type)"), false)
254
255 assert.equal(el1.matches("div:only-of-type"), true)
256 assert.equal(s1.matches(":only-of-type"), false)
257 assert.equal(s2.matches(":only-of-type"), false)
258 assert.equal(in1.matches(":only-of-type"), false)
259 assert.equal(in2.matches(":only-of-type"), false)
260 assert.equal(el1.matches("div:not(:only-of-type)"), false)
261
262 assert.equal(el1.matches("div:any(:first-child, :last-child)"), true)
263 assert.equal(el1.matches("div:last-child"), false)
264 assert.equal(el1.matches("div:not(:last-child)"), true)
265 assert.equal(el1.matches("div:any(:first-child, :last-child)"), true)
266 assert.equal(el1.matches("div:any(span, a)"), false)
267 assert.equal(s2.matches("span:first-child"), false)
268 assert.equal(s2.matches("span:last-child"), true)
269 assert.equal(s2.matches(":only-child"), false)
270 assert.equal(a1.matches(":only-child"), true)
271 assert.equal(a1.matches(":root"), false)
272 assert.equal(document.body.matches(":root"), false)
273 assert.equal(document.documentElement.matches(":root"), true)
274
275 assert.equal(el1.closest("div"), el1)
276 assert.equal(el1.closest("body"), document.body)
277 assert.equal(el1.closest("span"), null)
278
279 assert.end()
280})
281
282test(":nth-child selector", function (assert) {
283 document = new DOM.Document()
284 var el = document.body
285 , p1 = append_el("p1", el, "p")
286 , p2 = append_el("p2", el, "p")
287 , p3 = append_el("p3", el, "p")
288 , p4 = append_el("p4", el, "p")
289 , p5 = append_el("p5", el, "p")
290 , p6 = append_el("p6", el, "p")
291 , p7 = append_el("p7", el, "p")
292 , p8 = append_el("p8", el, "p")
293 , p9 = append_el("p9", el, "p")
294
295 assert.deepEqual(el.querySelectorAll(":nth-child(2n)")
296 , [p2, p4, p6, p8])
297
298 assert.deepEqual(el.querySelectorAll(":nth-child(even)")
299 , [p2, p4, p6, p8])
300
301 assert.deepEqual(el.querySelectorAll(":nth-child(2n+1)")
302 , [p1, p3, p5, p7, p9])
303
304 assert.deepEqual(el.querySelectorAll(":nth-child(odd)")
305 , [p1, p3, p5, p7, p9])
306
307 assert.deepEqual(el.querySelectorAll(":nth-child(3n+3)")
308 , [p3, p6, p9])
309
310 assert.deepEqual(el.querySelectorAll(":nth-child(4n+1)")
311 , [p1, p5, p9])
312
313 assert.deepEqual(el.querySelectorAll(":nth-child(4n+4)")
314 , [p4, p8])
315
316 assert.deepEqual(el.querySelectorAll(":nth-child(4n)")
317 , [p4, p8])
318
319 assert.deepEqual(el.querySelectorAll(":nth-child(0n+1)")
320 , [p1])
321
322 assert.deepEqual(el.querySelectorAll(":nth-child(1)")
323 , [p1])
324
325 assert.deepEqual(el.querySelectorAll(":nth-child(3)")
326 , [p3])
327
328 assert.deepEqual(el.querySelectorAll(":nth-child(5n-2)")
329 , [p3, p8])
330
331 assert.deepEqual(el.querySelectorAll(":nth-child(-n+3)")
332 , [p1, p2, p3])
333
334 assert.deepEqual(el.querySelectorAll(":nth-child(-2n+3)")
335 , [p1, p3])
336
337 assert.deepEqual(el.querySelectorAll(":nth-child(-2n+4)")
338 , [p2, p4])
339
340 assert.end()
341})
342
343test(":nth-last-child selector", function (assert) {
344 document = new DOM.Document()
345 var el = document.body
346 , p1 = append_el("p1", el, "p")
347 , p2 = append_el("p2", el, "p")
348 , p3 = append_el("p3", el, "p")
349 , p4 = append_el("p4", el, "p")
350 , p5 = append_el("p5", el, "p")
351 , p6 = append_el("p6", el, "p")
352 , p7 = append_el("p7", el, "p")
353 , p8 = append_el("p8", el, "p")
354 , p9 = append_el("p9", el, "p")
355
356 assert.deepEqual(el.querySelectorAll(":nth-last-child(2n)")
357 , [p2, p4, p6, p8])
358
359 assert.deepEqual(el.querySelectorAll(":nth-last-child(even)")
360 , [p2, p4, p6, p8])
361
362 assert.deepEqual(el.querySelectorAll(":nth-last-child(2n+1)")
363 , [p1, p3, p5, p7, p9])
364
365 assert.deepEqual(el.querySelectorAll(":nth-last-child(odd)")
366 , [p1, p3, p5, p7, p9])
367
368 assert.deepEqual(el.querySelectorAll(":nth-last-child(3n+3)")
369 , [p1, p4, p7])
370
371 assert.deepEqual(el.querySelectorAll(":nth-last-child(4n+1)")
372 , [p1, p5, p9])
373
374 assert.deepEqual(el.querySelectorAll(":nth-last-child(4n+4)")
375 , [p2, p6])
376
377 assert.deepEqual(el.querySelectorAll(":nth-last-child(4n)")
378 , [p2, p6])
379
380 assert.deepEqual(el.querySelectorAll(":nth-last-child(0n+1)")
381 , [p9])
382
383 assert.deepEqual(el.querySelectorAll(":nth-last-child(0n+3)")
384 , [p7])
385
386 assert.deepEqual(el.querySelectorAll(":nth-last-child(1)")
387 , [p9])
388
389 assert.deepEqual(el.querySelectorAll(":nth-last-child(3)")
390 , [p7])
391
392 assert.deepEqual(el.querySelectorAll(":nth-last-child(5n-2)")
393 , [p2, p7])
394
395 assert.deepEqual(el.querySelectorAll(":nth-last-child(-n+3)")
396 , [p7, p8, p9])
397
398 assert.deepEqual(el.querySelectorAll(":nth-last-child(-2n+3)")
399 , [p7, p9])
400
401 assert.deepEqual(el.querySelectorAll(":nth-last-child(-2n+4)")
402 , [p6, p8])
403
404 assert.end()
405})
406
407test(":lang() selector", function (assert) {
408 document = new DOM.Document()
409 var el = document.body
410 , p1 = append_el("p1", el, "p")
411 , p2 = append_el("p2", el, "p")
412 , p3 = append_el("p3", p1, "p")
413 , p4 = append_el("p4", p2, "p")
414
415 el.lang = "en"
416 p2.lang = "fr-be"
417
418 assert.deepEqual(el.querySelectorAll(":lang(en)")
419 , [p1, p3])
420
421 assert.deepEqual(el.querySelectorAll(":lang(fr)")
422 , [p2, p4])
423
424 assert.end()
425})
426