| 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"])); | 
| +  }); | 
| +} | 
|  |