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