// Copyright (c) 2012, 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';

@Native("A")
class A {}

A makeA() native;

void setup() {
  JS('', r"""
(function(){
  function A() {};
  A.prototype.foo = function() { return  42; };
  self.makeA = function() { return new A() };
  self.nativeConstructor(A);
})()""");
  applyTestExtensions(['A']);
}

class B {
  foo() {
    return 42;
  }
}

class C {
  // By having two 'foo' defined in the application, Frog will mangle
  // all calls to 'foo', which makes this test pass.
  foo(x) {
    return 43;
  }
}

inferredContext() {
  dynamic a = makeA();
  Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError);
  Expect.throws(() => a.foo, (e) => e is NoSuchMethodError);
  Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError);
}

untypedContext() {
  var a = confuse(makeA());
  Expect.throws(() => a.foo(), (e) => e is NoSuchMethodError);
  Expect.throws(() => a.foo, (e) => e is NoSuchMethodError);
  Expect.throws(() => a.foo = 4, (e) => e is NoSuchMethodError);
}

main() {
  nativeTesting();
  setup();
  confuse(new B()).foo();
  confuse(new C()).foo(1);
  inferredContext();
  untypedContext();
}
