// 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 for breaks in for, do/while and while loops.

// @dart = 2.9

import "package:expect/expect.dart";

class BreakTest {
  static testMain() {
    int i;
    int forCounter = 0;
    for (i = 0; i < 10; i++) {
      forCounter++;
      if (i > 3) break;
    }
    Expect.equals(5, forCounter);
    Expect.equals(4, i);

    i = 0;
    int doWhileCounter = 0;
    do {
      i++;
      doWhileCounter++;
      if (i > 3) break;
    } while (i < 10);
    Expect.equals(4, doWhileCounter);
    Expect.equals(4, i);

    i = 0;
    int whileCounter = 0;
    while (i < 10) {
      i++;
      whileCounter++;
      if (i > 3) break;
    }
    Expect.equals(4, whileCounter);
    Expect.equals(4, i);

    // Use a label to break to the outer loop.
    i = 0;
    L:
    while (i < 10) {
      i++;
      while (i > 5) {
        break L;
      }
    }
    Expect.equals(6, i);
  }
}

main() {
  BreakTest.testMain();
}
