// 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('NodeTest');
#import('../../pkg/unittest/unittest.dart');
#import('../../pkg/unittest/html_config.dart');
#import('dart:html');

Node makeNode() => new Element.tag('div');
Node makeNodeWithChildren() =>
  new Element.html("<div>Foo<br/><!--baz--></div>");

main() {
  useHtmlConfiguration();

  test('replaceWith', () {
    final node = makeNodeWithChildren();
    final subnode = node.nodes[1];
    final out = subnode.replaceWith(new Text('Bar'));
    Expect.equals(subnode, out, '#replaceWith should be chainable');
    Expect.equals(3, node.nodes.length);
    Expect.isTrue(node.nodes[0] is Text);
    Expect.equals('Foo', node.nodes[0].text);
    Expect.isTrue(node.nodes[1] is Text);
    Expect.equals('Bar', node.nodes[1].text);
    Expect.isTrue(node.nodes[2] is Comment);
  });

  if (false) // TODO(antonm): fix it.
  test('remove', () {
    final node = makeNodeWithChildren();
    final subnode = node.nodes[1];
    final out = subnode.remove();
    Expect.equals(subnode, out, '#remove should be chainable');
    Expect.equals(2, node.nodes.length);
    Expect.isTrue(node.nodes[0] is Text);
    Expect.isTrue(node.nodes[1] is Comment);
  });

  test('contains', () {
    final Node node = new Element.html("<div>Foo<span>Bar</span></div>");
    Expect.isTrue(node.contains(node.nodes.first));
    Expect.isTrue(node.contains(node.nodes[1].nodes.first));
    Expect.isFalse(node.contains(new Text('Foo')));
  });

  group('nodes', () {
    test('is a NodeList', () {
      Expect.isTrue(makeNodeWithChildren().nodes is List<Node>);
    });

    test('first', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes.first is Text);
    });

    test('last', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes.last() is Comment);
    });

    test('forEach', () {
      var nodes = [];
      var node = makeNodeWithChildren();
      node.nodes.forEach((n) => nodes.add(n));
      Expect.isTrue(nodes[0] is Text);
      Expect.isTrue(nodes[1] is BRElement);
      Expect.isTrue(nodes[2] is Comment);
    });

    test('filter', () {
      var filtered = makeNodeWithChildren().nodes.filter((n) => n is BRElement);
      Expect.equals(1, filtered.length);
      Expect.isTrue(filtered[0] is BRElement);
      Expect.isTrue(filtered is List<Node>);
    });

    test('every', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes.every((n) => n is Node));
      Expect.isFalse(node.nodes.every((n) => n is Comment));
    });

    test('some', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes.some((n) => n is Comment));
      Expect.isFalse(node.nodes.some((n) => n is SVGElement));
    });

    test('isEmpty', () {
      Expect.isTrue(makeNode().nodes.isEmpty());
      Expect.isFalse(makeNodeWithChildren().nodes.isEmpty());
    });

    test('length', () {
      Expect.equals(0, makeNode().nodes.length);
      Expect.equals(3, makeNodeWithChildren().nodes.length);
    });

    test('[]', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes[0] is Text);
      Expect.isTrue(node.nodes[1] is BRElement);
      Expect.isTrue(node.nodes[2] is Comment);
    });

    test('[]=', () {
      var node = makeNodeWithChildren();
      node.nodes[1] = new Element.tag('hr');
      Expect.isTrue(node.nodes[0] is Text);
      Expect.isTrue(node.nodes[1] is HRElement);
      Expect.isTrue(node.nodes[2] is Comment);
    });

    test('add', () {
      var node = makeNode();
      node.nodes.add(new Element.tag('hr'));
      Expect.isTrue(node.nodes.last() is HRElement);
    });

    test('addLast', () {
      var node = makeNode();
      node.nodes.addLast(new Element.tag('hr'));
      Expect.isTrue(node.nodes.last() is HRElement);
    });

    test('iterator', () {
      var nodes = [];
      var node = makeNodeWithChildren();
      for (var subnode in node.nodes) {
        nodes.add(subnode);
      }
      Expect.isTrue(nodes[0] is Text);
      Expect.isTrue(nodes[1] is BRElement);
      Expect.isTrue(nodes[2] is Comment);
    });

    test('addAll', () {
      var node = makeNodeWithChildren();
      node.nodes.addAll([
        new Element.tag('hr'),
        new Element.tag('img'),
        new Element.tag('input')
      ]);
      Expect.isTrue(node.nodes[0] is Text);
      Expect.isTrue(node.nodes[1] is BRElement);
      Expect.isTrue(node.nodes[2] is Comment);
      Expect.isTrue(node.nodes[3] is HRElement);
      Expect.isTrue(node.nodes[4] is ImageElement);
      Expect.isTrue(node.nodes[5] is InputElement);
    });

    test('clear', () {
      var node = makeNodeWithChildren();
      node.nodes.clear();
      Expect.listEquals([], node.nodes);
    });

    test('removeLast', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes.removeLast() is Comment);
      Expect.equals(2, node.nodes.length);
      Expect.isTrue(node.nodes.removeLast() is BRElement);
      Expect.equals(1, node.nodes.length);
    });

    test('getRange', () {
      var node = makeNodeWithChildren();
      Expect.isTrue(node.nodes.getRange(1, 2) is List<Node>);
    });
  });

  group('_NodeList', () {
    List<Node> makeNodeList() =>
      makeNodeWithChildren().nodes.filter((_) => true);

    test('first', () {
      var nodes = makeNodeList();
      Expect.isTrue(nodes.first is Text);
    });

    test('filter', () {
      var filtered = makeNodeList().filter((n) => n is BRElement);
      Expect.equals(1, filtered.length);
      Expect.isTrue(filtered[0] is BRElement);
      Expect.isTrue(filtered is List<Node>);
    });

    test('getRange', () {
      var range = makeNodeList().getRange(1, 2);
      Expect.isTrue(range is List<Node>);
      Expect.isTrue(range[0] is BRElement);
      Expect.isTrue(range[1] is Comment);
    });
  });
}
