| // Copyright (c) 2011, 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 for parsing closures with complex parameter types. |
| const defaultPair = Pair<int, Pair<int, int>>(-1, Pair(-2, -3)); |
| |
| main() { |
| test1(); |
| test2(); |
| test3(); |
| } |
| |
| class Pair<A, B> { |
| final A fst; |
| final B snd; |
| const Pair(A this.fst, B this.snd); |
| } |
| |
| test1() { |
| // Closures with nested parameterized types. |
| var cdar1 = (Pair<int, Pair<int, int>> pr) => pr.snd.fst; |
| var cdar2 = (Pair<int, Pair<int, int>> pr) => pr.snd.fst; |
| |
| var e = new Pair<int, Pair<int, int>>(100, new Pair<int, int>(200, 300)); |
| |
| Expect.equals(200, cdar1(e)); |
| Expect.equals(200, cdar2(e)); |
| } |
| |
| test2() { |
| // Closures with nested parameterized types in optional position |
| var cdar1 = ([Pair<int, Pair<int, int>> pr = defaultPair]) => pr.snd.fst; |
| var cdar2 = ([Pair<int, Pair<int, int>> pr = defaultPair]) => pr.snd.fst; |
| |
| var e = new Pair<int, Pair<int, int>>(100, new Pair<int, int>(200, 300)); |
| |
| Expect.equals(200, cdar1(e)); |
| Expect.equals(200, cdar2(e)); |
| } |
| |
| test3() { |
| // Closures with nested parameterized types. |
| var f1 = (Pair<int, Pair<int, int>> pr) => pr.snd.fst + 1; |
| var f2 = (Pair<int, Pair<int, int>> pr) => pr.snd.fst + 2; |
| |
| // Closures with function type with nested parameterized types. |
| var ap1 = (f(Pair<int, Pair<int, int>> pr1), Pair<int, Pair<int, int>> pr) => |
| f(pr) * 10; |
| var ap2 = (f(Pair<int, Pair<int, int>> pr1), Pair<int, Pair<int, int>> pr) => |
| f(pr) * 100; |
| |
| var e = new Pair<int, Pair<int, int>>(100, new Pair<int, int>(200, 300)); |
| |
| Expect.equals(2010, ap1(f1, e)); |
| Expect.equals(2020, ap1(f2, e)); |
| Expect.equals(20100, ap2(f1, e)); |
| Expect.equals(20200, ap2(f2, e)); |
| } |