| // 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. |
| |
| 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 dartfmt 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(), []); |
| }); |
| } |