// Copyright (c) 2012, 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() {
  testPrivateTopLevel();
  testPrivateClasses();
}

void expectCatch(f) {
  bool threw = false;
  try {
    f();
  } catch (e) {
    threw = true;
  }
  Expect.equals(true, threw);
}

String _private1() => "private1";
const String _private1Field = "private1Field";

void testPrivateTopLevel() {
  Expect.equals("private1", _private1());
  Expect.equals("private2", _private2());
  Expect.equals("private1Field", _private1Field);
  Expect.equals("private2Field", _private2Field);
}

class _A {
  _A() : fieldA = 499;

  int fieldA;
}

class AExposed extends _A {
  AExposed() : super();
}

class B {
  int _fieldB;
  B() : _fieldB = 42;
}

class C1 {
  int _field1;
  C1() : _field1 = 499;

  field1a() => _field1;
}

class C3 extends C2 {
  int _field2;
  C3() : super(), _field2 = 42;

  field2a() => _field2;
  field1c() => _field1;
}

int c_field1a(c) => c._field1;
int c_field2a(c) => c._field2;

int _field1FromNewC4() => new C4()._field1;
int _field2FromNewC4() => new C4()._field2;

void testPrivateClasses() {
  _A a = new _A();
  Expect.equals(499, a.fieldA);
  Expect.equals(499, accessFieldA2(a));
  Expect.equals(499, LibOther3.accessFieldA3(a));

  var a2 = new AImported();
  Expect.equals(499, a2.getFieldA());

  B b = new B();
  Expect.equals(42, b._fieldB);
  Expect.equals(42, accessFieldB2(b));
  expectCatch(() => LibOther3.accessFieldB3(b));

  C4 c = new C4();
  Expect.equals(499, c._field1);
  Expect.equals(499, c_field1a(c));
  Expect.equals(499, c.field1a());
  Expect.equals(42, c._field2);
  Expect.equals(42, c_field2a(c));
  Expect.equals(42, c.field2a());
  Expect.equals(99, LibOther3.c_field1b(c));
  Expect.equals(99, c.field1b());
  Expect.equals(1024, LibOther3.c_field2b(c));
  Expect.equals(1024, c.field2b());
  Expect.equals(499, c.field1c());
  Expect.equals(99, c.field1d());
  Expect.equals(499, _field1FromNewC4());
  Expect.equals(42, _field2FromNewC4());
}
