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