| // Copyright (c) 2019, 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. |
| |
| /// Check that spread collections can be used in combination with async/await features. |
| /// This is a regression test for http://dartbug.com/38896 |
| |
| import "package:async_helper/async_helper.dart"; |
| import 'package:expect/expect.dart'; |
| |
| Future<void> asyncTest1(Future<void> f()) { |
| asyncStart(); |
| return f().then(asyncSuccess); |
| } |
| |
| void main() { |
| asyncTest1(() async { |
| await awaitSpreadMemberCallBindTest(); // A |
| await yieldSpreadMemberCallBindTest(); // C |
| await spreadAwaitMemberCallBindTest(); // G |
| await spreadAwaitMemberAccessBindTest(); // I |
| }); |
| } |
| |
| class A { |
| List<int> m1() => [1, 2]; |
| Future<List<int?>> run() async { |
| return [await null, ...m1()]; |
| } |
| } |
| |
| Future<void> awaitSpreadMemberCallBindTest() async { |
| // spread on member call in await |
| Expect.listEquals([null, 1, 2], await A().run()); |
| } |
| |
| class C { |
| List<int> m2() => [1, 2]; |
| |
| Future<List<int>> run() async { |
| return await run3().toList(); |
| } |
| |
| Stream<int> run3() async* { |
| for (var k in [...await m2()]) yield k; |
| } |
| } |
| |
| Future<void> yieldSpreadMemberCallBindTest() async { |
| var expected = [1, 2]; |
| |
| // spread on await of member call with yield |
| Expect.listEquals(expected, await C().run()); |
| } |
| |
| class G { |
| List<int> m2() => [1, 2]; |
| |
| Future<List<int>> run() async { |
| return [...await m2()]; |
| } |
| } |
| |
| Future<void> spreadAwaitMemberCallBindTest() async { |
| var expected = [1, 2]; |
| |
| // spread on await of member call |
| Expect.listEquals(expected, await G().run()); |
| } |
| |
| class I1 { |
| List<int> foo() => [1, 2]; |
| } |
| |
| class I { |
| I1 b = I1(); |
| Future<List<int>> run() async { |
| return [...await b.foo()]; |
| } |
| } |
| |
| Future<void> spreadAwaitMemberAccessBindTest() async { |
| var expected = [1, 2]; |
| |
| // spread on await of member access |
| Expect.listEquals(expected, await I().run()); |
| } |