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

// @dart = 2.9

import "package:expect/expect.dart";

class Helper {
  static int f1(bool b) {
    while (b) return 1;

    return 2;
  }

  static int f2(bool b) {
    while (b) {
      return 1;
    }
    return 2;
  }

  static int f3(int n) {
    int i = 0;
    while (i < n) {
      i++;
    }
    return i;
  }

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

class WhileTest {
  static testMain() {
    Expect.equals(1, Helper.f1(true));
    Expect.equals(2, Helper.f1(false));
    Expect.equals(1, Helper.f2(true));
    Expect.equals(2, Helper.f2(false));
    Expect.equals(0, Helper.f3(-2));
    Expect.equals(0, Helper.f3(-1));
    Expect.equals(0, Helper.f3(0));
    Expect.equals(1, Helper.f3(1));
    Expect.equals(2, Helper.f3(2));
    Expect.equals(3, Helper.f4());
  }
}

main() {
  WhileTest.testMain();
}
