// Copyright (c) 2015, 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.

import "package:expect/expect.dart";
import "inheritance_chain_lib.dart";

class A extends B {
  get id => "A";
  get length => 1;
}

class C extends  D {
  get id => "C";
  get length => 3;
}

class X extends W {
  get id => "X";
  get length => -3;
}

class Z extends Y {
  get id => "Z";
  get length => -1;
}

main() {
  var instances = [
    new A(),
    new B(),
    new C(),
    new D(),
    new W(),
    new X(),
    new Y(),
    new Z(),
    [],
  ];

  var o = instances[0];
  Expect.equals("A", o.id);
  Expect.equals(1, o.length);
  Expect.isTrue(o is A);
  Expect.isTrue(o is B);
  Expect.isTrue(o is C);
  Expect.isTrue(o is D);
  Expect.isTrue(o is W);
  Expect.isTrue(o is X);
  Expect.isTrue(o is Y);
  Expect.isTrue(o is Z);
  o = instances[1];
  Expect.equals("B", o.id);
  Expect.equals(2, o.length);
  Expect.isTrue(o is B);
  Expect.isTrue(o is C);
  Expect.isTrue(o is D);
  Expect.isTrue(o is W);
  Expect.isTrue(o is X);
  Expect.isTrue(o is Y);
  Expect.isTrue(o is Z);
  o = instances[2];
  Expect.equals("C", o.id);
  Expect.equals(3, o.length);
  Expect.isTrue(o is C);
  Expect.isTrue(o is D);
  Expect.isTrue(o is W);
  Expect.isTrue(o is X);
  Expect.isTrue(o is Y);
  Expect.isTrue(o is Z);
  o = instances[3];
  Expect.equals("D", o.id);
  Expect.equals(4, o.length);
  Expect.isTrue(o is D);
  Expect.isTrue(o is W);
  Expect.isTrue(o is X);
  Expect.isTrue(o is Y);
  Expect.isTrue(o is Z);
  o = instances[4];
  Expect.equals("W", o.id);
  Expect.equals(-4, o.length);
  Expect.isTrue(o is W);
  o = instances[5];
  Expect.equals("X", o.id);
  Expect.equals(-3, o.length);
  Expect.isTrue(o is X);
  Expect.isTrue(o is W);
  o = instances[6];
  Expect.equals("Y", o.id);
  Expect.equals(-2, o.length);
  Expect.isTrue(o is Y);
  Expect.isTrue(o is X);
  Expect.isTrue(o is W);
  o = instances[7];
  Expect.equals("Z", o.id);
  Expect.equals(-1, o.length);
  Expect.isTrue(o is Z);
  Expect.isTrue(o is Y);
  Expect.isTrue(o is X);
  Expect.isTrue(o is W);
  o = instances[8];
  Expect.equals(0, o.length);
}