blob: e2ab54aff655eb04bc4eeba31866b19b013615aa [file] [log] [blame]
// 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
}