OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 // Dart test for deeply nested generic types. | |
6 | |
7 /** A natural number aka Peano number. */ | |
8 interface N { | |
9 N add1(); | |
10 N sub1(); | |
11 } | |
12 | |
13 /** Zero element. */ | |
14 class Z implements N { | |
15 Z(); | |
16 N add1() { return new S<Z>(this); } | |
17 N sub1() { throw "Error: sub1(0)"; } | |
18 } | |
19 | |
20 /** Successor element. */ | |
21 class S<K> implements N { | |
22 N before; | |
23 S(this.before); | |
24 N add1() { return new S<S<K>>(this); } | |
25 N sub1() { | |
26 // It would be super cool if this could be "new K()". | |
27 return before; | |
28 } | |
29 } | |
30 | |
31 N NFromInt(int x) { | |
32 if (x == 0) | |
33 return new Z(); | |
34 else | |
35 return NFromInt(x - 1).add1(); | |
36 } | |
37 | |
38 int IntFromN(N x) { | |
39 if (x is Z) | |
40 return 0; | |
41 if (x is S) | |
42 return IntFromN(x.sub1()) + 1; | |
43 throw "Error"; | |
44 } | |
45 | |
46 bool IsEven(N x) { | |
47 if (x is Z) return true; | |
48 if (x is S<Z>) return false; | |
49 if (x is S<S>) return IsEven(x.sub1().sub1()); | |
50 throw "Error in IsEven"; | |
51 } | |
52 | |
53 main() { | |
54 Expect.isTrue(NFromInt(0) is Z); | |
55 Expect.isTrue(NFromInt(1) is S<Z>); | |
56 Expect.isTrue(NFromInt(2) is S<S<Z>>); | |
57 Expect.isTrue(NFromInt(3) is S<S<S<Z>>>); | |
58 Expect.isTrue(NFromInt(10) is S<S<S<S<S<S<S<S<S<S<Z>>>>>>>>>>); | |
59 | |
60 // Negative tests. | |
61 Expect.isTrue(NFromInt(0) is !S); | |
62 Expect.isTrue(NFromInt(1) is !Z); | |
63 Expect.isTrue(NFromInt(1) is !S<S>); | |
64 Expect.isTrue(NFromInt(2) is !Z); | |
65 Expect.isTrue(NFromInt(2) is !S<Z>); | |
66 Expect.isTrue(NFromInt(2) is !S<S<S>>); | |
67 | |
68 // Greater-than tests | |
69 Expect.isTrue(NFromInt(4) is S<S>); // 4 >= 2 | |
70 Expect.isTrue(NFromInt(4) is S<S<S>>); // 4 >= 3 | |
71 Expect.isTrue(NFromInt(4) is S<S<S<S>>>); // 4 >= 4 | |
72 Expect.isTrue(NFromInt(4) is !S<S<S<S<S>>>>); // 4 < 5 | |
73 | |
74 Expect.isTrue(IsEven(NFromInt(0))); | |
75 Expect.isFalse(IsEven(NFromInt(1))); | |
76 Expect.isTrue(IsEven(NFromInt(2))); | |
77 Expect.isFalse(IsEven(NFromInt(3))); | |
78 Expect.isTrue(IsEven(NFromInt(4))); | |
79 | |
80 Expect.equals(0, IntFromN(NFromInt(0))); | |
81 Expect.equals(1, IntFromN(NFromInt(1))); | |
82 Expect.equals(2, IntFromN(NFromInt(2))); | |
83 Expect.equals(50, IntFromN(NFromInt(50))); | |
84 } | |
OLD | NEW |