Index: test/codegen/lib/html/documentfragment_test.dart |
diff --git a/test/codegen/lib/html/documentfragment_test.dart b/test/codegen/lib/html/documentfragment_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b09c04d6f08ef53432631096bc1d55416188dd63 |
--- /dev/null |
+++ b/test/codegen/lib/html/documentfragment_test.dart |
@@ -0,0 +1,180 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library DocumentFragmentTest; |
+import 'package:unittest/unittest.dart'; |
+import 'package:unittest/html_config.dart'; |
+import 'util.dart'; |
+import 'dart:html'; |
+ |
+main() { |
+ useHtmlConfiguration(); |
+ |
+ var isAnchorElement = |
+ predicate((x) => x is AnchorElement, 'is an AnchorElement'); |
+ |
+ List<String> _nodeStrings(Iterable<Node> input) { |
+ var out = new List<String>(); |
+ for (Node n in input) { |
+ if (n is Element) { |
+ Element e = n; |
+ out.add(e.tagName); |
+ } else { |
+ out.add(n.text); |
+ } |
+ } |
+ return out; |
+ }; |
+ |
+ assertConstError(void fn()) { |
+ try { |
+ fn(); |
+ } catch (e) { |
+ if (e is UnsupportedError) { |
+ return; |
+ } |
+ } |
+ expect(true, isFalse, reason: 'Expected immutability error'); |
+ }; |
+ |
+ void expectEmptyStyleDeclaration(CssStyleDeclaration style) { |
+ expect(style.cssText, equals('')); |
+ expect(style.getPropertyPriority('color'), equals('')); |
+ expect(style.item(0), equals('')); |
+ expect(style.length, isZero); |
+ // TODO(jacobr): these checks throw UnimplementedErrors in dartium. |
+ // expect(style.parentRule, isNull); |
+ // expect(style.getPropertyCssValue('color'), isNull); |
+ // expect(style.getPropertyShorthand('color'), isNull); |
+ // expect(style.isPropertyImplicit('color'), isFalse); |
+ |
+ // Ideally these would throw errors, but it's not possible to create a class |
+ // that'll intercept these calls without implementing the entire |
+ // CssStyleDeclaration interface, so we'll settle for them being no-ops. |
+ style.cssText = '* {color: blue}'; |
+ style.removeProperty('color'); |
+ style.setProperty('color', 'blue'); |
+ } |
+ |
+ group('constructors', () { |
+ test('0-argument makes an empty fragment', () { |
+ final fragment = new DocumentFragment(); |
+ expect(fragment.children, equals([])); |
+ }); |
+ |
+ test('.html parses input as HTML', () { |
+ final fragment = new DocumentFragment.html('<a>foo</a>'); |
+ expect(fragment.children[0], isAnchorElement); |
+ }); |
+ |
+ // test('.svg parses input as SVG', () { |
+ // final fragment = new DocumentFragment.svg('<a>foo</a>'); |
+ // expect(fragment.children[0] is SVGAElement, isTrue); |
+ // }); |
+ |
+ // TODO(nweiz): enable this once XML is ported. |
+ // test('.xml parses input as XML', () { |
+ // final fragment = new DocumentFragment.xml('<a>foo</a>'); |
+ // expect(fragment.children[0] is XMLElement, isTrue); |
+ // }); |
+ }); |
+ |
+ group('children', () { |
+ var fragment; |
+ var children; |
+ |
+ init() { |
+ fragment = new DocumentFragment(); |
+ children = fragment.children; |
+ fragment.nodes.addAll( |
+ [new Text("1"), new Element.tag("A"), new Element.tag("B"), |
+ new Text("2"), new Element.tag("I"), new Text("3"), |
+ new Element.tag("U")]); |
+ }; |
+ |
+ test('is initially empty', () { |
+ children = new DocumentFragment().children; |
+ expect(children, equals([])); |
+ expect(children.isEmpty, isTrue); |
+ }); |
+ |
+ test('filters out non-element nodes', () { |
+ init(); |
+ expect(_nodeStrings(fragment.nodes), |
+ orderedEquals(["1", "A", "B", "2", "I", "3", "U"])); |
+ expect(_nodeStrings(children), |
+ orderedEquals(["A", "B", "I", "U"])); |
+ }); |
+ |
+ test('only indexes children, not other nodes', () { |
+ init(); |
+ children[1] = new Element.tag("BR"); |
+ expect(_nodeStrings(fragment.nodes), |
+ orderedEquals(["1", "A", "BR", "2", "I", "3", "U"])); |
+ expect(_nodeStrings(children), |
+ orderedEquals(["A", "BR", "I", "U"])); |
+ }); |
+ |
+ test('adds to both children and nodes', () { |
+ init(); |
+ children.add(new Element.tag("UL")); |
+ expect(_nodeStrings(fragment.nodes), |
+ orderedEquals(["1", "A", "B", "2", "I", "3", "U", "UL"])); |
+ expect(_nodeStrings(children), |
+ orderedEquals(["A", "B", "I", "U", "UL"])); |
+ }); |
+ |
+ test('removes only children, from both children and nodes', () { |
+ init(); |
+ expect(children.removeLast().tagName, equals('U')); |
+ expect(_nodeStrings(fragment.nodes), |
+ orderedEquals(["1", "A", "B", "2", "I", "3"])); |
+ expect(_nodeStrings(children), |
+ orderedEquals(["A", "B", "I"])); |
+ |
+ expect(children.removeLast().tagName, "I"); |
+ expect(_nodeStrings(fragment.nodes), |
+ equals(["1", "A", "B", "2", "3"])); |
+ expect(_nodeStrings(children), equals(["A", "B"])); |
+ }); |
+ |
+ test('accessors are wrapped', () { |
+ init(); |
+ expect(children[0].tagName, "A"); |
+ expect(_nodeStrings(children.where((e) => e.tagName == "I")), ["I"]); |
+ expect(children.every((e) => e is Element), isTrue); |
+ expect(children.any((e) => e.tagName == "U"), isTrue); |
+ expect(children.isEmpty, isFalse); |
+ expect(children.length, 4); |
+ expect(children[2].tagName, "I"); |
+ expect(children.last.tagName, "U"); |
+ }); |
+ |
+ test('setting children overwrites nodes as well', () { |
+ init(); |
+ fragment.children = [new Element.tag("DIV"), new Element.tag("HEAD")]; |
+ expect(_nodeStrings(fragment.nodes), equals(["DIV", "HEAD"])); |
+ }); |
+ }); |
+ |
+ test('setting innerHtml works', () { |
+ var fragment = new DocumentFragment(); |
+ fragment.append(new Text("foo")); |
+ fragment.innerHtml = "<a>bar</a>baz"; |
+ expect(_nodeStrings(fragment.nodes), equals(["A", "baz"])); |
+ }); |
+ |
+ test('getting innerHtml works', () { |
+ var fragment = new DocumentFragment(); |
+ fragment.nodes.addAll([new Text("foo"), new Element.html("<A>bar</A>")]); |
+ expect(fragment.innerHtml, "foo<a>bar</a>"); |
+ }); |
+ |
+ test('query searches the fragment', () { |
+ var fragment = new DocumentFragment.html( |
+ "<div class='foo'><a>foo</a><b>bar</b></div>"); |
+ expect(fragment.query(".foo a").tagName, "A"); |
+ expect(_nodeStrings(fragment.queryAll(".foo *")), equals(["A", "B"])); |
+ }); |
+} |