// TODO(multitest): This was automatically migrated from a multitest and may
// contain strange or dead code.

// @dart = 2.9

// 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];

}
