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

import "package:expect/expect.dart";

class A {
  foo() {
    return 499;
  }

  bar(x) {
    return x + 499;
  }

  baz() {
    return 54;
  }

  titi() {
    return 123;
  }
}

class B {
  foo() {
    return 42;
  }

  bar(x) {
    return x + 42;
  }

  toto() {
    return foo() + 42;
  }
}

class C extends A {
  foo() {
    return 99;
  }

  bar(x) {
    return x + 99;
  }
}

void main() {
  var a = new A();
  Expect.equals(499, a.foo());
  Expect.equals(500, a.bar(1));
  var b = new B();
  Expect.equals(42, b.foo());
  Expect.equals(43, b.bar(1));
  var c = new C();
  Expect.equals(99, c.foo());
  Expect.equals(100, c.bar(1));

  Expect.equals(54, a.baz());
  Expect.equals(54, c.baz());

  // We don't call a.titi. This means that the compiler needs to trigger the
  // compilation of A.titi by going through the super-chain.
  Expect.equals(123, c.titi());

  Expect.equals(84, b.toto());
}
