// Copyright (c) 2022, 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 'dart:async';

import 'package:expect/expect.dart';

import 'utils.dart' show assertStack;

String effectOrder = '';
StackTrace stackAfterYield = null;

void emit(String m) => effectOrder += m;

main() async {
  emit('1');
  await for (final value in produce()) {
    emit('5');
    Expect.equals('|value|', value);
  }
  emit('8');
  Expect.equals('12345678', effectOrder);

  assertStack(const <String>[
    r'^#0      produceInner .*$',
    r'^<asynchronous suspension>$',
    r'^#1      produce .*$',
    r'^<asynchronous suspension>$',
    r'^#2      main .*$',
    r'^<asynchronous suspension>$',
  ], stackAfterYield);

  effectOrder = '';

  emit('1');
  await for (final value in produceYieldStar()) {
    emit('5');
    Expect.equals('|value|', value);
    break;
  }
  emit('6');
  Expect.equals('123456', effectOrder);
}

Stream<dynamic> produce() async* {
  emit('2');
  await for (String response in produceInner()) {
    emit('4');
    yield response;
  }
  emit('7');
}

Stream produceInner() async* {
  emit('3');
  yield '|value|';
  emit('6');
  stackAfterYield = StackTrace.current;
}

Stream<dynamic> produceYieldStar() async* {
  emit('2');
  await for (String response in produceInner()) {
    emit('4');
    yield response;
  }
  emit('x');
}

Stream produceInnerYieldStar() async* {
  emit('3');
  yield* Stream.fromIterable(['|value|', '|value2|']);
  emit('x');
}
