<sky>
<import src="../resources/dom-utils.sky" as="DomUtils" />
<script>
import "../resources/third_party/unittest/unittest.dart";
import "../resources/unit.dart";

import "dart:sky";

void main() {
  initUnit();

  var doc;

  var childElementCount = DomUtils.childElementCount;
  var childNodeCount = DomUtils.childNodeCount;

  setUp(() {
    doc = new Document();
  });

  test("should allow replacing the document element", () {
    var oldChild = doc.appendChild(doc.createElement("div"));
    expect(childElementCount(doc), equals(1));
    var newChild = doc.createElement("div");
    oldChild.replaceWith([newChild]);
    expect(childElementCount(doc), equals(1));
    expect(newChild.parentNode, equals(doc));
    expect(oldChild.parentNode, isNull);
  });

  test("should allow replacing a text child with an element", () {
    var oldChild = doc.appendChild(new Text("text here"));
    expect(childElementCount(doc), equals(0));
    expect(childNodeCount(doc), equals(1));
    var newChild = doc.createElement("div");
    oldChild.replaceWith([newChild]);
    expect(childElementCount(doc), equals(1));
    expect(childNodeCount(doc), equals(1));
    expect(newChild.parentNode, equals(doc));
    expect(oldChild.parentNode, isNull);
  });

  test("should allow replacing the document element with text", () {
    var oldChild = doc.appendChild(doc.createElement("div"));
    expect(childElementCount(doc), equals(1));
    var newChild = new Text(" text ");
    oldChild.replaceWith([newChild]);
    expect(childElementCount(doc), equals(0));
    expect(childNodeCount(doc), equals(1));
    expect(newChild.parentNode, equals(doc));
    expect(oldChild.parentNode, isNull);
  });

  test("should allow inserting text with a fragment", () {
    var fragment = doc.createDocumentFragment();
    fragment.appendChild(new Text(" text "));
    fragment.appendChild(new Text(" text "));
    expect(childNodeCount(doc), equals(0));
    doc.appendChild(fragment);
    expect(childElementCount(doc), equals(0));
    expect(childNodeCount(doc), equals(2));
  });

  test("should allow replacing the document element with a fragment", () {
    var oldChild = doc.appendChild(doc.createElement("div"));
    expect(childElementCount(doc), equals(1));
    var fragment = doc.createDocumentFragment();
    fragment.appendChild(new Text(" text "));
    var newChild = fragment.appendChild(doc.createElement("div"));
    fragment.appendChild(new Text(" "));
    oldChild.replaceWith([fragment]);
    expect(childElementCount(doc), equals(1));
    expect(childNodeCount(doc), equals(3));
    expect(newChild.parentNode, equals(doc));
    expect(oldChild.parentNode, isNull);
  });

  test("should throw when inserting multiple elements", () {
    doc.appendChild(doc.createElement("div"));
    var oldChild = doc.appendChild(new Text(" text "));
    expect(childElementCount(doc), equals(1));
    var newChild = doc.createElement("div");
    // expect(() {
    //   doc.replaceChild(newChild, 0);
    // }, throws);
    // expect(() {
    //   doc.insertBefore(newChild, oldChild);
    // }, throws);
  });

  test("should throw when inserting multiple elements with a fragment", () {
    var oldChild = doc.appendChild(doc.createElement("div"));
    expect(childElementCount(doc), equals(1));
    var fragment = doc.createDocumentFragment();
    fragment.appendChild(new Text(" text "));
    fragment.appendChild(doc.createElement("div"));
    fragment.appendChild(doc.createElement("div"));
    fragment.appendChild(new Text(" "));
    // expect(() {
    //   doc.replaceChild(fragment, 0);
    // }, throws);
    // expect(() {
    //   doc.insertBefore(fragment, oldChild);
    // }, throws);
  });
}
</script>
</sky>