// Copyright (c) 2013, 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";

// Test several variations of for loops:
//   * With or without an initializer.
//   * With or without a test.
//   * With or without an update.
//   * With or without a continue.
//   * With or without a fall through exit from the body.
//   * With or without a break.

// Note that some possibilities are infinite loops and so not tested.
// Combinations that do not have a break or a test but do have a
// fall through from the body or a continue will never exit the loop.

// Each loop test function sets a status containing a bit for each part of
// the loop that is present, and then clears the bit as that part of the
// loop is executed.  The test expectation should be 0 (all present parts
// were executed), except for a few cases where an update expression is
// unreachable due to a break or return in the loop body.

const int INIT = 1;
const int TEST = 2;
const int UPDATE = 4;
const int CONTINUE = 8;
const int FALL = 16;
const int BREAK = 32;

var status;

void loop0() {
  status = 0;
  for (;;) {
    return;
  }
}

void loop1() {
  status = INIT;
  for (status &= ~INIT; ;) {
    return;
  }
}

void loop2() {
  status = TEST;
  for (; (status &= ~TEST) != 0;) {
    return;
  }
}

void loop3() {
  status = INIT | TEST;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    return;
  }
}

void loop4() {
  status = UPDATE;
  for (; ; status &= ~UPDATE) {
    return;
  }
}

void loop5() {
  status = INIT | UPDATE;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    return;
  }
}

void loop6() {
  status = TEST | UPDATE;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    return;
  }
}

void loop7() {
  status = INIT | TEST | UPDATE;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    return;
  }
}

// Infinite loop not tested.
void loop8() {
  status = CONTINUE;
  for (;;) {
    status &= ~CONTINUE;
    continue;
  }
}

// Infinite loop not tested.
void loop9() {
  status = INIT | CONTINUE;
  for (status &= ~INIT; ;) {
    status &= ~CONTINUE;
    continue;
  }
}

void loop10() {
  status = TEST | CONTINUE;
  for (; (status &= ~TEST) != 0;) {
    status &= ~CONTINUE;
    continue;
  }
}

void loop11() {
  status = INIT | TEST | CONTINUE;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    status &= ~CONTINUE;
    continue;
  }
}

// Infinite loop.
void loop12() {
  status = UPDATE | CONTINUE;
  for (; ; status &= ~UPDATE) {
    status &= ~CONTINUE;
    continue;
  }
}

// Infinite loop.
void loop13() {
  status = INIT | UPDATE | CONTINUE;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    status &= ~CONTINUE;
    continue;
  }
}

void loop14() {
  status = TEST | UPDATE | CONTINUE;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    status &= ~CONTINUE;
    continue;
  }
}

void loop15() {
  status = INIT | TEST | UPDATE | CONTINUE;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    status &= ~CONTINUE;
    continue;
  }
}

// Infinite loop.
void loop16() {
  status = FALL;
  for (;;) {
    status &= ~FALL;
  }
}

// Infinite loop.
void loop17() {
  status = INIT | FALL;
  for (status &= ~INIT; ;) {
    status &= ~FALL;
  }
}

void loop18() {
  status = TEST | FALL;
  for (; (status &= ~TEST) != 0;) {
    status &= ~FALL;
  }
}

void loop19() {
  status = INIT | TEST | FALL;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    status &= ~FALL;
  }
}

// Infinite loop.
void loop20() {
  status = UPDATE | FALL;
  for (; ; status &= ~UPDATE) {
    status &= ~FALL;
  }
}

// Infinite loop.
void loop21() {
  status = INIT | UPDATE | FALL;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    status &= ~FALL;
  }
}

void loop22() {
  status = TEST | UPDATE | FALL;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    status &= ~FALL;
  }
}

void loop23() {
  status = INIT | TEST | UPDATE | FALL;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    status &= ~FALL;
  }
}

