OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library ElementTest; | 5 library ElementTest; |
6 import 'package:unittest/unittest.dart'; | 6 import 'package:unittest/unittest.dart'; |
7 import 'package:unittest/html_config.dart'; | 7 import 'package:unittest/html_config.dart'; |
8 import 'dart:collection'; | 8 import 'dart:collection'; |
9 import 'dart:html'; | 9 import 'dart:html'; |
10 | 10 |
11 main() { | 11 main() { |
12 useHtmlConfiguration(); | 12 useHtmlConfiguration(); |
13 | 13 |
14 Element makeElement() => new Element.tag('div'); | 14 Element makeElement() => new Element.tag('div'); |
15 | 15 |
16 Element makeElementWithChildren() => | 16 Element makeElementWithChildren() => |
17 new Element.html("<div><br/><img/><input/></div>"); | 17 new Element.html("<div><br/><img/><input/></div>"); |
18 | 18 |
19 Element makeElementWithClasses() => | 19 Element makeElementWithClasses() => |
20 new Element.html('<div class="foo bar baz"></div>'); | 20 new Element.html('<div class="foo bar baz"></div>'); |
21 | 21 |
22 Element makeListElement() => | 22 Element makeListElement() => |
23 new Element.html('<ul class="foo bar baz">' | 23 new Element.html('<ul class="foo bar baz">' |
24 '<li class="quux qux"><li class="meta">' | 24 '<li class="quux qux">' |
25 '<li class="classy lassy"><li class="qux lassy"></ul>'); | 25 '<li class="meta">' |
| 26 '<li class="classy lassy">' |
| 27 '<li class="qux lassy">' |
| 28 '</ul>'); |
26 | 29 |
27 Set<String> makeClassSet() => makeElementWithClasses().classes; | 30 Set<String> makeClassSet() => makeElementWithClasses().classes; |
28 | 31 |
29 Set<String> extractClasses(Element el) { | 32 Set<String> extractClasses(Element el) { |
30 final match = new RegExp('class="([^"]+)"').firstMatch(el.outerHtml); | 33 final match = new RegExp('class="([^"]+)"').firstMatch(el.outerHtml); |
31 return new LinkedHashSet.from(match[1].split(' ')); | 34 return new LinkedHashSet.from(match[1].split(' ')); |
32 } | 35 } |
33 | 36 |
| 37 /// Returns a canonical string for Set<String> and lists of Element's classes. |
| 38 String view(var e) { |
| 39 if (e is Set) return '${e.toList()..sort()}'; |
| 40 if (e is Element) return view(e.classes); |
| 41 if (e is Iterable) return '${e.map(view).toList()}'; |
| 42 throw new ArgumentError('Cannot make canonical view string for: $e}'); |
| 43 } |
| 44 |
34 test('affects the "class" attribute', () { | 45 test('affects the "class" attribute', () { |
35 final el = makeElementWithClasses(); | 46 final el = makeElementWithClasses(); |
36 el.classes.add('qux'); | 47 el.classes.add('qux'); |
37 expect(extractClasses(el), orderedEquals(['foo', 'bar', 'baz', 'qux'])); | 48 expect(extractClasses(el), orderedEquals(['foo', 'bar', 'baz', 'qux'])); |
38 }); | 49 }); |
39 | 50 |
40 test('is affected by the "class" attribute', () { | 51 test('is affected by the "class" attribute', () { |
41 final el = makeElementWithClasses(); | 52 final el = makeElementWithClasses(); |
42 el.attributes['class'] = 'foo qux'; | 53 el.attributes['class'] = 'foo qux'; |
43 expect(el.classes, orderedEquals(['foo', 'qux'])); | 54 expect(el.classes, orderedEquals(['foo', 'qux'])); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 classes.toggleAll(['bar', 'foo']); | 172 classes.toggleAll(['bar', 'foo']); |
162 expect(classes, orderedEquals(['baz'])); | 173 expect(classes, orderedEquals(['baz'])); |
163 classes.toggleAll(['qux', 'quux']); | 174 classes.toggleAll(['qux', 'quux']); |
164 expect(classes, orderedEquals(['baz', 'qux', 'quux'])); | 175 expect(classes, orderedEquals(['baz', 'qux', 'quux'])); |
165 classes.toggleAll(['bar', 'foo'], true); | 176 classes.toggleAll(['bar', 'foo'], true); |
166 expect(classes, orderedEquals(['baz', 'qux', 'quux', 'bar', 'foo'])); | 177 expect(classes, orderedEquals(['baz', 'qux', 'quux', 'bar', 'foo'])); |
167 classes.toggleAll(['baz', 'quux'], false); | 178 classes.toggleAll(['baz', 'quux'], false); |
168 expect(classes, orderedEquals(['qux','bar', 'foo'])); | 179 expect(classes, orderedEquals(['qux','bar', 'foo'])); |
169 }); | 180 }); |
170 | 181 |
| 182 test('retainAll', () { |
| 183 final classes = makeClassSet(); |
| 184 classes.retainAll(['bar', 'baz', 'qux']); |
| 185 expect(classes, orderedEquals(['bar', 'baz'])); |
| 186 }); |
| 187 |
| 188 test('removeWhere', () { |
| 189 final classes = makeClassSet(); |
| 190 classes.removeWhere((s) => s.startsWith('b')); |
| 191 expect(classes, orderedEquals(['foo'])); |
| 192 }); |
| 193 |
| 194 test('retainWhere', () { |
| 195 final classes = makeClassSet(); |
| 196 classes.retainWhere((s) => s.startsWith('b')); |
| 197 expect(classes, orderedEquals(['bar', 'baz'])); |
| 198 }); |
| 199 |
171 test('containsAll', () { | 200 test('containsAll', () { |
172 final classes = makeClassSet(); | 201 final classes = makeClassSet(); |
| 202 expect(classes.containsAll(['foo', 'baz']), isTrue); |
| 203 expect(classes.containsAll(['foo', 'qux']), isFalse); |
173 expect(classes.containsAll(['foo', 'baz'].toSet()), isTrue); | 204 expect(classes.containsAll(['foo', 'baz'].toSet()), isTrue); |
174 expect(classes.containsAll(['foo', 'qux'].toSet()), isFalse); | 205 expect(classes.containsAll(['foo', 'qux'].toSet()), isFalse); |
175 }); | 206 }); |
176 | 207 |
177 test('intersection', () { | 208 test('intersection', () { |
178 final classes = makeClassSet(); | 209 final classes = makeClassSet(); |
179 expect(classes.intersection(['foo', 'qux', 'baz'].toSet()), | 210 expect(classes.intersection(['foo', 'qux', 'baz'].toSet()), |
180 unorderedEquals(['foo', 'baz'])); | 211 unorderedEquals(['foo', 'baz'])); |
181 }); | 212 }); |
182 | 213 |
183 test('clear', () { | 214 test('clear', () { |
184 final classes = makeClassSet(); | 215 final classes = makeClassSet(); |
185 classes.clear(); | 216 classes.clear(); |
186 expect(classes, equals([])); | 217 expect(classes, equals([])); |
187 }); | 218 }); |
188 | 219 |
189 test('order', () { | 220 test('order', () { |
190 var classes = makeClassSet(); | 221 var classes = makeClassSet(); |
191 classes.add('aardvark'); | 222 classes.add('aardvark'); |
192 expect(classes, orderedEquals(['foo', 'bar', 'baz', 'aardvark'])); | 223 expect(classes, orderedEquals(['foo', 'bar', 'baz', 'aardvark'])); |
193 classes.toggle('baz'); | 224 classes.toggle('baz'); |
194 expect(classes, orderedEquals(['foo', 'bar', 'aardvark'])); | 225 expect(classes, orderedEquals(['foo', 'bar', 'aardvark'])); |
195 classes.toggle('baz'); | 226 classes.toggle('baz'); |
196 expect(classes, orderedEquals(['foo', 'bar', 'aardvark', 'baz'])); | 227 expect(classes, orderedEquals(['foo', 'bar', 'aardvark', 'baz'])); |
197 }); | 228 }); |
198 | 229 |
| 230 |
199 Element listElement; | 231 Element listElement; |
200 | 232 |
201 ElementList<Element> listElementSetup() { | 233 ElementList<Element> listElementSetup() { |
202 listElement = makeListElement(); | 234 listElement = makeListElement(); |
203 document.documentElement.children.add(listElement); | 235 document.documentElement.children.add(listElement); |
204 return document.queryAll('li'); | 236 return document.querySelectorAll('li'); |
205 } | 237 } |
206 | 238 |
| 239 tearDown(() { |
| 240 if (listElement != null) { |
| 241 document.documentElement.children.remove(listElement); |
| 242 listElement = null; |
| 243 } |
| 244 }); |
| 245 |
| 246 test('list_view', () { |
| 247 // Test that the 'view' helper function is behaving. |
| 248 var elements = listElementSetup(); |
| 249 expect(view(elements.classes), '[classy, lassy, meta, quux, qux]'); |
| 250 expect(view(elements), |
| 251 '[[quux, qux], [meta], [classy, lassy], [lassy, qux]]'); |
| 252 }); |
| 253 |
207 test('listClasses=', () { | 254 test('listClasses=', () { |
208 var elements = listElementSetup(); | 255 var elements = listElementSetup(); |
209 elements.classes = ['foo', 'qux']; | 256 elements.classes = ['foo', 'qux']; |
210 elements = document.queryAll('li'); | 257 elements = document.queryAll('li'); |
211 for (Element e in elements) { | 258 for (Element e in elements) { |
212 expect(e.classes, orderedEquals(['foo', 'qux'])); | 259 expect(e.classes, orderedEquals(['foo', 'qux'])); |
213 expect(extractClasses(e), orderedEquals(['foo', 'qux'])); | 260 expect(extractClasses(e), orderedEquals(['foo', 'qux'])); |
214 } | 261 } |
215 | 262 |
216 elements.classes = []; | 263 elements.classes = []; |
217 for (Element e in elements) { | 264 expect(view(elements.classes), '[]'); |
218 expect(e.classes, []); | 265 expect(view(elements), '[[], [], [], []]'); |
219 } | |
220 document.documentElement.children.remove(listElement); | |
221 }); | 266 }); |
222 | 267 |
223 test('listMap', () { | 268 test('listMap', () { |
224 var elements = listElementSetup(); | 269 var elements = listElementSetup(); |
225 expect(elements.classes.map((c) => c.toUpperCase()).toList(), | 270 expect(elements.classes.map((c) => c.toUpperCase()).toList(), |
226 unorderedEquals(['QUX', 'QUUX', 'META', 'CLASSY', 'LASSY'])); | 271 unorderedEquals(['QUX', 'QUUX', 'META', 'CLASSY', 'LASSY'])); |
227 document.documentElement.children.remove(listElement); | |
228 }); | 272 }); |
229 | 273 |
230 test('listContains', () { | 274 test('listContains', () { |
231 var elements = listElementSetup(); | 275 var elements = listElementSetup(); |
232 expect(elements.classes.contains('lassy'), isTrue); | 276 expect(elements.classes.contains('lassy'), isTrue); |
233 expect(elements.classes.contains('foo'), isFalse); | 277 expect(elements.classes.contains('foo'), isFalse); |
234 document.documentElement.children.remove(listElement); | |
235 }); | 278 }); |
236 | 279 |
237 | 280 |
238 test('listAdd', () { | 281 test('listAdd', () { |
239 var elements = listElementSetup(); | 282 var elements = listElementSetup(); |
240 var added = elements.classes.add('lassie'); | 283 var added = elements.classes.add('lassie'); |
241 expect(added, isNull); | 284 expect(added, isNull); |
242 | 285 |
243 expect(elements.classes, | 286 expect(view(elements.classes), '[classy, lassie, lassy, meta, quux, qux]'); |
244 unorderedEquals(['lassie', 'qux', 'quux', 'meta', 'classy', 'lassy'])); | 287 expect(view(elements), |
245 for (Element e in elements) { | 288 '[[lassie, quux, qux], [lassie, meta], [classy, lassie, lassy], ' |
246 expect(e.classes, anyOf(unorderedEquals(['quux', 'qux', 'lassie']), | 289 '[lassie, lassy, qux]]'); |
247 unorderedEquals(['meta', 'lassie']), | |
248 unorderedEquals(['classy', 'lassy', 'lassie']), | |
249 unorderedEquals(['qux', 'lassy', 'lassie']))); | |
250 } | |
251 document.documentElement.children.remove(listElement); | |
252 }); | 290 }); |
253 | 291 |
254 test('listRemove', () { | 292 test('listRemove', () { |
255 var elements = listElementSetup(); | 293 var elements = listElementSetup(); |
256 expect(elements.classes.remove('lassi'), isFalse); | 294 expect(elements.classes.remove('lassi'), isFalse); |
257 expect(elements.classes, | 295 expect(view(elements.classes), '[classy, lassy, meta, quux, qux]'); |
258 unorderedEquals(['qux', 'quux', 'meta', 'classy', 'lassy'])); | 296 expect(view(elements), |
259 for (Element e in elements) { | 297 '[[quux, qux], [meta], [classy, lassy], [lassy, qux]]'); |
260 expect(e.classes, anyOf(unorderedEquals(['quux', 'qux']), | |
261 unorderedEquals(['meta']), unorderedEquals(['classy', 'lassy']), | |
262 unorderedEquals(['qux', 'lassy']))); | |
263 } | |
264 | 298 |
265 expect(elements.classes.remove('qux'), isTrue); | 299 expect(elements.classes.remove('qux'), isTrue); |
266 expect(elements.classes, | 300 expect(view(elements.classes), '[classy, lassy, meta, quux]'); |
267 unorderedEquals(['quux', 'meta', 'classy', 'lassy'])); | 301 expect(view(elements), '[[quux], [meta], [classy, lassy], [lassy]]'); |
268 for (Element e in elements) { | |
269 expect(e.classes, anyOf(unorderedEquals(['quux']), | |
270 unorderedEquals(['meta']), unorderedEquals(['classy', 'lassy']), | |
271 unorderedEquals(['lassy']))); | |
272 } | |
273 document.documentElement.children.remove(listElement); | |
274 }); | 302 }); |
275 | 303 |
276 test('listToggle', () { | 304 test('listToggle', () { |
277 var elements = listElementSetup(); | 305 var elements = listElementSetup(); |
278 elements.classes.toggle('qux'); | 306 elements.classes.toggle('qux'); |
279 expect(elements.classes, | 307 expect(view(elements.classes), '[classy, lassy, meta, quux, qux]'); |
280 unorderedEquals(['qux', 'quux', 'meta', 'classy', 'lassy'])); | 308 expect(view(elements), |
281 for (Element e in elements) { | 309 '[[quux], [meta, qux], [classy, lassy, qux], [lassy]]'); |
282 expect(e.classes, anyOf(unorderedEquals(['quux']), | |
283 unorderedEquals(['meta', 'qux']), unorderedEquals(['classy', 'lassy', | |
284 'qux']), unorderedEquals(['lassy']))); | |
285 } | |
286 document.documentElement.children.remove(listElement); | |
287 }); | 310 }); |
288 | 311 |
289 test('listAddAll', () { | 312 test('listAddAll', () { |
290 var elements = listElementSetup(); | 313 var elements = listElementSetup(); |
291 elements.classes.addAll(['qux', 'lassi', 'sassy']); | 314 elements.classes.addAll(['qux', 'lassi', 'sassy']); |
292 expect(elements.classes, | 315 expect(view(elements.classes), |
293 unorderedEquals(['qux', 'quux', 'meta', 'classy', 'lassy', 'sassy', | 316 '[classy, lassi, lassy, meta, quux, qux, sassy]'); |
294 'lassi'])); | 317 expect(view(elements), |
295 for (Element e in elements) { | 318 '[[lassi, quux, qux, sassy], [lassi, meta, qux, sassy], ' |
296 expect(e.classes, anyOf( | 319 '[classy, lassi, lassy, qux, sassy], [lassi, lassy, qux, sassy]]'); |
297 unorderedEquals(['quux', 'qux', 'lassi', 'sassy']), | |
298 unorderedEquals(['meta', 'qux', 'lassi', 'sassy']), | |
299 unorderedEquals(['classy', 'lassy', 'qux', 'lassi','sassy']), | |
300 unorderedEquals(['lassy', 'qux', 'lassi', 'sassy']))); | |
301 } | |
302 document.documentElement.children.remove(listElement); | |
303 }); | 320 }); |
304 | 321 |
305 test('listRemoveAll', () { | 322 test('listRemoveAll', () { |
306 var elements = listElementSetup(); | 323 var elements = listElementSetup(); |
307 elements.classes.removeAll(['qux', 'lassy', 'meta']); | 324 elements.classes.removeAll(['qux', 'lassy', 'meta']); |
308 expect(elements.classes, | 325 expect(view(elements.classes), '[classy, quux]'); |
309 unorderedEquals(['quux','classy'])); | 326 expect(view(elements), '[[quux], [], [classy], []]'); |
310 for (Element e in elements) { | 327 |
311 expect(e.classes, anyOf(unorderedEquals(['quux']), | |
312 unorderedEquals([]), unorderedEquals(['classy']))); | |
313 } | |
314 document.documentElement.children.remove(listElement); | |
315 }); | 328 }); |
316 | 329 |
317 test('listToggleAll', () { | 330 test('listToggleAll', () { |
318 var elements = listElementSetup(); | 331 var elements = listElementSetup(); |
319 elements.classes.toggleAll(['qux', 'meta', 'mornin']); | 332 elements.classes.toggleAll(['qux', 'meta', 'mornin']); |
320 expect(elements.classes, | 333 expect(view(elements.classes), '[classy, lassy, meta, mornin, quux, qux]'); |
321 unorderedEquals(['qux', 'quux', 'meta', 'classy', 'lassy', 'mornin'])); | 334 expect(view(elements), |
322 for (Element e in elements) { | 335 '[[meta, mornin, quux], [mornin, qux], ' |
323 expect(e.classes, anyOf(unorderedEquals(['quux', 'meta', 'mornin']), | 336 '[classy, lassy, meta, mornin, qux], [lassy, meta, mornin]]'); |
324 unorderedEquals(['qux', 'mornin']), | 337 |
325 unorderedEquals(['classy', 'lassy', 'qux', 'mornin', 'meta']), | 338 }); |
326 unorderedEquals(['lassy', 'mornin', 'meta']))); | 339 |
327 } | 340 test('listRetainAll', () { |
328 document.documentElement.children.remove(listElement); | 341 var elements = listElementSetup(); |
| 342 elements.classes.retainAll(['bar', 'baz', 'qux']); |
| 343 expect(view(elements.classes), '[qux]'); |
| 344 expect(view(elements), '[[qux], [], [], [qux]]'); |
| 345 }); |
| 346 |
| 347 test('listRemoveWhere', () { |
| 348 var elements = listElementSetup(); |
| 349 elements.classes.removeWhere((s) => s.startsWith('q')); |
| 350 expect(view(elements.classes), '[classy, lassy, meta]'); |
| 351 expect(view(elements), |
| 352 '[[], [meta], [classy, lassy], [lassy]]'); |
| 353 }); |
| 354 |
| 355 test('listRetainWhere', () { |
| 356 var elements = listElementSetup(); |
| 357 elements.classes.retainWhere((s) => s.startsWith('q')); |
| 358 expect(view(elements.classes), '[quux, qux]'); |
| 359 expect(view(elements), '[[quux, qux], [], [], [qux]]'); |
329 }); | 360 }); |
330 | 361 |
331 test('listContainsAll', () { | 362 test('listContainsAll', () { |
332 var elements = listElementSetup(); | 363 var elements = listElementSetup(); |
333 expect(elements.classes.containsAll(['qux', 'meta', 'mornin']), isFalse); | 364 expect(elements.classes.containsAll(['qux', 'meta', 'mornin']), isFalse); |
334 expect(elements.classes.containsAll(['qux', 'lassy', 'classy']), isTrue); | 365 expect(elements.classes.containsAll(['qux', 'lassy', 'classy']), isTrue); |
335 document.documentElement.children.remove(listElement); | |
336 }); | 366 }); |
337 } | 367 } |
OLD | NEW |