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

library test.hot_set_field;

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

class C {
  var field;
  var _field;
}

const int optimizationThreshold = 20;

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

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

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

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

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.setField(selector, i));
  }
}

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