// 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 we can have fields with names that start with g and s even
// though those names are reserved for getters and setters in minified mode.

// Note: this works because end and send are both in the list of
// reservedNativeProperties.  In general we don't check arbitrary
// names for clashes because it's hard - subclasses can force superclasses
// to rename getters, and that can force unrelated classes to change their
// getters too if they have a property that has the same name.
@Native("A")
class A {
  int bar;
  int g;
  int s;
  int end;
  int gend;
  int send;
  int gettersCalled;
  int settersCalled;
}

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

  function setter(x) {
    this.settersCalled++;
    return 314;
  }

  var descriptor = {
      get: getter,
      set: setter,
      configurable: false,
      writeable: false
  };

  function A(){
    var a = Object.create(
        { constructor: A },
        { bar: descriptor,
          g: descriptor,
          s: descriptor,
          end: descriptor,
          gend: descriptor,
          send: descriptor
        });
    a.gettersCalled = 0;
    a.settersCalled = 0;
    return a;
  }

  makeA = function() { return new A(); };
  self.nativeConstructor(A);
})()""");
}

A makeA() native;

class B {}

main() {
  nativeTesting();
  setup();
  confuse(new B());
  var a = makeA();

  Expect.equals(42, confuse(a).bar);
  Expect.equals(42, confuse(a).g);
  Expect.equals(42, confuse(a).s);
  Expect.equals(42, confuse(a).end);
  Expect.equals(42, confuse(a).gend);
  Expect.equals(42, confuse(a).send);
  Expect.equals(271, confuse(a).bar = 271);
  Expect.equals(271, confuse(a).g = 271);
  Expect.equals(271, confuse(a).s = 271);
  Expect.equals(271, confuse(a).end = 271);
  Expect.equals(271, confuse(a).gend = 271);
  Expect.equals(271, confuse(a).send = 271);
  Expect.equals(6, confuse(a).gettersCalled);
  Expect.equals(6, confuse(a).settersCalled);

  Expect.equals(42, a.bar);
  Expect.equals(42, a.g);
  Expect.equals(42, a.s);
  Expect.equals(42, a.end);
  Expect.equals(42, a.gend);
  Expect.equals(42, a.send);
  Expect.equals(271, a.bar = 271);
  Expect.equals(271, a.g = 271);
  Expect.equals(271, a.s = 271);
  Expect.equals(271, a.end = 271);
  Expect.equals(271, a.gend = 271);
  Expect.equals(271, a.send = 271);
  Expect.equals(12, a.gettersCalled);
  Expect.equals(12, a.settersCalled);
}
