blob: aa337b23fb9ebd94587280cbc2c684424ef35358 [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
}