OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library flatten_test; | 5 library flatten_test; |
6 | 6 |
7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
8 import "package:async_helper/async_helper.dart"; | 8 import "package:async_helper/async_helper.dart"; |
9 import 'type_test_helper.dart'; | 9 import 'type_test_helper.dart'; |
10 import 'package:compiler/src/dart_types.dart'; | 10 import 'package:compiler/src/dart_types.dart'; |
11 import "package:compiler/src/elements/elements.dart" | 11 import "package:compiler/src/elements/elements.dart" show Element, ClassElement; |
12 show Element, ClassElement; | |
13 | 12 |
14 void main() { | 13 void main() { |
15 asyncTest(() => TypeEnvironment.create(r""" | 14 asyncTest(() => TypeEnvironment.create(r""" |
16 abstract class F<T> implements Future<T> {} | 15 abstract class F<T> implements Future<T> {} |
17 abstract class G<T> implements Future<G<T>> {} | 16 abstract class G<T> implements Future<G<T>> {} |
18 abstract class H<T> implements Future<H<H<T>>> {} | 17 abstract class H<T> implements Future<H<H<T>>> {} |
19 """).then((env) { | 18 """).then((env) { |
| 19 void check(DartType T, DartType expectedFlattenedType) { |
| 20 DartType flattenedType = env.flatten(T); |
| 21 Expect.equals( |
| 22 expectedFlattenedType, |
| 23 flattenedType, |
| 24 "Unexpected flattening of '$T' = '$flattenedType'," |
| 25 "expected '$expectedFlattenedType'."); |
| 26 } |
20 | 27 |
21 void check(DartType T, DartType expectedFlattenedType) { | 28 ClassElement Future_ = env.getElement('Future'); |
22 DartType flattenedType = env.flatten(T); | 29 ClassElement F = env.getElement('F'); |
23 Expect.equals(expectedFlattenedType, flattenedType, | 30 ClassElement G = env.getElement('G'); |
24 "Unexpected flattening of '$T' = '$flattenedType'," | 31 ClassElement H = env.getElement('H'); |
25 "expected '$expectedFlattenedType'."); | 32 DartType int_ = env['int']; |
26 } | 33 DartType dynamic_ = env['dynamic']; |
| 34 DartType Future_int = instantiate(Future_, [int_]); |
| 35 DartType F_int = instantiate(F, [int_]); |
| 36 DartType G_int = instantiate(G, [int_]); |
| 37 DartType H_int = instantiate(H, [int_]); |
| 38 DartType H_H_int = instantiate(H, [H_int]); |
27 | 39 |
28 ClassElement Future_ = env.getElement('Future'); | 40 // flatten(int) = int |
29 ClassElement F = env.getElement('F'); | 41 check(int_, int_); |
30 ClassElement G = env.getElement('G'); | |
31 ClassElement H = env.getElement('H'); | |
32 DartType int_ = env['int']; | |
33 DartType dynamic_ = env['dynamic']; | |
34 DartType Future_int = instantiate(Future_, [int_]); | |
35 DartType F_int = instantiate(F, [int_]); | |
36 DartType G_int = instantiate(G, [int_]); | |
37 DartType H_int = instantiate(H, [int_]); | |
38 DartType H_H_int = instantiate(H, [H_int]); | |
39 | 42 |
40 // flatten(int) = int | 43 // flatten(Future) = dynamic |
41 check(int_, int_); | 44 check(Future_.rawType, dynamic_); |
42 | 45 |
43 // flatten(Future) = dynamic | 46 // flatten(Future<int>) = int |
44 check(Future_.rawType, dynamic_); | 47 check(Future_int, int_); |
45 | 48 |
46 // flatten(Future<int>) = int | 49 // flatten(Future<Future<int>>) = int |
47 check(Future_int, int_); | 50 check(instantiate(Future_, [Future_int]), int_); |
48 | 51 |
49 // flatten(Future<Future<int>>) = int | 52 // flatten(F) = dynamic |
50 check(instantiate(Future_, [Future_int]), int_); | 53 check(F.rawType, dynamic_); |
51 | 54 |
52 // flatten(F) = dynamic | 55 // flatten(F<int>) = int |
53 check(F.rawType, dynamic_); | 56 check(F_int, int_); |
54 | 57 |
55 // flatten(F<int>) = int | 58 // flatten(F<Future<int>>) = Future<int> |
56 check(F_int, int_); | 59 check(instantiate(F, [Future_int]), Future_int); |
57 | 60 |
58 // flatten(F<Future<int>>) = Future<int> | 61 // flatten(G) = G |
59 check(instantiate(F, [Future_int]), Future_int); | 62 check(G.rawType, G.rawType); |
60 | 63 |
61 // flatten(G) = G | 64 // flatten(G<int>) = G<int> |
62 check(G.rawType, G.rawType); | 65 check(G_int, G_int); |
63 | 66 |
64 // flatten(G<int>) = G<int> | 67 // flatten(H) = H<H> |
65 check(G_int, G_int); | 68 check(H.rawType, instantiate(H, [H.rawType])); |
66 | 69 |
67 // flatten(H) = H<H> | 70 // flatten(H<int>) = H<H<int>> |
68 check(H.rawType, instantiate(H, [H.rawType])); | 71 check(H_int, H_H_int); |
69 | 72 |
70 // flatten(H<int>) = H<H<int>> | 73 // flatten(Future<F<int>>) = int |
71 check(H_int, H_H_int); | 74 check(instantiate(Future_, [F_int]), int_); |
72 | 75 |
73 // flatten(Future<F<int>>) = int | 76 // flatten(Future<G<int>>) = int |
74 check(instantiate(Future_, [F_int]), int_); | 77 check(instantiate(Future_, [G_int]), G_int); |
75 | 78 |
76 // flatten(Future<G<int>>) = int | 79 // flatten(Future<H<int>>) = int |
77 check(instantiate(Future_, [G_int]), G_int); | 80 check(instantiate(Future_, [H_int]), H_H_int); |
78 | 81 })); |
79 // flatten(Future<H<int>>) = int | |
80 check(instantiate(Future_, [H_int]), H_H_int); | |
81 })); | |
82 } | 82 } |
OLD | NEW |