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

// @dart = 2.9

// 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);
  });
}