// Infinite loop.
void loop24() {
  status = CONTINUE | FALL;
  for (;;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

// Infinite loop.
void loop25() {
  status = INIT | CONTINUE | FALL;
  for (status &= ~INIT; ;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

void loop26() {
  status = TEST | CONTINUE | FALL;
  for (; (status &= ~TEST) != 0;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

void loop27() {
  status = INIT | TEST | CONTINUE | FALL;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

// Infinite loop.
void loop28() {
  status = UPDATE | CONTINUE | FALL;
  for (; ; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

// Infinite loop.
void loop29() {
  status = INIT | UPDATE | CONTINUE | FALL;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

void loop30() {
  status = TEST | UPDATE | CONTINUE | FALL;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

void loop31() {
  status = INIT | TEST | UPDATE | CONTINUE | FALL;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~FALL;
  }
}

void loop32() {
  status = BREAK;
  for (;;) {
    status &= ~BREAK;
    break;
  }
}

void loop33() {
  status = INIT | BREAK;
  for (status &= ~INIT; ;) {
    status &= ~BREAK;
    break;
  }
}

void loop34() {
  status = TEST | BREAK;
  for (; (status &= ~TEST) != 0;) {
    status &= ~BREAK;
    break;
  }
}

void loop35() {
  status = INIT | TEST | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    status &= ~BREAK;
    break;
  }
}

void loop36() {
  status = UPDATE | BREAK;
  for (; ; status &= ~UPDATE) {
    status &= ~BREAK;
    break;
  }
}

void loop37() {
  status = INIT | UPDATE | BREAK;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    status &= ~BREAK;
    break;
  }
}

void loop38() {
  status = TEST | UPDATE | BREAK;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    status &= ~BREAK;
    break;
  }
}

void loop39() {
  status = INIT | TEST | UPDATE | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    status &= ~BREAK;
    break;
  }
}

void loop40() {
  status = CONTINUE | BREAK;
  for (;;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop41() {
  status = INIT | CONTINUE | BREAK;
  for (status &= ~INIT; ;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop42() {
  status = TEST | CONTINUE | BREAK;
  for (; (status &= ~TEST) != 0;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop43() {
  status = INIT | TEST | CONTINUE | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop44() {
  status = UPDATE | CONTINUE | BREAK;
  for (; ; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop45() {
  status = INIT | UPDATE | CONTINUE | BREAK;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop46() {
  status = TEST | UPDATE | CONTINUE | BREAK;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop47() {
  status = INIT | TEST | UPDATE | CONTINUE | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    status &= ~BREAK;
    break;
  }
}

void loop48() {
  status = FALL | BREAK;
  for (;;) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop49() {
  status = INIT | FALL | BREAK;
  for (status &= ~INIT; ;) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop50() {
  status = TEST | FALL | BREAK;
  for (; (status &= ~TEST) != 0;) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop51() {
  status = INIT | TEST | FALL | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop52() {
  status = UPDATE | FALL | BREAK;
  for (; ; status &= ~UPDATE) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop53() {
  status = INIT | UPDATE | FALL | BREAK;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop54() {
  status = TEST | UPDATE | FALL | BREAK;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop55() {
  status = INIT | TEST | UPDATE | FALL | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop56() {
  status = CONTINUE | FALL | BREAK;
  for (;;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop57() {
  status = INIT | CONTINUE | FALL | BREAK;
  for (status &= ~INIT; ;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop58() {
  status = TEST | CONTINUE | FALL | BREAK;
  for (; (status &= ~TEST) != 0;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop59() {
  status = INIT | TEST | CONTINUE | FALL | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0;) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop60() {
  status = UPDATE | CONTINUE | FALL | BREAK;
  for (; ; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop61() {
  status = INIT | UPDATE | CONTINUE | FALL | BREAK;
  for (status &= ~INIT; ; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop62() {
  status = TEST | UPDATE | CONTINUE | FALL | BREAK;
  for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void loop63() {
  status = INIT | TEST | UPDATE | CONTINUE | FALL | BREAK;
  for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
    if ((status & CONTINUE) == CONTINUE) {
      status &= ~CONTINUE;
      continue;
    }
    if ((status & FALL) == FALL) {
      status &= ~FALL;
    } else {
      status &= ~BREAK;
      break;
    }
  }
}

void main() {
  loop0();
  Expect.equals(0, status);
  loop1();
  Expect.equals(0, status);
  loop2();
  Expect.equals(0, status);
  loop3();
  Expect.equals(0, status);

  // The next four tests return with status UPDATE because they return
  // before the update expression is reached.
  loop4();
  Expect.equals(UPDATE, status);
  loop5();
  Expect.equals(UPDATE, status);
  loop6();
  Expect.equals(UPDATE, status);
  loop7();
  Expect.equals(UPDATE, status);

  loop10();
  Expect.equals(0, status);
  loop11();
  Expect.equals(0, status);
  loop14();
  Expect.equals(0, status);
  loop15();
  Expect.equals(0, status);
  loop18();
  Expect.equals(0, status);
  loop19();
  Expect.equals(0, status);
  loop22();
  Expect.equals(0, status);
  loop23();
  Expect.equals(0, status);
  loop26();
  Expect.equals(0, status);
  loop27();
  Expect.equals(0, status);
  loop30();
  Expect.equals(0, status);
  loop31();
  Expect.equals(0, status);
  loop32();
  Expect.equals(0, status);
  loop33();
  Expect.equals(0, status);
  loop34();
  Expect.equals(0, status);
  loop35();
  Expect.equals(0, status);

  // The next four tests return with status UPDATE because they break from
  // the loop before the update expression is reached.
  loop36();
  Expect.equals(4, status);
  loop37();
  Expect.equals(4, status);
  loop38();
  Expect.equals(4, status);
  loop39();
  Expect.equals(4, status);

  loop40();
  Expect.equals(0, status);
  loop41();
  Expect.equals(0, status);
  loop42();
  Expect.equals(0, status);
  loop43();
  Expect.equals(0, status);
  loop44();
  Expect.equals(0, status);
  loop45();
  Expect.equals(0, status);
  loop46();
  Expect.equals(0, status);
  loop47();
  Expect.equals(0, status);
  loop48();
  Expect.equals(0, status);
  loop49();
  Expect.equals(0, status);
  loop50();
  Expect.equals(0, status);
  loop51();
  Expect.equals(0, status);
  loop52();
  Expect.equals(0, status);
  loop53();
  Expect.equals(0, status);
  loop54();
  Expect.equals(0, status);
  loop55();
  Expect.equals(0, status);
  loop56();
  Expect.equals(0, status);
  loop57();
  Expect.equals(0, status);
  loop58();
  Expect.equals(0, status);
  loop59();
  Expect.equals(0, status);
  loop60();
  Expect.equals(0, status);
  loop61();
  Expect.equals(0, status);
  loop62();
  Expect.equals(0, status);
  loop63();
  Expect.equals(0, status);
}
