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

// @dart = 2.9

part of Private3Test.dart;

main() {
  PrivateMain.main();
}

class PrivateMain {
  static const _myPrecious = "A Ring";

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

  static accessMyLibPrivates() {
    var value;
    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;
    value = 0;
    var the_other = new PrivateLib();
    try {
      value = (the_other as dynamic)._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();
  }
}
