// 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 "package:expect/expect.dart";

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


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

function A(){
  var a = Object.create(
      { constructor: { name: '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;
}

makeA = function() { return new 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() {
  setup();
  var both = [makeA(), new B()];
  var x = both[inscrutable(0)];
  // 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);
}
