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

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