| // 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. | |
| import "package:expect/expect.dart"; | |
| // Tests basic classes and methods. | |
| class ClassTest { | |
| ClassTest() {} | |
| static testMain() { | |
| var test = new ClassTest(); | |
| test.testSuperCalls(); | |
| test.testVirtualCalls(); | |
| test.testStaticCalls(); | |
| test.testInheritedField(); | |
| test.testMemberRefInClosure(); | |
| test.testFactory(); | |
| test.testNamedConstructors(); | |
| test.testDefaultImplementation(); | |
| test.testFunctionParameter((int a) { | |
| return a; | |
| }); | |
| } | |
| testFunctionParameter(int func(int a)) { | |
| Expect.equals(1, func(1)); | |
| } | |
| testSuperCalls() { | |
| var sub = new Sub(); | |
| Expect.equals(43, sub.methodX()); | |
| Expect.equals(84, sub.methodK()); | |
| } | |
| testVirtualCalls() { | |
| var sub = new Sub(); | |
| Expect.equals(41, sub.method2()); | |
| Expect.equals(41, sub.method3()); | |
| } | |
| testStaticCalls() { | |
| var sub = new Sub(); | |
| Expect.equals(-42, Sub.method4()); | |
| Expect.equals(-41, sub.method5()); | |
| } | |
| testInheritedField() { | |
| var sub = new Sub(); | |
| Expect.equals(42, sub.method6()); | |
| } | |
| testMemberRefInClosure() { | |
| var sub = new Sub(); | |
| Expect.equals(1, sub.closureRef()); | |
| Expect.equals(2, sub.closureRef()); | |
| // Make sure it is actually on the object, not the global 'this'. | |
| sub = new Sub(); | |
| Expect.equals(1, sub.closureRef()); | |
| Expect.equals(2, sub.closureRef()); | |
| } | |
| testFactory() { | |
| var sup = new Sup.named(); | |
| Expect.equals(43, sup.methodX()); | |
| Expect.equals(84, sup.methodK()); | |
| } | |
| testNamedConstructors() { | |
| var sup = new Sup.fromInt(4); | |
| Expect.equals(4, sup.methodX()); | |
| Expect.equals(0, sup.methodK()); | |
| } | |
| testDefaultImplementation() { | |
| var x = new Inter(4); | |
| Expect.equals(4, x.methodX()); | |
| Expect.equals(8, x.methodK()); | |
| x = new Inter.fromInt(4); | |
| Expect.equals(4, x.methodX()); | |
| Expect.equals(0, x.methodK()); | |
| x = new Inter.named(); | |
| Expect.equals(43, x.methodX()); | |
| Expect.equals(84, x.methodK()); | |
| x = new Inter.factory(); | |
| Expect.equals(43, x.methodX()); | |
| Expect.equals(84, x.methodK()); | |
| } | |
| } | |
| abstract class Inter { | |
| factory Inter.named() = Sup.named; | |
| factory Inter.fromInt(int x) = Sup.fromInt; | |
| factory Inter(int x) = Sup; | |
| factory Inter.factory() = Sup.factory; | |
| int methodX(); | |
| int methodK(); | |
| int x_ = -1; | |
| } | |
| class Sup implements Inter { | |
| int x_ = -1; | |
| int k_ = -1; | |
| factory Sup.named() { | |
| return new Sub(); | |
| } | |
| factory Sup.factory() { | |
| return new Sub(); | |
| } | |
| Sup.fromInt(int x) { | |
| x_ = x; | |
| k_ = 0; | |
| } | |
| int methodX() { | |
| return x_; | |
| } | |
| int methodK() { | |
| return k_; | |
| } | |
| Sup(int x) : this.x_ = x { | |
| k_ = x * 2; | |
| } | |
| int method2() { | |
| return x_ - 1; | |
| } | |
| } | |
| class Sub extends Sup { | |
| int y_ = -1; | |
| // Override | |
| int methodX() { | |
| return super.methodX() + 1; | |
| } | |
| int method3() { | |
| return method2(); | |
| } | |
| static int method4() { | |
| return -42; | |
| } | |
| int method5() { | |
| return method4() + 1; | |
| } | |
| int method6() { | |
| return x_ + y_; | |
| } | |
| int closureRef() { | |
| var f = () { | |
| y_ += 1; | |
| return y_; | |
| }; | |
| return f(); | |
| } | |
| Sub() : super(42) { | |
| y_ = 0; | |
| } | |
| } | |
| main() { | |
| ClassTest.testMain(); | |
| } |