OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 library ElementTest; |
| 6 import 'package:unittest/unittest.dart'; |
| 7 import 'package:unittest/html_config.dart'; |
| 8 import 'dart:collection'; |
| 9 import 'dart:html'; |
| 10 |
| 11 Element makeElement() => new Element.tag('div'); |
| 12 |
| 13 Element makeElementWithClasses() => |
| 14 new Element.html('<div class="foo bar baz"></div>'); |
| 15 |
| 16 Set<String> makeClassSet() => makeElementWithClasses().classes; |
| 17 |
| 18 Element makeListElement() => |
| 19 new Element.html('<ul class="foo bar baz">' |
| 20 '<li class="quux qux">' |
| 21 '<li class="meta">' |
| 22 '<li class="classy lassy">' |
| 23 '<li class="qux lassy">' |
| 24 '</ul>'); |
| 25 |
| 26 Element listElement; |
| 27 |
| 28 ElementList<Element> listElementSetup() { |
| 29 listElement = makeListElement(); |
| 30 document.documentElement.children.add(listElement); |
| 31 return document.querySelectorAll('li'); |
| 32 } |
| 33 |
| 34 void listElementTearDown() { |
| 35 if (listElement != null) { |
| 36 document.documentElement.children.remove(listElement); |
| 37 listElement = null; |
| 38 } |
| 39 } |
| 40 |
| 41 /// Returns a canonical string for Set<String> and lists of Element's classes. |
| 42 String view(var e) { |
| 43 if (e is Set) return '${e.toList()..sort()}'; |
| 44 if (e is Element) return view(e.classes); |
| 45 if (e is Iterable) return '${e.map(view).toList()}'; |
| 46 throw new ArgumentError('Cannot make canonical view string for: $e}'); |
| 47 } |
| 48 |
| 49 main() { |
| 50 useHtmlConfiguration(); |
| 51 |
| 52 Set<String> extractClasses(Element el) { |
| 53 final match = new RegExp('class="([^"]+)"').firstMatch(el.outerHtml); |
| 54 return new LinkedHashSet.from(match[1].split(' ')); |
| 55 } |
| 56 |
| 57 |
| 58 test('affects the "class" attribute', () { |
| 59 final el = makeElementWithClasses(); |
| 60 el.classes.add('qux'); |
| 61 expect(extractClasses(el), orderedEquals(['foo', 'bar', 'baz', 'qux'])); |
| 62 }); |
| 63 |
| 64 test('is affected by the "class" attribute', () { |
| 65 final el = makeElementWithClasses(); |
| 66 el.attributes['class'] = 'foo qux'; |
| 67 expect(el.classes, orderedEquals(['foo', 'qux'])); |
| 68 }); |
| 69 |
| 70 test('classes=', () { |
| 71 final el = makeElementWithClasses(); |
| 72 el.classes = ['foo', 'qux']; |
| 73 expect(el.classes, orderedEquals(['foo', 'qux'])); |
| 74 expect(extractClasses(el), orderedEquals(['foo', 'qux'])); |
| 75 }); |
| 76 |
| 77 test('toString', () { |
| 78 expect(makeClassSet().toString().split(' '), |
| 79 orderedEquals(['foo', 'bar', 'baz'])); |
| 80 expect(makeElement().classes.toString(), ''); |
| 81 }); |
| 82 |
| 83 test('forEach', () { |
| 84 final classes = <String>[]; |
| 85 makeClassSet().forEach(classes.add); |
| 86 expect(classes, orderedEquals(['foo', 'bar', 'baz'])); |
| 87 }); |
| 88 |
| 89 test('iterator', () { |
| 90 final classes = <String>[]; |
| 91 for (var el in makeClassSet()) { |
| 92 classes.add(el); |
| 93 } |
| 94 expect(classes, orderedEquals(['foo', 'bar', 'baz'])); |
| 95 }); |
| 96 |
| 97 test('map', () { |
| 98 expect(makeClassSet().map((c) => c.toUpperCase()).toList(), |
| 99 orderedEquals(['FOO', 'BAR', 'BAZ'])); |
| 100 }); |
| 101 |
| 102 test('where', () { |
| 103 expect(makeClassSet().where((c) => c.contains('a')).toList(), |
| 104 orderedEquals(['bar', 'baz'])); |
| 105 }); |
| 106 |
| 107 test('every', () { |
| 108 expect(makeClassSet().every((c) => c is String), isTrue); |
| 109 expect(makeClassSet().every((c) => c.contains('a')), isFalse); |
| 110 }); |
| 111 |
| 112 test('any', () { |
| 113 expect(makeClassSet().any((c) => c.contains('a')), isTrue); |
| 114 expect(makeClassSet().any((c) => c is num), isFalse); |
| 115 }); |
| 116 |
| 117 test('isEmpty', () { |
| 118 expect(makeClassSet().isEmpty, isFalse); |
| 119 expect(makeElement().classes.isEmpty, isTrue); |
| 120 }); |
| 121 |
| 122 test('length', () { |
| 123 expect(makeClassSet().length, 3); |
| 124 expect(makeElement().classes.length, 0); |
| 125 }); |
| 126 |
| 127 test('contains', () { |
| 128 expect(makeClassSet().contains('foo'), isTrue); |
| 129 expect(makeClassSet().contains('qux'), isFalse); |
| 130 }); |
| 131 |
| 132 test('contains-bad', () { |
| 133 // Non-strings return `false`. |
| 134 // Strings need to be valid tokens. |
| 135 final classes = makeClassSet(); |
| 136 expect(classes.contains(1), isFalse); |
| 137 expect(() => classes.contains(''), throws); |
| 138 expect(() => classes.contains('foo bar'), throws); |
| 139 }); |
| 140 |
| 141 test('add', () { |
| 142 final classes = makeClassSet(); |
| 143 var added = classes.add('qux'); |
| 144 expect(added, isTrue); |
| 145 expect(classes, orderedEquals(['foo', 'bar', 'baz', 'qux'])); |
| 146 |
| 147 added = classes.add('qux'); |
| 148 expect(added, isFalse); |
| 149 final list = new List.from(classes); |
| 150 list.sort((a, b) => a.compareTo(b)); |
| 151 expect(list, orderedEquals(['bar', 'baz', 'foo', 'qux']), |
| 152 reason: "The class set shouldn't have duplicate elements."); |
| 153 }); |
| 154 |
| 155 test('add-bad', () { |
| 156 final classes = makeClassSet(); |
| 157 expect(() => classes.add(''), throws); |
| 158 expect(() => classes.add('foo bar'), throws); |
| 159 }); |
| 160 |
| 161 test('remove', () { |
| 162 final classes = makeClassSet(); |
| 163 classes.remove('bar'); |
| 164 expect(classes, orderedEquals(['foo', 'baz'])); |
| 165 classes.remove('qux'); |
| 166 expect(classes, orderedEquals(['foo', 'baz'])); |
| 167 }); |
| 168 |
| 169 test('remove-bad', () { |
| 170 final classes = makeClassSet(); |
| 171 expect(() => classes.remove(''), throws); |
| 172 expect(() => classes.remove('foo bar'), throws); |
| 173 }); |
| 174 |
| 175 test('toggle', () { |
| 176 final classes = makeClassSet(); |
| 177 classes.toggle('bar'); |
| 178 expect(classes, orderedEquals(['foo', 'baz'])); |
| 179 classes.toggle('qux'); |
| 180 expect(classes, orderedEquals(['foo', 'baz', 'qux'])); |
| 181 |
| 182 classes.toggle('qux', true); |
| 183 expect(classes, orderedEquals(['foo', 'baz', 'qux'])); |
| 184 classes.toggle('qux', false); |
| 185 expect(classes, orderedEquals(['foo', 'baz'])); |
| 186 classes.toggle('qux', false); |
| 187 expect(classes, orderedEquals(['foo', 'baz'])); |
| 188 classes.toggle('qux', true); |
| 189 expect(classes, orderedEquals(['foo', 'baz', 'qux'])); |
| 190 }); |
| 191 |
| 192 test('toggle-bad', () { |
| 193 final classes = makeClassSet(); |
| 194 expect(() => classes.toggle(''), throws); |
| 195 expect(() => classes.toggle('', true), throws); |
| 196 expect(() => classes.toggle('', false), throws); |
| 197 expect(() => classes.toggle('foo bar'), throws); |
| 198 expect(() => classes.toggle('foo bar', true), throws); |
| 199 expect(() => classes.toggle('foo bar', false), throws); |
| 200 }); |
| 201 |
| 202 test('addAll', () { |
| 203 final classes = makeClassSet(); |
| 204 classes.addAll(['bar', 'qux', 'bip']); |
| 205 expect(classes, orderedEquals(['foo', 'bar', 'baz', 'qux', 'bip'])); |
| 206 }); |
| 207 |
| 208 test('removeAll', () { |
| 209 final classes = makeClassSet(); |
| 210 classes.removeAll(['bar', 'baz', 'qux']); |
| 211 expect(classes, orderedEquals(['foo'])); |
| 212 }); |
| 213 |
| 214 test('toggleAll', () { |
| 215 final classes = makeClassSet(); |
| 216 classes.toggleAll(['bar', 'foo']); |
| 217 expect(classes, orderedEquals(['baz'])); |
| 218 classes.toggleAll(['qux', 'quux']); |
| 219 expect(classes, orderedEquals(['baz', 'qux', 'quux'])); |
| 220 classes.toggleAll(['bar', 'foo'], true); |
| 221 expect(classes, orderedEquals(['baz', 'qux', 'quux', 'bar', 'foo'])); |
| 222 classes.toggleAll(['baz', 'quux'], false); |
| 223 expect(classes, orderedEquals(['qux','bar', 'foo'])); |
| 224 }); |
| 225 |
| 226 test('retainAll', () { |
| 227 final classes = makeClassSet(); |
| 228 classes.retainAll(['bar', 'baz', 'qux']); |
| 229 expect(classes, orderedEquals(['bar', 'baz'])); |
| 230 }); |
| 231 |
| 232 test('removeWhere', () { |
| 233 final classes = makeClassSet(); |
| 234 classes.removeWhere((s) => s.startsWith('b')); |
| 235 expect(classes, orderedEquals(['foo'])); |
| 236 }); |
| 237 |
| 238 test('retainWhere', () { |
| 239 final classes = makeClassSet(); |
| 240 classes.retainWhere((s) => s.startsWith('b')); |
| 241 expect(classes, orderedEquals(['bar', 'baz'])); |
| 242 }); |
| 243 |
| 244 test('containsAll', () { |
| 245 final classes = makeClassSet(); |
| 246 expect(classes.containsAll(['foo', 'baz']), isTrue); |
| 247 expect(classes.containsAll(['foo', 'qux']), isFalse); |
| 248 expect(classes.containsAll(['foo', 'baz'].toSet()), isTrue); |
| 249 expect(classes.containsAll(['foo', 'qux'].toSet()), isFalse); |
| 250 }); |
| 251 |
| 252 test('intersection', () { |
| 253 final classes = makeClassSet(); |
| 254 expect(classes.intersection(['foo', 'qux', 'baz'].toSet()), |
| 255 unorderedEquals(['foo', 'baz'])); |
| 256 }); |
| 257 |
| 258 test('clear', () { |
| 259 final classes = makeClassSet(); |
| 260 classes.clear(); |
| 261 expect(classes, equals([])); |
| 262 }); |
| 263 |
| 264 test('order', () { |
| 265 var classes = makeClassSet(); |
| 266 classes.add('aardvark'); |
| 267 expect(classes, orderedEquals(['foo', 'bar', 'baz', 'aardvark'])); |
| 268 classes.toggle('baz'); |
| 269 expect(classes, orderedEquals(['foo', 'bar', 'aardvark'])); |
| 270 classes.toggle('baz'); |
| 271 expect(classes, orderedEquals(['foo', 'bar', 'aardvark', 'baz'])); |
| 272 }); |
| 273 |
| 274 tearDown(listElementTearDown); |
| 275 |
| 276 test('list_view', () { |
| 277 // Test that the 'view' helper function is behaving. |
| 278 var elements = listElementSetup(); |
| 279 expect(view(elements.classes), '[classy, lassy, meta, quux, qux]'); |
| 280 expect(view(elements), |
| 281 '[[quux, qux], [meta], [classy, lassy], [lassy, qux]]'); |
| 282 }); |
| 283 |
| 284 test('listClasses=', () { |
| 285 var elements = listElementSetup(); |
| 286 elements.classes = ['foo', 'qux']; |
| 287 elements = document.queryAll('li'); |
| 288 for (Element e in elements) { |
| 289 expect(e.classes, orderedEquals(['foo', 'qux'])); |
| 290 expect(extractClasses(e), orderedEquals(['foo', 'qux'])); |
| 291 } |
| 292 |
| 293 elements.classes = []; |
| 294 expect(view(elements.classes), '[]'); |
| 295 expect(view(elements), '[[], [], [], []]'); |
| 296 }); |
| 297 |
| 298 test('listMap', () { |
| 299 var elements = listElementSetup(); |
| 300 expect(elements.classes.map((c) => c.toUpperCase()).toList(), |
| 301 unorderedEquals(['QUX', 'QUUX', 'META', 'CLASSY', 'LASSY'])); |
| 302 }); |
| 303 |
| 304 test('listContains', () { |
| 305 var elements = listElementSetup(); |
| 306 expect(elements.classes.contains('lassy'), isTrue); |
| 307 expect(elements.classes.contains('foo'), isFalse); |
| 308 }); |
| 309 |
| 310 |
| 311 test('listAdd', () { |
| 312 var elements = listElementSetup(); |
| 313 var added = elements.classes.add('lassie'); |
| 314 expect(added, isNull); |
| 315 |
| 316 expect(view(elements.classes), '[classy, lassie, lassy, meta, quux, qux]'); |
| 317 expect(view(elements), |
| 318 '[[lassie, quux, qux], [lassie, meta], [classy, lassie, lassy], ' |
| 319 '[lassie, lassy, qux]]'); |
| 320 }); |
| 321 |
| 322 test('listRemove', () { |
| 323 var elements = listElementSetup(); |
| 324 expect(elements.classes.remove('lassi'), isFalse); |
| 325 expect(view(elements.classes), '[classy, lassy, meta, quux, qux]'); |
| 326 expect(view(elements), |
| 327 '[[quux, qux], [meta], [classy, lassy], [lassy, qux]]'); |
| 328 |
| 329 expect(elements.classes.remove('qux'), isTrue); |
| 330 expect(view(elements.classes), '[classy, lassy, meta, quux]'); |
| 331 expect(view(elements), '[[quux], [meta], [classy, lassy], [lassy]]'); |
| 332 }); |
| 333 |
| 334 test('listToggle', () { |
| 335 var elements = listElementSetup(); |
| 336 elements.classes.toggle('qux'); |
| 337 expect(view(elements.classes), '[classy, lassy, meta, quux, qux]'); |
| 338 expect(view(elements), |
| 339 '[[quux], [meta, qux], [classy, lassy, qux], [lassy]]'); |
| 340 }); |
| 341 |
| 342 test('listAddAll', () { |
| 343 var elements = listElementSetup(); |
| 344 elements.classes.addAll(['qux', 'lassi', 'sassy']); |
| 345 expect(view(elements.classes), |
| 346 '[classy, lassi, lassy, meta, quux, qux, sassy]'); |
| 347 expect(view(elements), |
| 348 '[[lassi, quux, qux, sassy], [lassi, meta, qux, sassy], ' |
| 349 '[classy, lassi, lassy, qux, sassy], [lassi, lassy, qux, sassy]]'); |
| 350 }); |
| 351 |
| 352 test('listRemoveAll', () { |
| 353 var elements = listElementSetup(); |
| 354 elements.classes.removeAll(['qux', 'lassy', 'meta']); |
| 355 expect(view(elements.classes), '[classy, quux]'); |
| 356 expect(view(elements), '[[quux], [], [classy], []]'); |
| 357 |
| 358 }); |
| 359 |
| 360 test('listToggleAll', () { |
| 361 var elements = listElementSetup(); |
| 362 elements.classes.toggleAll(['qux', 'meta', 'mornin']); |
| 363 expect(view(elements.classes), '[classy, lassy, meta, mornin, quux, qux]'); |
| 364 expect(view(elements), |
| 365 '[[meta, mornin, quux], [mornin, qux], ' |
| 366 '[classy, lassy, meta, mornin, qux], [lassy, meta, mornin]]'); |
| 367 |
| 368 }); |
| 369 |
| 370 test('listRetainAll', () { |
| 371 var elements = listElementSetup(); |
| 372 elements.classes.retainAll(['bar', 'baz', 'qux']); |
| 373 expect(view(elements.classes), '[qux]'); |
| 374 expect(view(elements), '[[qux], [], [], [qux]]'); |
| 375 }); |
| 376 |
| 377 test('listRemoveWhere', () { |
| 378 var elements = listElementSetup(); |
| 379 elements.classes.removeWhere((s) => s.startsWith('q')); |
| 380 expect(view(elements.classes), '[classy, lassy, meta]'); |
| 381 expect(view(elements), |
| 382 '[[], [meta], [classy, lassy], [lassy]]'); |
| 383 }); |
| 384 |
| 385 test('listRetainWhere', () { |
| 386 var elements = listElementSetup(); |
| 387 elements.classes.retainWhere((s) => s.startsWith('q')); |
| 388 expect(view(elements.classes), '[quux, qux]'); |
| 389 expect(view(elements), '[[quux, qux], [], [], [qux]]'); |
| 390 }); |
| 391 |
| 392 test('listContainsAll', () { |
| 393 var elements = listElementSetup(); |
| 394 expect(elements.classes.containsAll(['qux', 'meta', 'mornin']), isFalse); |
| 395 expect(elements.classes.containsAll(['qux', 'lassy', 'classy']), isTrue); |
| 396 }); |
| 397 } |
OLD | NEW |