// 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 {
  void set bar(int unused) native;
  int get bar native;
  void set g(int unused) native;
  int get g native;
  void set s(int unused) native;
  int get s native;
  void set end(int unused) native;
  int get end native;
  void set gend(int unused) native;
  int get gend native;
  void set send(int unused) native;
  int get send native;
  void set gettersCalled(int unused) native;
  int get gettersCalled native;
  void set settersCalled(int unused) native;
  int get settersCalled native;
}

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;
  }

  self.makeA = function() { return new A(); };
  self.nativeConstructor(A);
})()""");
  applyTestExtensions(['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);
}
