// 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 list) {} @NoInline() testIsListA(var a) => a is List; @NoInline() testAsListA(var a) => a as List; @NoInline() testNull(Null n) {} @NoInline() testListNull(List list) {} @NoInline() testIsListNull(var a) => a is List; @NoInline() testAsListNull(var a) => a as List; @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(); var a = new A(); var listA = new List(); 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 }