// 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  + ')';
  };
  self.makeE = function(){return new HTMLGoofyElement()};

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

  self.nativeConstructor(HTMLGoofyElement);
})()""");
  applyTestExtensions(['HTMLElement']);
}

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',
  );
}
