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

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