OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2016, 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 // Test that Null is a subtype of any other type. |
| 6 |
| 7 import 'package:expect/expect.dart'; |
| 8 |
| 9 class A {} |
| 10 typedef A ReturnA(); |
| 11 typedef TakeA(A a); |
| 12 typedef Null ReturnNull(); |
| 13 typedef TakeNull(Null n); |
| 14 |
| 15 @NoInline() |
| 16 testA(A a) {} |
| 17 |
| 18 @NoInline() |
| 19 testListA(List<A> list) {} |
| 20 |
| 21 @NoInline() |
| 22 testIsListA(var a) => a is List<A>; |
| 23 |
| 24 @NoInline() |
| 25 testAsListA(var a) => a as List<A>; |
| 26 |
| 27 @NoInline() |
| 28 testNull(Null n) {} |
| 29 |
| 30 @NoInline() |
| 31 testListNull(List<Null> list) {} |
| 32 |
| 33 @NoInline() |
| 34 testIsListNull(var a) => a is List<Null>; |
| 35 |
| 36 @NoInline() |
| 37 testAsListNull(var a) => a as List<Null>; |
| 38 |
| 39 @NoInline() |
| 40 testReturnA(ReturnA f) {} |
| 41 |
| 42 @NoInline() |
| 43 testIsReturnA(var f) => f is ReturnA; |
| 44 |
| 45 @NoInline() |
| 46 testAsReturnA(var f) => f as ReturnA; |
| 47 |
| 48 @NoInline() |
| 49 testReturnNull(ReturnNull f) {} |
| 50 |
| 51 @NoInline() |
| 52 testIsReturnNull(var f) => f is ReturnNull; |
| 53 |
| 54 @NoInline() |
| 55 testAsReturnNull(var f) => f as ReturnNull; |
| 56 |
| 57 @NoInline() |
| 58 testTakeA(TakeA f) {} |
| 59 |
| 60 @NoInline() |
| 61 testIsTakeA(var f) => f is TakeA; |
| 62 |
| 63 @NoInline() |
| 64 testAsTakeA(var f) => f as TakeA; |
| 65 |
| 66 @NoInline() |
| 67 testTakeNull(TakeNull f) {} |
| 68 |
| 69 @NoInline() |
| 70 testIsTakeNull(var f) => f is TakeNull; |
| 71 |
| 72 @NoInline() |
| 73 testAsTakeNull(var f) => f as TakeNull; |
| 74 |
| 75 Null returnNullFunc() => null; |
| 76 takeNullFunc(Null n) {} |
| 77 A returnAFunc() => null; |
| 78 takeAFunc(A a) {} |
| 79 |
| 80 main() { |
| 81 var n = null; |
| 82 var listNull = new List<Null>(); |
| 83 var a = new A(); |
| 84 var listA = new List<A>(); |
| 85 |
| 86 testA(n); /// 01: ok |
| 87 testA(a); /// 02: ok |
| 88 testListA(listNull); /// 03: ok |
| 89 testListA(listA); /// 04: ok |
| 90 Expect.isTrue(testIsListA(listNull)); /// 05: ok |
| 91 Expect.isTrue(testIsListA(listA)); /// 06: ok |
| 92 testAsListA(listNull); /// 07: ok |
| 93 testAsListA(listA); /// 08: ok |
| 94 |
| 95 testNull(n); /// 09: ok |
| 96 testNull(a); /// 10: dynamic type error |
| 97 testListNull(listNull); /// 11: ok |
| 98 testListNull(listA); /// 12: dynamic type error |
| 99 Expect.isTrue(testIsListNull(listNull)); /// 13: ok |
| 100 Expect.isFalse(testIsListNull(listA)); /// 14: ok |
| 101 testAsListNull(listNull); /// 15: ok |
| 102 Expect.throws(() => testAsListNull(listA), (e) => e is CastError); /// 16: ok |
| 103 |
| 104 var returnNull = returnNullFunc; |
| 105 var takeNull = takeNullFunc; |
| 106 var returnA = returnAFunc; |
| 107 var takeA = takeAFunc; |
| 108 |
| 109 testReturnA(returnA); /// 17: ok |
| 110 testReturnA(returnNull); /// 18: ok |
| 111 Expect.isTrue(testIsReturnA(returnA)); /// 19: ok |
| 112 Expect.isTrue(testIsReturnA(returnNull)); /// 20: ok |
| 113 testAsReturnA(returnA); /// 21: ok |
| 114 testAsReturnA(returnNull); /// 22: ok |
| 115 |
| 116 // This is not valid in strong-mode: ()->A <: ()->Null |
| 117 testReturnNull(returnA); /// 23: ok |
| 118 testReturnNull(returnNull); /// 24: ok |
| 119 // This is not valid in strong-mode: ()->A <: ()->Null |
| 120 Expect.isTrue(testIsReturnNull(returnA)); /// 25: ok |
| 121 Expect.isTrue(testIsReturnNull(returnNull)); /// 26: ok |
| 122 // This is not valid in strong-mode: ()->A <: ()->Null |
| 123 testAsReturnNull(returnA); /// 27: ok |
| 124 testAsReturnNull(returnNull); /// 28: ok |
| 125 |
| 126 testTakeA(takeA); /// 29: ok |
| 127 // This is not valid in strong-mode: (Null)-> <: (A)-> |
| 128 testTakeA(takeNull); /// 30: ok |
| 129 Expect.isTrue(testIsTakeA(takeA)); /// 31: ok |
| 130 // This is not valid in strong-mode: (Null)-> <: (A)-> |
| 131 Expect.isTrue(testIsTakeA(takeNull)); /// 32: ok |
| 132 testAsTakeA(takeA); /// 33: ok |
| 133 // This is not valid in strong-mode: (Null)-> <: (A)-> |
| 134 testAsTakeA(takeNull); /// 34: ok |
| 135 |
| 136 testTakeNull(takeA); /// 35: ok |
| 137 testTakeNull(takeNull); /// 36: ok |
| 138 Expect.isTrue(testIsTakeNull(takeA)); /// 37: ok |
| 139 Expect.isTrue(testIsTakeNull(takeNull)); /// 38: ok |
| 140 testAsTakeNull(takeA); /// 39: ok |
| 141 testAsTakeNull(takeNull); /// 40: ok |
| 142 } |
OLD | NEW |