// Copyright (c) 2014, 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:expect/expect.dart";

run(callback) => callback();

initializer() {
  var closure;
  for (var i = 0, fn = () => i; i < 3; i++) {
    i += 1;
    closure = fn;
  }
  Expect.equals(1, closure());
}

condition() {
  var closures = [];
  check(callback) {
    closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0; check(() => ++i) < 8; ++i) {
    values.add(i);
  }
  Expect.listEquals([1, 3, 5, 7], values);
  Expect.listEquals([2, 4, 6, 8, 10], closures.map(run).toList());
}

body() {
  var closures = [];
  for (var i = 0, j = 0; i < 3; i++) {
    j++;
    closures.add(() => i);
    closures.add(() => j);
  }
  Expect.listEquals([0, 1, 1, 2, 2, 3], closures.map(run).toList());
}

update() {
  var closures = [];
  check(callback) {
    closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0; i < 4; check(() => ++i)) {
    values.add(i);
  }
  Expect.listEquals([0, 1, 2, 3], values);
  Expect.listEquals([2, 3, 4, 5], closures.map(run).toList());
}

initializer_condition() {
  var values = [];
  for (var i = 0, fn = () => i; run(() => ++i) < 3;) {
    values.add(i);
    values.add(fn());
  }
  Expect.listEquals([1, 1, 2, 1], values);
}

initializer_update() {
  var update_closures = [];
  update(callback) {
    update_closures.add(callback);
    return callback();
  }

  var init_closure;
  for (var i = 0, fn = () => i; i < 4; update(() => ++i)) {
    init_closure = fn;
    if (i == 0) {
      ++i; // Mutate copy of 'i' from first iteration.
    }
  }
  Expect.equals(1, init_closure());
  Expect.listEquals([3, 4, 5], update_closures.map(run).toList());
  Expect.equals(1, init_closure());
}

initializer_body() {
  var closures = [];
  for (var i = 0, fn = () => i; i < 3; i++) {
    closures.add(() => i);
    closures.add(fn);
    fn = () => i;
  }
  Expect.listEquals([0, 0, 1, 0, 2, 1], closures.map(run).toList());
}

condition_update() {
  var cond_closures = [];
  check(callback) {
    cond_closures.add(callback);
    return callback();
  }

  var update_closures = [];
  update(callback) {
    update_closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0; check(() => i) < 4; update(() => ++i)) {
    values.add(i);
  }
  Expect.listEquals([0, 1, 2, 3], values);

  Expect.listEquals([0, 1, 2, 3, 4], cond_closures.map(run).toList());
  Expect.listEquals([2, 3, 4, 5], update_closures.map(run).toList());
  Expect.listEquals([0, 2, 3, 4, 5], cond_closures.map(run).toList());
}

condition_body() {
  var cond_closures = [];
  check(callback) {
    cond_closures.add(callback);
    return callback();
  }

  var body_closures = [];
  do_body(callback) {
    body_closures.add(callback);
    return callback();
  }

  for (var i = 0; check(() => i) < 4; ++i) {
    do_body(() => i);
  }
  Expect.listEquals([0, 1, 2, 3, 4], cond_closures.map(run).toList());
  Expect.listEquals([0, 1, 2, 3], body_closures.map(run).toList());
}

initializer_condition_update() {
  var init;
  var cond_closures = [];
  check(callback) {
    cond_closures.add(callback);
    return callback();
  }

  var update_closures = [];
  update(callback) {
    update_closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0, fn = () => i; check(() => ++i) < 8; update(() => ++i)) {
    init = fn;
    values.add(i);
  }
  Expect.listEquals([1, 3, 5, 7], values);
  Expect.equals(1, init());

  Expect.listEquals([2, 4, 6, 8, 10], cond_closures.map(run).toList());
  Expect.listEquals([5, 7, 9, 11], update_closures.map(run).toList());
}

initializer_condition_body() {
  var init;
  var cond_closures = [];
  check(callback) {
    cond_closures.add(callback);
    return callback();
  }

  var body_closures = [];
  do_body(callback) {
    body_closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0, fn = () => i; check(() => ++i) < 8;) {
    init = fn;
    do_body(() => ++i);
    values.add(i);
  }
  Expect.listEquals([2, 4, 6, 8], values);
  Expect.equals(2, init());

  Expect.listEquals([3, 5, 7, 9, 10], cond_closures.map(run).toList());
  Expect.listEquals([4, 6, 8, 10], body_closures.map(run).toList());
}

initializer_update_body() {
  var init;
  var update_closures = [];
  update(callback) {
    update_closures.add(callback);
    return callback();
  }

  var body_closures = [];
  do_body(callback) {
    body_closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0, fn = () => i; i < 8; update(() => ++i)) {
    init = fn;
    do_body(() => ++i);
    values.add(i);
  }
  Expect.listEquals([1, 3, 5, 7], values);
  Expect.equals(1, init());

  Expect.listEquals([4, 6, 8, 9], update_closures.map(run).toList());
  Expect.listEquals([2, 5, 7, 9], body_closures.map(run).toList());
}

condition_update_body() {
  var cond_closures = [];
  check(callback) {
    cond_closures.add(callback);
    return callback();
  }

  var update_closures = [];
  update(callback) {
    update_closures.add(callback);
    return callback();
  }

  var body_closures = [];
  do_body(callback) {
    body_closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0; check(() => i) < 8; update(() => ++i)) {
    do_body(() => ++i);
    values.add(i);
  }
  Expect.listEquals([1, 3, 5, 7], values);

  Expect.listEquals([1, 3, 5, 7, 8], cond_closures.map(run).toList());
  Expect.listEquals([4, 6, 8, 9], update_closures.map(run).toList());
  Expect.listEquals([2, 5, 7, 9], body_closures.map(run).toList());
  Expect.listEquals([2, 5, 7, 9, 9], cond_closures.map(run).toList());
}

initializer_condition_update_body() {
  var init;
  var cond_closures = [];
  check(callback) {
    cond_closures.add(callback);
    return callback();
  }

  var update_closures = [];
  update(callback) {
    update_closures.add(callback);
    return callback();
  }

  var body_closures = [];
  do_body(callback) {
    body_closures.add(callback);
    return callback();
  }

  var values = [];
  for (var i = 0, fn = () => i; check(() => i) < 8; update(() => ++i)) {
    init = fn;
    do_body(() => ++i);
    values.add(i);
  }
  Expect.listEquals([1, 3, 5, 7], values);
  Expect.equals(1, init());

  Expect.listEquals([1, 3, 5, 7, 8], cond_closures.map(run).toList());
  Expect.listEquals([4, 6, 8, 9], update_closures.map(run).toList());
  Expect.listEquals([2, 5, 7, 9], body_closures.map(run).toList());
  Expect.listEquals([2, 5, 7, 9, 9], cond_closures.map(run).toList());
}

main() {
  initializer();
  condition();
  update();
  body();
  initializer_condition();
  initializer_update();
  initializer_body();
  condition_update();
  condition_body();
  initializer_condition_update();
  initializer_condition_body();
  initializer_update_body();
  condition_update_body();
  initializer_condition_update_body();
}
