// 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.

// Put universally passing event constructors in this file.
// Move constructors that fail on some configuration to their own
// element_constructor_foo_test.dart file.

import 'dart:html';

import 'package:expect/minitest.dart';

main() {
  var isAnchorElement =
      predicate((x) => x is AnchorElement, 'is an AnchorElement');
  var isAreaElement =
      predicate((x) => x is AreaElement, 'is an AreaElement');
  var isDivElement = predicate((x) => x is DivElement, 'is a DivElement');
  var isCanvasElement =
      predicate((x) => x is CanvasElement, 'is a CanvasElement');
  var isParagraphElement =
      predicate((x) => x is ParagraphElement, 'is a ParagraphElement');
  var isSpanElement = predicate((x) => x is SpanElement, 'is a SpanElement');
  var isSelectElement =
      predicate((x) => x is SelectElement, 'is a SelectElement');

  test('anchor1', () {
      var e = new AnchorElement();
      expect(e, isAnchorElement);
    });

  test('anchor2', () {
      var e = new AnchorElement(href: '#blah');
      expect(e, isAnchorElement);
      expect(e.href.endsWith('#blah'), isTrue);
    });

  test('area', () {
      var e = new AreaElement();
      expect(e, isAreaElement);
    });

  // AudioElement tested in audioelement_test.dart

  test('div', () {
      var e = new DivElement();
      expect(e, isDivElement);
    });

  test('canvas1', () {
      var e = new CanvasElement();
      expect(e, isCanvasElement);
    });

  test('canvas2', () {
      var e = new CanvasElement(height: 100, width: 200);
      expect(e, isCanvasElement);
      expect(e.width, 200);
      expect(e.height, 100);
    });

  test('p', () {
      var e = new ParagraphElement();
      expect(e, isParagraphElement);
    });

  test('span', () {
      var e = new SpanElement();
      expect(e, isSpanElement);
    });

  test('select', () {
      var e = new SelectElement();
      expect(e, isSelectElement);
    });
}
