// 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 native fields on classes are not renamed by the minifier.
@Native("A")
class A {
  void set myLongPropertyName(int unused) native;
  int get myLongPropertyName native;
  void set getValue(int unused) native;
  int get getValue native;

  int method(int z) => myLongPropertyName;
}

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

function setter(x) {
  this.getValue += 10;
}

function A(){
  var a = Object.create(
      { constructor: A},
      { myLongPropertyName: { get: getter,
                              set: setter,
                              configurable: false,
                              writeable: false
                            }
      });
  a.getValue = 0;
  return a;
}

makeA = function(){return new A()};
self.nativeConstructor(A);
})()""");
  applyTestExtensions(['A']);
}

A makeA() native;

main() {
  nativeTesting();
  setup();
  var a = makeA();
  a.myLongPropertyName = 21;
  int gotten = a.myLongPropertyName;
  Expect.equals(11, gotten);

  // Force interceptor dispatch.
  confuse(a).myLongPropertyName = 99;
  gotten = confuse(a).myLongPropertyName;
  Expect.equals(22, gotten);

  var a2 = makeA();
  if (a2 is A) {
    // Inside this 'if' the compiler knows that a2 is an A, so it is tempted
    // to access myLongPropertyName directly, using its minified name.  But
    // renaming of native properties can only work using getters and setters
    // that access the original name.
    a2.myLongPropertyName = 21;
    int gotten = a2.myLongPropertyName;
    Expect.equals(11, gotten);
  }
}
