// 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-where', () {
      List<Element> all = queryAll('*');
      Iterable<CanvasElement> canvases = all.where((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));
    });
}
