| // Copyright (c) 2016, 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. |
| |
| // Test that Null is a subtype of any other type. |
| |
| import 'package:expect/expect.dart'; |
| |
| class A {} |
| |
| typedef A ReturnA(); |
| typedef TakeA(A a); |
| typedef Null ReturnNull(); |
| typedef TakeNull(Null n); |
| |
| @NoInline() |
| testA(A a) {} |
| |
| @NoInline() |
| testListA(List<A> list) {} |
| |
| @NoInline() |
| testIsListA(var a) => a is List<A>; |
| |
| @NoInline() |
| testAsListA(var a) => a as List<A>; |
| |
| @NoInline() |
| testNull(Null n) {} |
| |
| @NoInline() |
| testListNull(List<Null> list) {} |
| |
| @NoInline() |
| testIsListNull(var a) => a is List<Null>; |
| |
| @NoInline() |
| testAsListNull(var a) => a as List<Null>; |
| |
| @NoInline() |
| testReturnA(ReturnA f) {} |
| |
| @NoInline() |
| testIsReturnA(var f) => f is ReturnA; |
| |
| @NoInline() |
| testAsReturnA(var f) => f as ReturnA; |
| |
| @NoInline() |
| testReturnNull(ReturnNull f) {} |
| |
| @NoInline() |
| testIsReturnNull(var f) => f is ReturnNull; |
| |
| @NoInline() |
| testAsReturnNull(var f) => f as ReturnNull; |
| |
| @NoInline() |
| testTakeA(TakeA f) {} |
| |
| @NoInline() |
| testIsTakeA(var f) => f is TakeA; |
| |
| @NoInline() |
| testAsTakeA(var f) => f as TakeA; |
| |
| @NoInline() |
| testTakeNull(TakeNull f) {} |
| |
| @NoInline() |
| testIsTakeNull(var f) => f is TakeNull; |
| |
| @NoInline() |
| testAsTakeNull(var f) => f as TakeNull; |
| |
| Null returnNullFunc() => null; |
| takeNullFunc(Null n) {} |
| A returnAFunc() => null; |
| takeAFunc(A a) {} |
| |
| main() { |
| var n = null; |
| var listNull = new List<Null>(); |
| var a = new A(); |
| var listA = new List<A>(); |
| |
| testA(n); // //# 01: ok |
| testA(a); // //# 02: ok |
| testListA(listNull); // //# 03: ok |
| testListA(listA); // //# 04: ok |
| Expect.isTrue(testIsListA(listNull)); // //# 05: ok |
| Expect.isTrue(testIsListA(listA)); // //# 06: ok |
| testAsListA(listNull); // //# 07: ok |
| testAsListA(listA); // //# 08: ok |
| |
| testNull(n); // //# 09: ok |
| testNull(a); // //# 10: dynamic type error |
| testListNull(listNull); // //# 11: ok |
| testListNull(listA); // //# 12: dynamic type error |
| Expect.isTrue(testIsListNull(listNull)); // //# 13: ok |
| Expect.isFalse(testIsListNull(listA)); // //# 14: ok |
| testAsListNull(listNull); // //# 15: ok |
| Expect.throws(() => testAsListNull(listA), (e) => e is CastError); //# 16: ok |
| |
| var returnNull = returnNullFunc; |
| var takeNull = takeNullFunc; |
| var returnA = returnAFunc; |
| var takeA = takeAFunc; |
| |
| testReturnA(returnA); // //# 17: ok |
| testReturnA(returnNull); // //# 18: ok |
| Expect.isTrue(testIsReturnA(returnA)); // //# 19: ok |
| Expect.isTrue(testIsReturnA(returnNull)); // //# 20: ok |
| testAsReturnA(returnA); // //# 21: ok |
| testAsReturnA(returnNull); // //# 22: ok |
| |
| // This is not valid in strong-mode: ()->A <: ()->Null |
| testReturnNull(returnA); // //# 23: ok |
| testReturnNull(returnNull); // //# 24: ok |
| // This is not valid in strong-mode: ()->A <: ()->Null |
| Expect.isTrue(testIsReturnNull(returnA)); // //# 25: ok |
| Expect.isTrue(testIsReturnNull(returnNull)); // //# 26: ok |
| // This is not valid in strong-mode: ()->A <: ()->Null |
| testAsReturnNull(returnA); // //# 27: ok |
| testAsReturnNull(returnNull); // //# 28: ok |
| |
| testTakeA(takeA); // //# 29: ok |
| // This is not valid in strong-mode: (Null)-> <: (A)-> |
| testTakeA(takeNull); // //# 30: ok |
| Expect.isTrue(testIsTakeA(takeA)); // //# 31: ok |
| // This is not valid in strong-mode: (Null)-> <: (A)-> |
| Expect.isTrue(testIsTakeA(takeNull)); // //# 32: ok |
| testAsTakeA(takeA); // //# 33: ok |
| // This is not valid in strong-mode: (Null)-> <: (A)-> |
| testAsTakeA(takeNull); // //# 34: ok |
| |
| testTakeNull(takeA); // //# 35: ok |
| testTakeNull(takeNull); // //# 36: ok |
| Expect.isTrue(testIsTakeNull(takeA)); // //# 37: ok |
| Expect.isTrue(testIsTakeNull(takeNull)); // //# 38: ok |
| testAsTakeNull(takeA); // //# 39: ok |
| testAsTakeNull(takeNull); // //# 40: ok |
| } |