// 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";

// Verify that methods are not renamed to clash with native field names
// that are known from the DOM (like x, y, z).
@Native("A")
class A {
  void set x(int unused) native;
  int get x native;
  void set y(int unused) native;
  int get y native;
  void set z(int unused) native;
  int get z native;
  void set gettersCalled(int unused) native;
  int get gettersCalled native;
}

void setup() {
  JS('', r"""
(function(){
  function getter() {
    this.gettersCalled++;
    return 42;
  }

  function A(){
    var a = Object.create(
        { constructor: A },
        { x: { get: getter, configurable: false, writeable: false },
          y: { get: getter, configurable: false, writeable: false },
          z: { get: getter, configurable: false, writeable: false }
        });
    a.gettersCalled = 0;
    return a;
  }

  self.makeA = function() { return new A(); };
  self.nativeConstructor(A);
})()""");
  applyTestExtensions(['A']);
}

A makeA() native;

class B {
  void a() {}
  void a0() {}
  void a1() {}
  void a2() {}
  void a3() {}
  void a4() {}
  void a5() {}
  void a6() {}
  void a7() {}
  void a8() {}
  void a9() {}
  void a10() {}
  void a11() {}
  void a12() {}
  void a13() {}
  void a14() {}
  void a15() {}
  void a16() {}
  void a17() {}
  void a18() {}
  void a19() {}
  void a20() {}
  void a21() {}
  void a22() {}
  void a23() {}
  void a24() {}
  void a25() {}
  void a26() {}
  int z = 0;
}

int inscrutable(int x) => x == 0 ? 0 : x | inscrutable(x & (x - 1));

main() {
  nativeTesting();
  setup();
  confuse(new B()).a();
  var x = confuse(makeA());
  // Each of these will throw, because an instance of A doesn't have any of
  // these functions.  The important thing is that none of them have been
  // renamed to be called 'z' by the minifier, because then the getter will be
  // hit.
  try {
    x.a();
  } catch (e) {}
  try {
    x.a0();
  } catch (e) {}
  try {
    x.a1();
  } catch (e) {}
  try {
    x.a2();
  } catch (e) {}
  try {
    x.a3();
  } catch (e) {}
  try {
    x.a4();
  } catch (e) {}
  try {
    x.a5();
  } catch (e) {}
  try {
    x.a6();
  } catch (e) {}
  try {
    x.a7();
  } catch (e) {}
  try {
    x.a8();
  } catch (e) {}
  try {
    x.a9();
  } catch (e) {}
  try {
    x.a10();
  } catch (e) {}
  try {
    x.a11();
  } catch (e) {}
  try {
    x.a12();
  } catch (e) {}
  try {
    x.a13();
  } catch (e) {}
  try {
    x.a14();
  } catch (e) {}
  try {
    x.a15();
  } catch (e) {}
  try {
    x.a16();
  } catch (e) {}
  try {
    x.a17();
  } catch (e) {}
  try {
    x.a18();
  } catch (e) {}
  try {
    x.a19();
  } catch (e) {}
  try {
    x.a20();
  } catch (e) {}
  try {
    x.a21();
  } catch (e) {}
  try {
    x.a12();
  } catch (e) {}
  try {
    x.a23();
  } catch (e) {}
  try {
    x.a24();
  } catch (e) {}
  try {
    x.a25();
  } catch (e) {}
  try {
    x.a26();
  } catch (e) {}
  Expect.equals(0, x.gettersCalled);
  Expect.equals(42, x.z);
  Expect.equals(1, x.gettersCalled);
}
