diff --git a/pkg/async_helper/lib/async_helper.dart b/pkg/async_helper/lib/async_helper.dart index bddbe38b20f..b5926370b03 100644 --- a/pkg/async_helper/lib/async_helper.dart +++ b/pkg/async_helper/lib/async_helper.dart @@ -142,3 +142,16 @@ Future asyncExpectThrows(Future result, return error; }); } + +/// Checks that the asynchronous [result] throws a [T] if and only if +/// [condition] is `true`. +/// +/// When [condition] is `false`, [result] is expected to complete without +/// errors. +Future asyncExpectThrowsWhen( + bool condition, Future result, + [String reason = ""]) { + return condition + ? asyncExpectThrows(result, reason) + : result.then((_) => null); +} diff --git a/tests/language/control_flow_collections/await_for_test.dart b/tests/language/control_flow_collections/await_for_test.dart index 75fdc08dfe7..521cfdb9c58 100644 --- a/tests/language/control_flow_collections/await_for_test.dart +++ b/tests/language/control_flow_collections/await_for_test.dart @@ -281,42 +281,46 @@ Future testKeyOrder() async { Expect.equals("1:a,2:a", set.join(",")); } -Future testRuntimeErrors() async { - // TODO(54798): split these and move them closer to each expectation. - if (!v.checkedParameters || !v.checkedImplicitDowncasts) { - return; +asyncExpectThrowsTypeErrorOrNSM(Future result) { + if (v.checkedParameters) { + return asyncExpectThrows(result); + } else { + return asyncExpectThrows(result); } +} +Future testRuntimeErrors() async { // Cast variable. dynamic nonStream = 3; - asyncExpectThrows(() async { + asyncExpectThrowsTypeErrorOrNSM(() async { [await for (int i in nonStream) 1]; }()); - asyncExpectThrows(() async { + asyncExpectThrowsTypeErrorOrNSM(() async { {await for (int i in nonStream) 1: 1}; }()); - asyncExpectThrows(() async { + asyncExpectThrowsTypeErrorOrNSM(() async { {await for (int i in nonStream) 1}; }()); // Wrong element type. dynamic nonInt = "string"; - asyncExpectThrows(() async { + asyncExpectThrowsWhen(v.checkedImplicitDowncasts, () async { [ await for (var i in stream([1])) nonInt ]; }()); - asyncExpectThrows(() async { + asyncExpectThrowsWhen(v.checkedImplicitDowncasts, () async { { await for (var i in stream([1])) nonInt: 1 }; }()); - asyncExpectThrows(() async { + asyncExpectThrowsWhen(v.checkedImplicitDowncasts, () async { { await for (var i in stream([1])) 1: nonInt }; }()); - asyncExpectThrows(() async { + + asyncExpectThrowsWhen(v.checkedImplicitDowncasts, () async { { await for (var i in stream([1])) nonInt };