// Copyright (c) 2012, 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 NodeListTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';

main() {
  useHtmlConfiguration();

  var isElement = predicate((x) => x is Element, 'is an Element');
  var isCanvasElement =
      predicate((x) => x is CanvasElement, 'is a CanvasElement');
  var isDivElement = predicate((x) => x is DivElement, 'is a isDivElement');

  var div = new DivElement();
  div.id = 'test';
  document.body.nodes.add(div);

  div.nodes.addAll([
      new DivElement(),
      new CanvasElement(),
      new DivElement(),
      new Text('Hello'),
      new DivElement(),
      new Text('World'),
      new CanvasElement()]);

  test('queryAll', () {
      List<Node> all = queryAll('*');
      for (var e in all) {
        expect(e, isElement);
      }
    });

  test('document.queryAll', () {
      List<Element> all1 = queryAll('*');
      List<Element> all2 = document.queryAll('*');
      expect(all1.length, equals(all2.length));
      for (var i = 0; i < all1.length; ++i) {
        expect(all1[i], equals(all2[i]));
      }
    });

  test('queryAll-canvas', () {
      List<CanvasElement> all = queryAll('canvas');
      for (var e in all) {
        expect(e, isCanvasElement);
      }
      expect(all.length, equals(2));
    });

  test('queryAll-contains', () {
      List<Element> all = queryAll('*');
      for (var e in all) {
        expect(all.contains(e), isTrue);
      }
    });

  test('queryAll-filter', () {
      List<Element> all = queryAll('*');
      List<CanvasElement> canvases = all.filter((e) => e is CanvasElement);
      for (var e in canvases) {
        expect(e is CanvasElement, isTrue);
      }
      expect(canvases.length, equals(2));
    });

  test('node.queryAll', () {
      List<Element> list = div.queryAll('*');
      expect(list.length, equals(5));
      expect(list[0], isDivElement);
      expect(list[1], isCanvasElement);
      expect(list[2], isDivElement);
      expect(list[3], isDivElement);
      expect(list[4], isCanvasElement);
    });

  test('immutable', () {
      List<Element> list = div.queryAll('*');
      int len = list.length;
      expect(() { list.add(new DivElement()); }, throwsUnsupportedError);
      expect(list.length, equals(len));
    });
}
