// 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.

// Properties on hidden native classes.

import 'native_testing.dart';

@Native("A")
class A {

  // Setters and getters should be similar to these methods:
  int getX() => JS('int', '#._x', this);
  void setX(int value) { JS('void', '#._x = #', this, value); }

  int get X() native;
  set X(int value) native;

  int get Y() native;
  set Y(int value) native;

  int get Z => JS('int', '#._z', this);
  set Z(int value) { JS('void', '#._z = #', this, value); }
}

A makeA() native;

void setup() {
  JS('', r"""
(function(){
  function A() {}

  Object.defineProperty(A.prototype, "X", {
    get: function () { return this._x; },
    set: function (v) { this._x = v; }
  });

  makeA = function(){return new A()};

  self.nativeConstructor(A);
})()""");
}


main() {
  nativeTesting();
  setup();

  var a = makeA();

  a.setX(5);
  Expect.equals(5, a.getX());

  a.X = 10;
  a.Y = 20;
  a.Z = 30;

  Expect.equals(10, a.X);
  Expect.equals(20, a.Y);
  Expect.equals(30, a.Z);

  confuse(a).setX(6);
  Expect.equals(6, confuse(a).getX());

  Expect.equals(6, confuse(a).X);
  Expect.equals(20, confuse(a).Y);
  Expect.equals(30, confuse(a).Z);
}
