| // 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; | |
| } | |
| } |