// 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:expect/legacy/async_minitest.dart'; // ignore: deprecated_member_use

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