// Copyright (c) 2012, 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.

import "package:expect/expect.dart";

closure0() {
  var fs = [];
  for (var x = 1; x <= 3; x++) {
    fs.add(() {
      return x;
    });
  }
  Expect.equals(3, fs.length);
  Expect.equals(1, fs[0]());
  Expect.equals(2, fs[1]());
  Expect.equals(3, fs[2]());
}

closure1() {
  var fs = [];
  for (var x = 0; x < 6; x++) {
    fs.add(() {
      return x;
    });
    x++;
  }
  Expect.equals(3, fs.length);
  Expect.equals(1, fs[0]());
  Expect.equals(3, fs[1]());
  Expect.equals(5, fs[2]());
}

closure2() {
  var input = [1, 2, 3];
  var fs = [];
  for (var i = 0; i < input.length; i++) {
    fs.add(() {
      return input[i];
    });
  }
  Expect.equals(3, fs.length);
  Expect.equals(1, fs[0]());
  Expect.equals(2, fs[1]());
  Expect.equals(3, fs[2]());
}

closure3() {
  var fs = [];
  for (
    var i = 0;
    i < 3;
    (() {
      fs.add(() => i);
      i++;
    })()
  ) {
    i++;
  }
  Expect.equals(2, fs.length);
  Expect.equals(3, fs[0]());
  Expect.equals(4, fs[1]());
}

closure4() {
  var g;
  for (
    var i = 0;
    (() {
      g = () => i;
      return false;
    })();
    i++
  ) {
    Expect.equals(false, true);
  }
  Expect.equals(0, g());
}

main() {
  closure0();
  closure1();
  closure2();
  closure3();
  closure4();
}
