blob: 1104da99b7edf2145583c12c408ad3eac252c76b [file] [log] [blame]
// Copyright (c) 2024, 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.
test1(int? x) {
var y1 = [?x];
expectType<List<int>>(y1);
var y2 = [1, ?x];
expectType<List<int>>(y2);
var y3 = [1.0, ?x];
expectType<List<num>>(y3);
}
test2(dynamic x) {
List<String> y1 = [?new TypeExpecter<String?>().checkType(x)];
List<String> y2 = ["", ?new TypeExpecter<String?>().checkType(x)];
var y3 = ["", ?new TypeExpecter<dynamic>().checkType(x)];
}
test3(String? key) {
var y1 = {?key: false};
expectType<Map<String, bool>>(y1);
var y2 = {"": false, ?key: false};
expectType<Map<String, bool>>(y2);
var y3 = {0: false, ?key: false};
expectType<Map<Object?, bool>>(y3);
}
test4(dynamic key) {
Map<Symbol, num> y1 = {?new TypeExpecter<Symbol?>().checkType(key): 1.0};
Map<Symbol, num> y2 = {#key: 1.0, ?new TypeExpecter<Symbol?>().checkType(key): 1.0};
var y3 = {#key: 1.0, ?new TypeExpecter<dynamic>().checkType(key): 1.0};
}
test5(String? value) {
var y1 = {false: ?value};
expectType<Map<bool, String>>(y1);
var y2 = {false: "", true: ?value};
expectType<Map<bool, String>>(y2);
var y3 = {false: 0, true: ?value};
expectType<Map<bool, Object?>>(y3);
}
test6(dynamic value) {
Map<int, Symbol> y1 = {0: ?new TypeExpecter<Symbol?>().checkType(value)};
Map<int, Symbol> y2 = {0: #key, 1: ?new TypeExpecter<Symbol?>().checkType(value)};
var y3 = {0: #key, 1: ?new TypeExpecter<dynamic>().checkType(value)};
}
test7(int? key, Symbol? value) {
var y1 = {?key: ?value};
expectType<Map<int, Symbol>>(y1);
var y2 = {0: #value, ?key: ?value};
expectType<Map<int, Symbol>>(y2);
var y3 = {0: 1.0, ?key: ?value};
expectType<Map<int, Object?>>(y3);
var y4 = {false: #value, ?key: ?value};
expectType<Map<Object?, Symbol>>(y4);
}
test8(dynamic key, dynamic value) {
Map<String, double> y1 = {
?new TypeExpecter<String?>().checkType(key): ?new TypeExpecter<double?>().checkType(value)
};
Map<String, double> y2 = {
"": 1.0,
?new TypeExpecter<String?>().checkType(key): ?new TypeExpecter<double?>().checkType(value)
};
var y3 = {
"": 1.0,
?new TypeExpecter<dynamic>().checkType(key): ?new TypeExpecter<dynamic>().checkType(value)
};
}
main() {
test1(0);
test1(null);
test2("element");
test2(null);
expectThrows<TypeError>(() {test2(0);});
test3("key");
test3(null);
test4(#foo);
test4(null);
expectThrows<TypeError>(() {test4("foo");});
test5("value");
test5(null);
test6(#foo);
test6(null);
expectThrows<TypeError>(() {test6("foo");});
test7(0, #value);
test7(0, null);
test7(null, #value);
test7(null, null);
test8("key", 1.0);
test8("key", null);
test8(null, 1.0);
test8(null, null);
expectThrows<TypeError>(() {test8(#key, 1.0);});
expectThrows<TypeError>(() {test8("key", "value");});
expectThrows<TypeError>(() {test8(#key, "value");});
}
expectType<T>(x) {
if (x is! T) {
throw "Expected the passed value to be of type 'T', "
"got '${x.runtimeType}'.";
}
}
expectThrows<T>(void Function() f) {
bool hasThrownT = true;
try {
f();
hasThrownT = false;
} on T {
hasThrownT = true;
} on dynamic {
hasThrownT = false;
}
if (!hasThrownT) {
throw "Expected the passed function to throw.";
}
}
class TypeExpecter<X> {
Y checkType<Y>(dynamic value) {
if (X != Y) {
throw "Expected the captured type ($Y) "
"to be the same as the passed type ($X).";
}
return value as Y;
}
}