| // 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); |
| } |