// 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';

main() {
  test('simple yield', () {
    f() async* {
      for (int i = 0; i < 3; i++) {
        yield i;
      }
    }

    return expectList(f(), [0, 1, 2]);
  });

  test('yield in double loop', () {
    f() async* {
      for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
          yield i * 2 + j;
        }
      }
    }

    return expectList(f(), [0, 1, 2, 3, 4, 5]);
  });

  test('yield in try body', () {
    var list = [];
    f() async* {
      for (int i = 0; i < 3; i++) {
        try {
          yield i;
        } finally {
          list.add('$i');
        }
      }
    }

    return expectList(f(), [0, 1, 2]).whenComplete(() {
      expect(list, equals(['0', '1', '2']));
    });
  });

  test('yield in catch', () {
    var list = [];
    f() async* {
      for (int i = 0; i < 3; i++) {
        try {
          throw i;
        } catch (e) {
          yield e;
        } finally {
          list.add('$i');
        }
      }
    }

    return expectList(f(), [0, 1, 2]).whenComplete(() {
      expect(list, equals(['0', '1', '2']));
    });
  });

  test('yield in finally', () {
    var list = [];
    f() async* {
      for (int i = 0; i < 3; i++) {
        try {
          throw i;
        } finally {
          yield i;
          list.add('$i');
          continue;
        }
      }
    }

    return expectList(f(), [0, 1, 2]).whenComplete(() {
      expect(list, equals(['0', '1', '2']));
    });
  });

  test('keep yielding after cancel', () {
    f() async* {
      for (int i = 0; i < 10; i++) {
        try {
          yield i;
        } finally {
          continue;
        }
      }
    }

    return expectList(f().take(3), [0, 1, 2]);
  });
}
