|  | // Copyright (c) 2020, 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. | 
|  |  | 
|  | // @dart = 2.9 | 
|  |  | 
|  | import 'package:async_helper/async_minitest.dart'; | 
|  |  | 
|  | import 'utils.dart'; | 
|  |  | 
|  | void main() { | 
|  | test('plain', () { | 
|  | f() async* { | 
|  | yield 0; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0]); | 
|  | }); | 
|  |  | 
|  | test('if-then-else', () { | 
|  | f(b) async* { | 
|  | if (b) | 
|  | yield 0; | 
|  | else | 
|  | yield 1; | 
|  | } | 
|  |  | 
|  | return expectList(f(true), [0]).whenComplete(() { | 
|  | expectList(f(false), [1]); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('block', () { | 
|  | f() async* { | 
|  | yield 0; | 
|  | { | 
|  | yield 1; | 
|  | } | 
|  | yield 2; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 1, 2]); | 
|  | }); | 
|  |  | 
|  | test('labeled', () { | 
|  | f() async* { | 
|  | label1: | 
|  | yield 0; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0]); | 
|  | }); | 
|  |  | 
|  | test('two labels on same line', () { | 
|  | f() async* { | 
|  | // DO NOT RUN dart format on this file. The labels should be on the same. | 
|  | // line. Originally VM issue #2238. | 
|  | label1: label2: yield 0; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0]); | 
|  | }); | 
|  |  | 
|  | test('for-loop', () { | 
|  | f() async* { | 
|  | for (int i = 0; i < 3; i++) yield i; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 1, 2]); | 
|  | }); | 
|  |  | 
|  | test('for-in-loop', () { | 
|  | f() async* { | 
|  | for (var i in [0, 1, 2]) yield i; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 1, 2]); | 
|  | }); | 
|  |  | 
|  | test('await for-in-loop', () { | 
|  | f() async* { | 
|  | await for (var i in Stream.fromIterable([0, 1, 2])) yield i; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 1, 2]); | 
|  | }); | 
|  |  | 
|  | test('while-loop', () { | 
|  | f() async* { | 
|  | int i = 0; | 
|  | while (i < 3) yield i++; | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 1, 2]); | 
|  | }); | 
|  |  | 
|  | test('do-while-loop', () { | 
|  | f() async* { | 
|  | int i = 0; | 
|  | do yield i++; while (i < 3); | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 1, 2]); | 
|  | }); | 
|  |  | 
|  | test('try-catch-finally', () { | 
|  | f() async* { | 
|  | try { | 
|  | yield 0; | 
|  | } catch (e) { | 
|  | yield 1; | 
|  | } finally { | 
|  | yield 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | return expectList(f(), [0, 2]); | 
|  | }); | 
|  |  | 
|  | test('try-catch-finally 2', () { | 
|  | f() async* { | 
|  | try { | 
|  | yield throw 0; | 
|  | } catch (e) { | 
|  | yield 1; | 
|  | } finally { | 
|  | yield 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | return expectList(f(), [1, 2]); | 
|  | }); | 
|  |  | 
|  | test('switch-case', () { | 
|  | f(v) async* { | 
|  | switch (v) { | 
|  | case 0: | 
|  | yield 0; | 
|  | continue label1; | 
|  | label1: | 
|  | case 1: | 
|  | yield 1; | 
|  | break; | 
|  | default: | 
|  | yield 2; | 
|  | } | 
|  | } | 
|  |  | 
|  | return expectList(f(0), [0, 1]).whenComplete(() { | 
|  | return expectList(f(1), [1]); | 
|  | }).whenComplete(() { | 
|  | return expectList(f(2), [2]); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | test('dead-code return', () { | 
|  | f() async* { | 
|  | return; | 
|  | yield 1; | 
|  | } | 
|  |  | 
|  | return expectList(f(), []); | 
|  | }); | 
|  |  | 
|  | test('dead-code throw', () { | 
|  | f() async* { | 
|  | try { | 
|  | throw 0; | 
|  | yield 1; | 
|  | } catch (_) {} | 
|  | } | 
|  |  | 
|  | return expectList(f(), []); | 
|  | }); | 
|  |  | 
|  | test('dead-code break', () { | 
|  | f() async* { | 
|  | while (true) { | 
|  | break; | 
|  | yield 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | return expectList(f(), []); | 
|  | }); | 
|  |  | 
|  | test('dead-code break 2', () { | 
|  | f() async* { | 
|  | label: | 
|  | { | 
|  | break label; | 
|  | yield 1; | 
|  | } | 
|  | } | 
|  |  | 
|  | return expectList(f(), []); | 
|  | }); | 
|  |  | 
|  | test('dead-code continue', () { | 
|  | f() async* { | 
|  | do { | 
|  | continue; | 
|  | yield 1; | 
|  | } while (false); | 
|  | } | 
|  |  | 
|  | return expectList(f(), []); | 
|  | }); | 
|  | } |