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

import 'native_testing.dart';

// Test to see if novel HTML tags are interpreted as HTMLElement.

@Native("HTMLElement")
class Element {
  String dartMethod(int x) => 'dartMethod(${nativeMethod(x+1)})';
  String nativeMethod(int x) native;
}

makeE() native;
makeF() native;

void setup() {
  JS('', r"""
(function(){
  // A novel HTML element.
  function HTMLGoofyElement(){}
  HTMLGoofyElement.prototype.nativeMethod = function(a) {
    return 'Goofy.nativeMethod(' + a  + ')';
  };
  makeE = function(){return new HTMLGoofyElement()};

  // A non-HTML element with a misleading name.
  function HTMLFakeyElement(){}
  HTMLFakeyElement.prototype.nativeMethod = function(a) {
    return 'Fakey.nativeMethod(' + a  + ')';
  };
  makeF = function(){return new HTMLFakeyElement()};

  self.nativeConstructor(HTMLGoofyElement);
})()""");
}

main() {
  nativeTesting();
  setup();

  var e = makeE();
  Expect.equals('Goofy.nativeMethod(10)', e.nativeMethod(10));
  Expect.equals('dartMethod(Goofy.nativeMethod(11))', e.dartMethod(10));

  var f = makeF();
  Expect.throws(() => f.nativeMethod(20), (e) => e is NoSuchMethodError,
      'fake HTML Element must not run Dart method on native class');
  Expect.throws(() => f.dartMethod(20), (e) => e is NoSuchMethodError,
      'fake HTML Element must not run native method on native class');
}
