// 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.

import "package:expect/expect.dart";

class Helper {
  static int f1() {
    for (;;) return 1;
  }

  static int f2(var n) {
    int i = 0;
    for (; i < n; i++) ;
    return i;
  }

  static int f3(int n) {
    int i = 0;
    for (int j = 0; j < n; j++) i = i + j + 1;
    return i;
  }

  static int f4(n) {
    int i = 0;
    for (bool stop = false; (i < n) && !stop; i++) {
      if (i >= 5) {
        stop = true;
      }
    }
    return i;
  }

  static var status;
  static void f5() {
    status = 0;
    for (var stop = false; ;) {
      if (stop) {
        break;
      } else {
        stop = true;
        continue;
      }
    }
    status = 1;
  }

  static int f6() {
    // Verify that side effects in the condition are visible after the loop.
    int i = 0;
    for (; ++i < 3;) {}
    return i;
  }
}

class ForTest {
  static testMain() {
    Expect.equals(1, Helper.f1());
    Expect.equals(0, Helper.f2(-1));
    Expect.equals(0, Helper.f2(0));
    Expect.equals(10, Helper.f2(10));
    Expect.equals(0, Helper.f3(-1));
    Expect.equals(0, Helper.f3(0));
    Expect.equals(1, Helper.f3(1));
    Expect.equals(3, Helper.f3(2));
    Expect.equals(6, Helper.f3(3));
    Expect.equals(10, Helper.f3(4));
    Expect.equals(0, Helper.f4(-1));
    Expect.equals(0, Helper.f4(0));
    Expect.equals(1, Helper.f4(1));
    Expect.equals(6, Helper.f4(6));
    Expect.equals(6, Helper.f4(10));

    Helper.f5();
    Expect.equals(1, Helper.status);

    Expect.equals(3, Helper.f6());
  }
}

main() {
  ForTest.testMain();
  testShadowLocal();
}

void testShadowLocal() {
  List<int> x = [1, 2, 3];
  for (var x = x; ;) break;
  //           ^
  // [cfe] Local variable 'x' can't be referenced before it is declared.
}
