| Index: tests/language/null_is_bottom_test.dart
|
| diff --git a/tests/language/null_is_bottom_test.dart b/tests/language/null_is_bottom_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e2ab54aff655eb04bc4eeba31866b19b013615aa
|
| --- /dev/null
|
| +++ b/tests/language/null_is_bottom_test.dart
|
| @@ -0,0 +1,142 @@
|
| +// 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
|
| +}
|
|
|