// Copyright (c) 2011, 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 test program for testing for statement which captures loop variable.

var f;

main() {
  // Capture the loop variable, ensure we capture the right value.
  for (int i = 0; i < 10; i++) {
    if (i == 7) {
      f = () => "i = $i";
    }
  }
  Expect.equals("i = 7", f());

  // There is only one instance of k. The captured variable continues
  // to change.
  int k;
  for (k = 0; k < 10; k++) {
    if (k == 7) {
      f = () => "k = $k";
    }
  }
  Expect.equals("k = 10", f());

  // l gets modified after it's captured. n++ is executed on the
  // newly introduced instance of n (i.e. the instance of the loop
  // iteration after the value is captured).
  for (int n = 0; n < 10; n++) {
    var l = n;
    if (l == 7) {
      f = () => "l = $l, n = $n";
    }
    l++;
  }
  Expect.equals("l = 8, n = 7", f());

  // Loop variable is incremented in loop body instead of the increment.
  // expression. Thus, the captured value is incremented by one before
  // a new loop variable instance is created.
  for (int i = 0; i < 10; /*nothing*/) {
    if (i == 7) {
      f = () => "i = $i";
    }
    i++;
  }
  Expect.equals("i = 8", f());

  // Make sure continue still ensures the loop variable is captured correctly.
  for (int i = 0; i < 10; i++) {
    if (i == 7) {
      f = () => "i = $i";
    }
    continue;
    i++;
  }
  Expect.equals("i = 7", f());

  // Nested loops with captured variables.
  for (int k = 0; k < 5; k++) {
    for (int i = 0; i < 10; i++) {
      if (k == 3 && i == 7) {
        f = () => "k = $k, i = $i";
      }
    }
  }
  Expect.equals("k = 3, i = 7", f());
}
