// Copyright (c) 2019, 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_helper.dart";
import 'package:expect/expect.dart';

final list = [1, 2, 3];
final map = {1: 1, 2: 2, 3: 3};
final set = {1, 2, 3};

void main() {
  asyncTest(() async {
    await testList();
    await testMap();
    await testSet();
  });
}

Future<void> testList() async {
  var future123 = Future.value([1, 2, 3]);
  var future1 = Future.value(1);

  // Await in iterable.
  Expect.listEquals(list, [for (var i in await future123) i]);

  // Await in for-in body.
  Expect.listEquals(list, [for (var i in [1, 2, 3]) await Future.value(i)]);

  // Await in initializer.
  Expect.listEquals(list, [for (var i = await future1; i < 4; i++) i]);

  // Await in condition.
  Expect.listEquals(list,
      [for (var i = 1; await Future.value(i < 4); i++) i]);

  // Await in increment.
  Expect.listEquals(list,
      [for (var i = 1; i < 4; await Future(() => i++)) i]);

  // Await in for body.
  Expect.listEquals(list,
      [for (var i = 1; i < 4; i++) await Future.value(i)]);
}

Future<void> testMap() async {
  var future123 = Future.value([1, 2, 3]);
  var future1 = Future.value(1);

  // Await in iterable.
  Expect.mapEquals(map, {for (var i in await future123) i: i});

  // Await in for-in body key.
  Expect.mapEquals(map,
      {for (var i in [1, 2, 3]) await Future.value(i): i});

  // Await in for-in body value.
  Expect.mapEquals(map,
      {for (var i in [1, 2, 3]) i: await Future.value(i)});

  // Await in initializer.
  Expect.mapEquals(map, {for (var i = await future1; i < 4; i++) i: i});

  // Await in condition.
  Expect.mapEquals(map,
      {for (var i = 1; await Future.value(i < 4); i++) i: i});

  // Await in increment.
  Expect.mapEquals(map,
      {for (var i = 1; i < 4; await Future(() => i++)) i: i});

  // Await in for body key.
  Expect.mapEquals(map,
      {for (var i = 1; i < 4; i++) await Future.value(i): i});

  // Await in for body value.
  Expect.mapEquals(map,
      {for (var i = 1; i < 4; i++) i: await Future.value(i)});
}

Future<void> testSet() async {
  var future123 = Future.value([1, 2, 3]);
  var future1 = Future.value(1);

  // Await in iterable.
  Expect.setEquals(set, {for (var i in await future123) i});

  // Await in for-in body.
  Expect.setEquals(set, {for (var i in [1, 2, 3]) await Future.value(i)});

  // Await in initializer.
  Expect.setEquals(set, {for (var i = await future1; i < 4; i++) i});

  // Await in condition.
  Expect.setEquals(set,
      {for (var i = 1; await Future.value(i < 4); i++) i});

  // Await in increment.
  Expect.setEquals(set,
      {for (var i = 1; i < 4; await Future(() => i++)) i});

  // Await in for body.
  Expect.setEquals(set,
      {for (var i = 1; i < 4; i++) await Future.value(i)});
}
