// Copyright (c) 2014, 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.9

library test.hot_get_field;

import 'dart:mirrors';
import 'package:expect/expect.dart';

class C {
  var field;
  var _field;
  operator +(other) => field + other;
}

const int optimizationThreshold = 20;

testPublic() {
  var c = new C();
  var im = reflect(c);

  for (int i = 0; i < (2 * optimizationThreshold); i++) {
    c.field = i;
    Expect.equals(i, im.getField(#field).reflectee);
  }
}

testPrivate() {
  var c = new C();
  var im = reflect(c);

  for (int i = 0; i < (2 * optimizationThreshold); i++) {
    c._field = i;
    Expect.equals(i, im.getField(#_field).reflectee);
  }
}

testPrivateWrongLibrary() {
  var c = new C();
  var im = reflect(c);
  var selector = MirrorSystem.getSymbol(
      '_field', reflectClass(Mirror).owner as LibraryMirror);

  for (int i = 0; i < (2 * optimizationThreshold); i++) {
    Expect.throwsNoSuchMethodError(() => im.getField(selector));
  }
}

testOperator() {
  var plus = const Symbol("+");
  var c = new C();
  var im = reflect(c);

  for (int i = 0; i < (2 * optimizationThreshold); i++) {
    c.field = i;
    var closurizedPlus = im.getField(plus).reflectee;
    Expect.isTrue(closurizedPlus is Function);
    Expect.equals(2 * i, closurizedPlus(i));
  }
}

main() {
  testPublic();
  testPrivate();
  testPrivateWrongLibrary();
  testOperator();
}
