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

// @dart = 2.7

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

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

  self.nativeConstructor(A);
})()""");
  applyTestExtensions(['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);
}
