// 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('local variable', () {
    f() async* {
      var x = 42;
      yield x;
    }

    return expectList(f(), [42]);
  });

  test('constant variable', () {
    f() async* {
      const x = 42;
      yield x;
    }

    return expectList(f(), [42]);
  });

  test('function call', () {
    g() => 42;
    f() async* {
      yield g();
    }

    return expectList(f(), [42]);
  });

  test('unary operator', () {
    f() async* {
      var x = -42;
      yield -x;
    }

    return expectList(f(), [42]);
  });

  test('binary operator', () {
    f() async* {
      var x = 21;
      yield x + x;
    }

    return expectList(f(), [42]);
  });

  test('ternary operator', () {
    f() async* {
      var x = 21;
      yield x == 21 ? x + x : x;
    }

    return expectList(f(), [42]);
  });

  test('suffix post-increment', () {
    f() async* {
      var x = 42;
      yield x++;
    }

    return expectList(f(), [42]);
  });

  test('suffix pre-increment', () {
    f() async* {
      var x = 41;
      yield ++x;
    }

    return expectList(f(), [42]);
  });

  test('assignment', () {
    f() async* {
      var x = 37;
      yield x = 42;
    }

    return expectList(f(), [42]);
  });

  test('assignment op', () {
    f() async* {
      var x = 41;
      yield x += 1;
    }

    return expectList(f(), [42]);
  });

  test('await', () {
    f() async* {
      yield await Future.value(42);
    }

    return expectList(f(), [42]);
  });

  test('index operator', () {
    f() async* {
      var x = [42];
      yield x[0];
    }

    return expectList(f(), [42]);
  });

  test('function expression block', () {
    var o = Object();
    f() async* {
      yield () {
        return o;
      };
    }

    return f().first.then((v) {
      expect(v(), same(o));
    });
  });

  test('function expression arrow', () {
    var o = Object();
    f() async* {
      yield () => o;
    }

    return f().first.then((v) {
      expect(v(), same(o));
    });
  });

  test('function expression block async', () {
    var o = Object();
    f() async* {
      yield () async {
        return o;
      };
    }

    return f().first.then((v) => v()).then((v) {
      expect(v, same(o));
    });
  });

  test('function expression arrow async', () {
    var o = Object();
    f() async* {
      yield () async => o;
    }

    return f().first.then((v) => v()).then((v) {
      expect(v, same(o));
    });
  });

  test('function expression block async*', () {
    var o = Object();
    f() async* {
      yield () async* {
        yield o;
      };
    }

    return f().first.then((v) => v().first).then((v) {
      expect(v, same(o));
    });
  });
}
