// Copyright (c) 2013, 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.

// Tests the functionality of js_util with HTML objects.

@JS()
library js_util_test;

import 'dart:html';

import 'package:js/js.dart';
import 'package:js/js_util.dart' as js_util;
import 'package:expect/minitest.dart';

@JS()
external void eval(String code);

@JS('Node')
external get JSNodeType;

@JS('Element')
external get JSElementType;

@JS('Text')
external get JSTextType;

@JS('HTMLCanvasElement')
external get JSHtmlCanvasElementType;

@JS()
class Foo {
  external Foo();
}

main() {
  eval(r""" function Foo() {} """);

  test('hasProperty', () {
    var textElement = new Text('foo');
    expect(js_util.hasProperty(textElement, 'data'), isTrue);
  });

  test('getProperty', () {
    var textElement = new Text('foo');
    expect(js_util.getProperty(textElement, 'data'), equals('foo'));
  });

  test('setProperty', () {
    var textElement = new Text('foo');
    js_util.setProperty(textElement, 'data', 'bar');
    expect(textElement.text, equals('bar'));
  });

  test('callMethod', () {
    var canvas = new CanvasElement();
    expect(
        identical(canvas.getContext('2d'),
            js_util.callMethod(canvas, 'getContext', ['2d'])),
        isTrue);
  });

  test('instanceof', () {
    var canvas = new Element.tag('canvas');
    expect(js_util.instanceof(canvas, JSNodeType), isTrue);
    expect(js_util.instanceof(canvas, JSTextType), isFalse);
    expect(js_util.instanceof(canvas, JSElementType), isTrue);
    expect(js_util.instanceof(canvas, JSHtmlCanvasElementType), isTrue);
    var div = new Element.tag('div');
    expect(js_util.instanceof(div, JSNodeType), isTrue);
    expect(js_util.instanceof(div, JSTextType), isFalse);
    expect(js_util.instanceof(div, JSElementType), isTrue);
    expect(js_util.instanceof(div, JSHtmlCanvasElementType), isFalse);

    var text = new Text('foo');
    expect(js_util.instanceof(text, JSNodeType), isTrue);
    expect(js_util.instanceof(text, JSTextType), isTrue);
    expect(js_util.instanceof(text, JSElementType), isFalse);

    var f = new Foo();
    expect(js_util.instanceof(f, JSNodeType), isFalse);
  });

  test('callConstructor', () {
    var textNode = js_util.callConstructor(JSTextType, ['foo']);
    expect(js_util.instanceof(textNode, JSTextType), isTrue);
    expect(textNode is Text, isTrue);
    expect(textNode.text, equals('foo'));
  });
}
