| 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 |