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