// Copyright (c) 2013, 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.model_test;

import 'package:expect/expect.dart';

import 'model.dart';

main() {
  dynamic a = new A();
  dynamic b = new B();
  dynamic c = new C();

  Expect.isNull(a.field);
  Expect.equals('B:get field', b.field);
  Expect.equals('B:get field', c.field);

  a.field = 42;
  b.field = 87;
  c.field = 89;
  Expect.equals(42, a.field);
  Expect.equals('B:get field', b.field);
  Expect.equals('B:get field', c.field);
  Expect.equals(89, fieldC);

  Expect.equals('A:instanceMethod(7)', a.instanceMethod(7));
  Expect.equals('B:instanceMethod(9)', b.instanceMethod(9));
  Expect.equals('C:instanceMethod(13)', c.instanceMethod(13));

  Expect.equals('A:get accessor', a.accessor);
  Expect.equals('B:get accessor', b.accessor);
  Expect.equals('C:get accessor', c.accessor);

  a.accessor = 'foo';
  b.accessor = 'bar';
  c.accessor = 'baz';

  Expect.equals('foo', accessorA);
  Expect.equals('bar', accessorB);
  Expect.equals('baz', accessorC);

  Expect.equals('aMethod', a.aMethod());
  Expect.equals('aMethod', b.aMethod());
  Expect.equals('aMethod', c.aMethod());

  Expect.throwsNoSuchMethodError(() => a.bMethod());
  Expect.equals('bMethod', b.bMethod());
  Expect.equals('bMethod', c.bMethod());

  Expect.throwsNoSuchMethodError(() => a.cMethod());
  Expect.throwsNoSuchMethodError(() => b.cMethod());
  Expect.equals('cMethod', c.cMethod());
}
