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

// @dart = 2.9

import "package:expect/expect.dart";

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

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

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

    // Use a label to continue to the outer loop.
    i = 0;
    L:
    while (i < 50) {
      i += 3;
      while (i < 30) {
        i += 2;
        if (i < 10) {
          continue L;
        } else {
          i++;
          break;
        }
      }
      break;
    }
    Expect.equals(11, i);

    // continue without label inside switch continues to innermost loop.
    do {
      i = 20;
      switch (0) {
        case 0:
          i = 22;
          continue;
        default:
          i = 25;
          break;
      }
      i = 30;
    } while (false);
    Expect.equals(22, i);
  }
}

main() {
  ContinueTest.testMain();
}
