// 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. // Dart test for deeply nested generic types. /** A natural number aka Peano number. */ abstract class N { N add1(); N sub1(); } /** Zero element. */ class Z implements N { Z(); N add1() { return new S(this); } N sub1() { throw "Error: sub1(0)"; } } /** Successor element. */ class S implements N { N before; S(this.before); N add1() { return new S>(this); } N sub1() { // It would be super cool if this could be "new K()". return before; } } N NFromInt(int x) { if (x == 0) return new Z(); else return NFromInt(x - 1).add1(); } int IntFromN(N x) { if (x is Z) return 0; if (x is S) return IntFromN(x.sub1()) + 1; throw "Error"; } bool IsEven(N x) { if (x is Z) return true; if (x is S) return false; if (x is S) return IsEven(x.sub1().sub1()); throw "Error in IsEven"; } main() { Expect.isTrue(NFromInt(0) is Z); Expect.isTrue(NFromInt(1) is S); Expect.isTrue(NFromInt(2) is S>); Expect.isTrue(NFromInt(3) is S>>); Expect.isTrue(NFromInt(10) is S>>>>>>>>>); // Negative tests. Expect.isTrue(NFromInt(0) is !S); Expect.isTrue(NFromInt(1) is !Z); Expect.isTrue(NFromInt(1) is !S); Expect.isTrue(NFromInt(2) is !Z); Expect.isTrue(NFromInt(2) is !S); Expect.isTrue(NFromInt(2) is !S>); // Greater-than tests Expect.isTrue(NFromInt(4) is S); // 4 >= 2 Expect.isTrue(NFromInt(4) is S>); // 4 >= 3 Expect.isTrue(NFromInt(4) is S>>); // 4 >= 4 Expect.isTrue(NFromInt(4) is !S>>>); // 4 < 5 Expect.isTrue(IsEven(NFromInt(0))); Expect.isFalse(IsEven(NFromInt(1))); Expect.isTrue(IsEven(NFromInt(2))); Expect.isFalse(IsEven(NFromInt(3))); Expect.isTrue(IsEven(NFromInt(4))); Expect.equals(0, IntFromN(NFromInt(0))); Expect.equals(1, IntFromN(NFromInt(1))); Expect.equals(2, IntFromN(NFromInt(2))); Expect.equals(50, IntFromN(NFromInt(50))); }