// 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(); }