// 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 'dart:async';

import 'package:async_helper/async_minitest.dart';

import 'utils.dart';

main() {
  test('pauses execution at yield for at least a microtask', () {
    var list = [];
    f() async* {
      list.add(1);
      yield 2;
      list.add(3);
      yield 4;
      list.add(5);
    }

    var done = Completer();
    var sub = f().listen((v) {
      if (v == 2) {
        expect(list, equals([1]));
      } else if (v == 4) {
        expect(list, equals([1, 3]));
      } else {
        fail('Unexpected value $v');
      }
    }, onDone: () {
      expect(list, equals([1, 3, 5]));
      done.complete();
    });
    return done.future;
  });

  test('pause stops execution at yield', () {
    var list = [];
    f() async* {
      list.add(1);
      yield 2;
      list.add(3);
      yield 4;
      list.add(5);
    }

    var done = Completer();
    var sub;
    sub = f().listen((v) {
      if (v == 2) {
        expect(list, equals([1]));
        sub.pause();
        Timer(ms * 300, () {
          expect(list.length, lessThan(3));
          sub.resume();
        });
      } else if (v == 4) {
        expect(list, equals([1, 3]));
      } else {
        fail('Unexpected value $v');
      }
    }, onDone: () {
      expect(list, equals([1, 3, 5]));
      done.complete();
    });
    return done.future;
  });

  test('pause stops execution at yield 2', () {
    var list = [];
    f() async* {
      int i = 0;
      while (true) {
        yield i;
        list.add(i);
        i++;
      }
    }

    int expected = 0;
    var done = Completer();
    var sub;
    sub = f().listen((v) {
      expect(v, equals(expected++));
      if (v % 5 == 0) {
        sub.pause(Future.delayed(ms * 300));
      } else if (v == 17) {
        sub.cancel();
        done.complete();
      }
    }, onDone: () {
      fail('Unexpected done!');
    });
    return done.future.whenComplete(() {
      expect(list.length == 18 || list.length == 19, isTrue);
    });
  });
}
