// 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 test for testing access to private fields.

main() {
  PrivateMain.main();
}

class PrivateMain {

  static const _myPrecious = "A Ring";

  static accessMyPrivates() {
    var value = 0;
    try {
      value = _myPrecious;
    } catch (e) {
      value = -1;
    }
    Expect.equals("A Ring", value);
  }

  static accessMyLibPrivates() {
    var value = 0;
    var the_other = new PrivateOther();
    try {
      value = the_other._myPrecious;
    } catch (e, trace) {
      print(e);
      print(trace);
      Expect.equals(true, e is NoSuchMethodError);
      value = -1;
    }
    Expect.equals("Another Ring", value);
  }

  static accessOtherLibPrivates() {
    var value = 0;
    var the_other = new PrivateLib();
    try {
      value = the_other._myPrecious;
    } catch (e, trace) {
      print(e);
      print(trace);
      Expect.equals(true, e is NoSuchMethodError);
      value = -1;
    }
    Expect.equals(-1, value);
  }

  static main() {
    accessMyPrivates();
    accessMyLibPrivates();
    accessOtherLibPrivates();
  }
}
