OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 #library('XMLElementTest'); | |
6 #import('../../../../lib/unittest/unittest.dart'); | |
7 #import('../../../../lib/unittest/html_config.dart'); | |
8 #import('dart:html'); | |
9 | |
10 main() { | |
11 useHtmlConfiguration(); | |
12 | |
13 XMLElement makeElement() => new XMLElement.xml("<xml><foo/><bar/></xml>"); | |
14 | |
15 makeElementWithParent() { | |
16 final parent = new XMLElement.xml( | |
17 "<parent><before/><xml><foo/><bar/></xml><after/></parent>"); | |
18 return parent.elements[1]; | |
19 } | |
20 | |
21 group('constructors', () { | |
22 group('.xml', () { | |
23 test('with a well-formed document', () { | |
24 final el = makeElement(); | |
25 Expect.isTrue(el is XMLElement); | |
26 Expect.equals('foo', el.elements[0].tagName); | |
27 Expect.equals('bar', el.elements[1].tagName); | |
28 }); | |
29 | |
30 test('with too many nodes', () { | |
31 Expect.throws(() => new XMLElement.xml("<xml></xml>foo"), | |
32 (e) => e is IllegalArgumentException); | |
33 }); | |
34 | |
35 test('with a parse error', () { | |
36 Expect.throws(() => new XMLElement.xml("<xml></xml>>"), | |
37 (e) => e is IllegalArgumentException); | |
38 }); | |
39 | |
40 test('with a PARSERERROR tag', () { | |
41 final el = new XMLElement.xml("<xml><parsererror /></xml>"); | |
42 Expect.equals('parsererror', el.elements[0].tagName); | |
43 }); | |
44 | |
45 test('has no parent', () => | |
46 Expect.isNull(new XMLElement.xml('<foo/>').parent)); | |
47 }); | |
48 | |
49 test('.tag', () { | |
50 final el = new XMLElement.tag('foo'); | |
51 Expect.isTrue(el is XMLElement); | |
52 Expect.equals('foo', el.tagName); | |
53 }); | |
54 }); | |
55 | |
56 // FilteredElementList is tested more thoroughly in DocumentFragmentTests. | |
57 group('elements', () { | |
58 test('filters out non-element nodes', () { | |
59 final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>"); | |
60 Expect.listEquals(["a", "b", "c", "d"], el.elements.map((e) => e.tagName))
; | |
61 }); | |
62 | |
63 test('overwrites nodes when set', () { | |
64 final el = new XMLElement.xml("<xml>1<a/><b/>2<c/>3<d/></xml>"); | |
65 el.elements = [new XMLElement.tag('x'), new XMLElement.tag('y')]; | |
66 Expect.equals("<xml><x></x><y></y></xml>", el.outerHTML); | |
67 }); | |
68 }); | |
69 | |
70 group('classes', () { | |
71 XMLElement makeElementWithClasses() => | |
72 new XMLElement.xml("<xml class='foo bar baz'></xml>"); | |
73 | |
74 Set<String> makeClassSet() => makeElementWithClasses().classes; | |
75 | |
76 test('affects the "class" attribute', () { | |
77 final el = makeElementWithClasses(); | |
78 el.classes.add('qux'); | |
79 Expect.setEquals(['foo', 'bar', 'baz', 'qux'], | |
80 el.attributes['class'].split(' ')); | |
81 }); | |
82 | |
83 test('is affected by the "class" attribute', () { | |
84 final el = makeElementWithClasses(); | |
85 el.attributes['class'] = 'foo qux'; | |
86 Expect.setEquals(['foo', 'qux'], el.classes); | |
87 }); | |
88 | |
89 test('classes=', () { | |
90 final el = makeElementWithClasses(); | |
91 el.classes = ['foo', 'qux']; | |
92 Expect.setEquals(['foo', 'qux'], el.classes); | |
93 Expect.setEquals(['foo', 'qux'], el.attributes['class'].split(' ')); | |
94 }); | |
95 | |
96 test('toString', () { | |
97 Expect.setEquals(['foo', 'bar', 'baz'], | |
98 makeClassSet().toString().split(' ')); | |
99 Expect.equals('', makeElement().classes.toString()); | |
100 }); | |
101 | |
102 test('forEach', () { | |
103 final classes = <String>[]; | |
104 makeClassSet().forEach(classes.add); | |
105 Expect.setEquals(['foo', 'bar', 'baz'], classes); | |
106 }); | |
107 | |
108 test('iterator', () { | |
109 final classes = <String>[]; | |
110 for (var el in makeClassSet()) { | |
111 classes.add(el); | |
112 } | |
113 Expect.setEquals(['foo', 'bar', 'baz'], classes); | |
114 }); | |
115 | |
116 test('map', () { | |
117 Expect.setEquals(['FOO', 'BAR', 'BAZ'], | |
118 makeClassSet().map((c) => c.toUpperCase())); | |
119 }); | |
120 | |
121 test('filter', () { | |
122 Expect.setEquals(['bar', 'baz'], | |
123 makeClassSet().filter((c) => c.contains('a'))); | |
124 }); | |
125 | |
126 test('every', () { | |
127 Expect.isTrue(makeClassSet().every((c) => c is String)); | |
128 Expect.isFalse( | |
129 makeClassSet().every((c) => c.contains('a'))); | |
130 }); | |
131 | |
132 test('some', () { | |
133 Expect.isTrue( | |
134 makeClassSet().some((c) => c.contains('a'))); | |
135 Expect.isFalse(makeClassSet().some((c) => c is num)); | |
136 }); | |
137 | |
138 test('isEmpty', () { | |
139 Expect.isFalse(makeClassSet().isEmpty()); | |
140 Expect.isTrue(makeElement().classes.isEmpty()); | |
141 }); | |
142 | |
143 test('length', () { | |
144 Expect.equals(3, makeClassSet().length); | |
145 Expect.equals(0, makeElement().classes.length); | |
146 }); | |
147 | |
148 test('contains', () { | |
149 Expect.isTrue(makeClassSet().contains('foo')); | |
150 Expect.isFalse(makeClassSet().contains('qux')); | |
151 }); | |
152 | |
153 test('add', () { | |
154 final classes = makeClassSet(); | |
155 classes.add('qux'); | |
156 Expect.setEquals(['foo', 'bar', 'baz', 'qux'], classes); | |
157 | |
158 classes.add('qux'); | |
159 final list = new List.from(classes); | |
160 list.sort((a, b) => a.compareTo(b)); | |
161 Expect.listEquals(['bar', 'baz', 'foo', 'qux'], list, | |
162 "The class set shouldn't have duplicate elements."); | |
163 }); | |
164 | |
165 test('remove', () { | |
166 final classes = makeClassSet(); | |
167 classes.remove('bar'); | |
168 Expect.setEquals(['foo', 'baz'], classes); | |
169 classes.remove('qux'); | |
170 Expect.setEquals(['foo', 'baz'], classes); | |
171 }); | |
172 | |
173 test('addAll', () { | |
174 final classes = makeClassSet(); | |
175 classes.addAll(['bar', 'qux', 'bip']); | |
176 Expect.setEquals(['foo', 'bar', 'baz', 'qux', 'bip'], classes); | |
177 }); | |
178 | |
179 test('removeAll', () { | |
180 final classes = makeClassSet(); | |
181 classes.removeAll(['bar', 'baz', 'qux']); | |
182 Expect.setEquals(['foo'], classes); | |
183 }); | |
184 | |
185 test('isSubsetOf', () { | |
186 final classes = makeClassSet(); | |
187 Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz'])); | |
188 Expect.isTrue(classes.isSubsetOf(['foo', 'bar', 'baz', 'qux'])); | |
189 Expect.isFalse(classes.isSubsetOf(['foo', 'bar', 'qux'])); | |
190 }); | |
191 | |
192 test('containsAll', () { | |
193 final classes = makeClassSet(); | |
194 Expect.isTrue(classes.containsAll(['foo', 'baz'])); | |
195 Expect.isFalse(classes.containsAll(['foo', 'qux'])); | |
196 }); | |
197 | |
198 test('intersection', () { | |
199 final classes = makeClassSet(); | |
200 Expect.setEquals(['foo', 'baz'], | |
201 classes.intersection(['foo', 'qux', 'baz'])); | |
202 }); | |
203 | |
204 test('clear', () { | |
205 final classes = makeClassSet(); | |
206 classes.clear(); | |
207 Expect.setEquals([], classes); | |
208 }); | |
209 }); | |
210 | |
211 test("no-op methods don't throw errors", () { | |
212 final el = makeElement(); | |
213 el.on.click.add((e) => null); | |
214 el.blur(); | |
215 el.focus(); | |
216 el.scrollByLines(2); | |
217 el.scrollByPages(2); | |
218 el.scrollIntoView(); | |
219 }); | |
220 | |
221 group('properties that map to attributes', () { | |
222 group('contentEditable', () { | |
223 test('get', () { | |
224 final el = makeElement(); | |
225 Expect.equals('inherit', el.contentEditable); | |
226 el.attributes['contentEditable'] = 'foo'; | |
227 Expect.equals('foo', el.contentEditable); | |
228 }); | |
229 | |
230 test('set', () { | |
231 final el = makeElement(); | |
232 el.contentEditable = 'foo'; | |
233 Expect.equals('foo', el.attributes['contentEditable']); | |
234 }); | |
235 | |
236 test('isContentEditable', () { | |
237 final el = makeElement(); | |
238 Expect.isFalse(el.isContentEditable); | |
239 el.contentEditable = 'true'; | |
240 Expect.isFalse(el.isContentEditable); | |
241 }); | |
242 }); | |
243 | |
244 group('draggable', () { | |
245 test('get', () { | |
246 final el = makeElement(); | |
247 Expect.isFalse(el.draggable); | |
248 el.attributes['draggable'] = 'true'; | |
249 Expect.isTrue(el.draggable); | |
250 el.attributes['draggable'] = 'foo'; | |
251 Expect.isFalse(el.draggable); | |
252 }); | |
253 | |
254 test('set', () { | |
255 final el = makeElement(); | |
256 el.draggable = true; | |
257 Expect.equals('true', el.attributes['draggable']); | |
258 el.draggable = false; | |
259 Expect.equals('false', el.attributes['draggable']); | |
260 }); | |
261 }); | |
262 | |
263 group('spellcheck', () { | |
264 test('get', () { | |
265 final el = makeElement(); | |
266 Expect.isFalse(el.spellcheck); | |
267 el.attributes['spellcheck'] = 'true'; | |
268 Expect.isTrue(el.spellcheck); | |
269 el.attributes['spellcheck'] = 'foo'; | |
270 Expect.isFalse(el.spellcheck); | |
271 }); | |
272 | |
273 test('set', () { | |
274 final el = makeElement(); | |
275 el.spellcheck = true; | |
276 Expect.equals('true', el.attributes['spellcheck']); | |
277 el.spellcheck = false; | |
278 Expect.equals('false', el.attributes['spellcheck']); | |
279 }); | |
280 }); | |
281 | |
282 group('hidden', () { | |
283 test('get', () { | |
284 final el = makeElement(); | |
285 Expect.isFalse(el.hidden); | |
286 el.attributes['hidden'] = ''; | |
287 Expect.isTrue(el.hidden); | |
288 }); | |
289 | |
290 test('set', () { | |
291 final el = makeElement(); | |
292 el.hidden = true; | |
293 Expect.equals('', el.attributes['hidden']); | |
294 el.hidden = false; | |
295 Expect.isFalse(el.attributes.containsKey('hidden')); | |
296 }); | |
297 }); | |
298 | |
299 group('tabIndex', () { | |
300 test('get', () { | |
301 final el = makeElement(); | |
302 Expect.equals(0, el.tabIndex); | |
303 el.attributes['tabIndex'] = '2'; | |
304 Expect.equals(2, el.tabIndex); | |
305 el.attributes['tabIndex'] = 'foo'; | |
306 Expect.equals(0, el.tabIndex); | |
307 }); | |
308 | |
309 test('set', () { | |
310 final el = makeElement(); | |
311 el.tabIndex = 15; | |
312 Expect.equals('15', el.attributes['tabIndex']); | |
313 }); | |
314 }); | |
315 | |
316 group('id', () { | |
317 test('get', () { | |
318 final el = makeElement(); | |
319 Expect.equals('', el.id); | |
320 el.attributes['id'] = 'foo'; | |
321 Expect.equals('foo', el.id); | |
322 }); | |
323 | |
324 test('set', () { | |
325 final el = makeElement(); | |
326 el.id = 'foo'; | |
327 Expect.equals('foo', el.attributes['id']); | |
328 }); | |
329 }); | |
330 | |
331 group('title', () { | |
332 test('get', () { | |
333 final el = makeElement(); | |
334 Expect.equals('', el.title); | |
335 el.attributes['title'] = 'foo'; | |
336 Expect.equals('foo', el.title); | |
337 }); | |
338 | |
339 test('set', () { | |
340 final el = makeElement(); | |
341 el.title = 'foo'; | |
342 Expect.equals('foo', el.attributes['title']); | |
343 }); | |
344 }); | |
345 | |
346 group('webkitdropzone', () { | |
347 test('get', () { | |
348 final el = makeElement(); | |
349 Expect.equals('', el.webkitdropzone); | |
350 el.attributes['webkitdropzone'] = 'foo'; | |
351 Expect.equals('foo', el.webkitdropzone); | |
352 }); | |
353 | |
354 test('set', () { | |
355 final el = makeElement(); | |
356 el.webkitdropzone = 'foo'; | |
357 Expect.equals('foo', el.attributes['webkitdropzone']); | |
358 }); | |
359 }); | |
360 | |
361 group('lang', () { | |
362 test('get', () { | |
363 final el = makeElement(); | |
364 Expect.equals('', el.lang); | |
365 el.attributes['lang'] = 'foo'; | |
366 Expect.equals('foo', el.lang); | |
367 }); | |
368 | |
369 test('set', () { | |
370 final el = makeElement(); | |
371 el.lang = 'foo'; | |
372 Expect.equals('foo', el.attributes['lang']); | |
373 }); | |
374 }); | |
375 | |
376 group('dir', () { | |
377 test('get', () { | |
378 final el = makeElement(); | |
379 Expect.equals('', el.dir); | |
380 el.attributes['dir'] = 'foo'; | |
381 Expect.equals('foo', el.dir); | |
382 }); | |
383 | |
384 test('set', () { | |
385 final el = makeElement(); | |
386 el.dir = 'foo'; | |
387 Expect.equals('foo', el.attributes['dir']); | |
388 }); | |
389 }); | |
390 }); | |
391 | |
392 test('set innerHTML', () { | |
393 final el = makeElement(); | |
394 el.innerHTML = "<foo>Bar<baz/></foo>"; | |
395 Expect.equals(1, el.nodes.length); | |
396 final node = el.nodes[0]; | |
397 Expect.isTrue(node is XMLElement); | |
398 Expect.equals('foo', node.tagName); | |
399 Expect.equals('Bar', node.nodes[0].text); | |
400 Expect.equals('baz', node.nodes[1].tagName); | |
401 }); | |
402 | |
403 test('get innerHTML/outerHTML', () { | |
404 final el = makeElement(); | |
405 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
406 el.nodes.clear(); | |
407 el.nodes.addAll([new Text("foo"), new XMLElement.xml("<a>bar</a>")]); | |
408 Expect.equals("foo<a>bar</a>", el.innerHTML); | |
409 Expect.equals("<xml>foo<a>bar</a></xml>", el.outerHTML); | |
410 }); | |
411 | |
412 test('query', () { | |
413 final el = makeElement(); | |
414 Expect.equals("foo", el.query('foo').tagName); | |
415 Expect.isNull(el.query('baz')); | |
416 }); | |
417 | |
418 test('queryAll', () { | |
419 final el = new XMLElement.xml( | |
420 "<xml><foo id='f1' /><bar><foo id='f2' /></bar></xml>"); | |
421 Expect.listEquals(["f1", "f2"], el.queryAll('foo').map((e) => e.id)); | |
422 Expect.listEquals([], el.queryAll('baz')); | |
423 }); | |
424 | |
425 // TODO(nweiz): re-enable this when matchesSelector works cross-browser. | |
426 // | |
427 // test('matchesSelector', () { | |
428 // final el = makeElement(); | |
429 // Expect.isTrue(el.matchesSelector('*')); | |
430 // Expect.isTrue(el.matchesSelector('xml')); | |
431 // Expect.isFalse(el.matchesSelector('html')); | |
432 // }); | |
433 | |
434 group('insertAdjacentElement', () { | |
435 test('beforeBegin with no parent does nothing', () { | |
436 final el = makeElement(); | |
437 Expect.isNull( | |
438 el.insertAdjacentElement("beforeBegin", new XMLElement.tag("b"))); | |
439 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
440 }); | |
441 | |
442 test('afterEnd with no parent does nothing', () { | |
443 final el = makeElement(); | |
444 Expect.isNull( | |
445 el.insertAdjacentElement("afterEnd", new XMLElement.tag("b"))); | |
446 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
447 }); | |
448 | |
449 test('beforeBegin with parent inserts the element', () { | |
450 final el = makeElementWithParent(); | |
451 final newEl = new XMLElement.tag("b"); | |
452 Expect.equals(newEl, el.insertAdjacentElement("beforeBegin", newEl)); | |
453 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
454 Expect.equals("<before></before><b></b><xml><foo></foo><bar></bar>" + | |
455 "</xml><after></after>", el.parent.innerHTML); | |
456 }); | |
457 | |
458 test('afterEnd with parent inserts the element', () { | |
459 final el = makeElementWithParent(); | |
460 final newEl = new XMLElement.tag("b"); | |
461 Expect.equals(newEl, el.insertAdjacentElement("afterEnd", newEl)); | |
462 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
463 Expect.equals("<before></before><xml><foo></foo><bar></bar></xml><b>" + | |
464 "</b><after></after>", el.parent.innerHTML); | |
465 }); | |
466 | |
467 test('afterBegin inserts the element', () { | |
468 final el = makeElement(); | |
469 final newEl = new XMLElement.tag("b"); | |
470 Expect.equals(newEl, el.insertAdjacentElement("afterBegin", newEl)); | |
471 Expect.equals("<b></b><foo></foo><bar></bar>", el.innerHTML); | |
472 }); | |
473 | |
474 test('beforeEnd inserts the element', () { | |
475 final el = makeElement(); | |
476 final newEl = new XMLElement.tag("b"); | |
477 Expect.equals(newEl, el.insertAdjacentElement("beforeEnd", newEl)); | |
478 Expect.equals("<foo></foo><bar></bar><b></b>", el.innerHTML); | |
479 }); | |
480 }); | |
481 | |
482 group('insertAdjacentText', () { | |
483 test('beforeBegin with no parent does nothing', () { | |
484 final el = makeElement(); | |
485 el.insertAdjacentText("beforeBegin", "foo"); | |
486 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
487 }); | |
488 | |
489 test('afterEnd with no parent does nothing', () { | |
490 final el = makeElement(); | |
491 el.insertAdjacentText("afterEnd", "foo"); | |
492 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
493 }); | |
494 | |
495 test('beforeBegin with parent inserts the text', () { | |
496 final el = makeElementWithParent(); | |
497 el.insertAdjacentText("beforeBegin", "foo"); | |
498 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
499 Expect.equals("<before></before>foo<xml><foo></foo><bar></bar></xml>" + | |
500 "<after></after>", el.parent.innerHTML); | |
501 }); | |
502 | |
503 test('afterEnd with parent inserts the text', () { | |
504 final el = makeElementWithParent(); | |
505 el.insertAdjacentText("afterEnd", "foo"); | |
506 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
507 Expect.equals("<before></before><xml><foo></foo><bar></bar></xml>foo" + | |
508 "<after></after>", el.parent.innerHTML); | |
509 }); | |
510 | |
511 test('afterBegin inserts the text', () { | |
512 final el = makeElement(); | |
513 el.insertAdjacentText("afterBegin", "foo"); | |
514 Expect.equals("foo<foo></foo><bar></bar>", el.innerHTML); | |
515 }); | |
516 | |
517 test('beforeEnd inserts the text', () { | |
518 final el = makeElement(); | |
519 el.insertAdjacentText("beforeEnd", "foo"); | |
520 Expect.equals("<foo></foo><bar></bar>foo", el.innerHTML); | |
521 }); | |
522 }); | |
523 | |
524 group('insertAdjacentHTML', () { | |
525 test('beforeBegin with no parent does nothing', () { | |
526 final el = makeElement(); | |
527 el.insertAdjacentHTML("beforeBegin", "foo<b/>"); | |
528 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
529 }); | |
530 | |
531 test('afterEnd with no parent does nothing', () { | |
532 final el = makeElement(); | |
533 el.insertAdjacentHTML("afterEnd", "<b/>foo"); | |
534 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
535 }); | |
536 | |
537 test('beforeBegin with parent inserts the HTML', () { | |
538 final el = makeElementWithParent(); | |
539 el.insertAdjacentHTML("beforeBegin", "foo<b/>"); | |
540 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
541 Expect.equals("<before></before>foo<b></b><xml><foo></foo><bar></bar>" + | |
542 "</xml><after></after>", el.parent.innerHTML); | |
543 }); | |
544 | |
545 test('afterEnd with parent inserts the HTML', () { | |
546 final el = makeElementWithParent(); | |
547 el.insertAdjacentHTML("afterEnd", "foo<b/>"); | |
548 Expect.equals("<foo></foo><bar></bar>", el.innerHTML); | |
549 Expect.equals("<before></before><xml><foo></foo><bar></bar></xml>foo" + | |
550 "<b></b><after></after>", el.parent.innerHTML); | |
551 }); | |
552 | |
553 test('afterBegin inserts the HTML', () { | |
554 final el = makeElement(); | |
555 el.insertAdjacentHTML("afterBegin", "foo<b/>"); | |
556 Expect.equals("foo<b></b><foo></foo><bar></bar>", el.innerHTML); | |
557 }); | |
558 | |
559 test('beforeEnd inserts the HTML', () { | |
560 final el = makeElement(); | |
561 el.insertAdjacentHTML("beforeEnd", "<b/>foo"); | |
562 Expect.equals("<foo></foo><bar></bar><b></b>foo", el.innerHTML); | |
563 }); | |
564 }); | |
565 | |
566 asyncTest('default rect values', 1, () { | |
567 makeElement().rect.then((ElementRect rect) { | |
568 expectEmptyRect(rect.client); | |
569 expectEmptyRect(rect.offset); | |
570 expectEmptyRect(rect.scroll); | |
571 expectEmptyRect(rect.bounding); | |
572 Expect.isTrue(rect.clientRects.isEmpty()); | |
573 callbackDone(); | |
574 }); | |
575 }); | |
576 } | |
OLD | NEW |