| // Copyright (c) 2012, 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. |
| |
| import "package:expect/expect.dart"; |
| |
| class A { |
| operator +(arg) => 42; |
| } |
| |
| get42() => 42; |
| getNonInt() => new A(); |
| use(x) => x; |
| |
| void testInWhileLoop() { |
| var c = get42(); |
| while (true) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e != null) break; |
| while (true) use(e); |
| } |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| } |
| |
| void testInNestedWhileLoop() { |
| var c = get42(); |
| while (true) { |
| while (true) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e != null) break; |
| } |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| if (c == 42) break; |
| } |
| } |
| |
| void testInNestedWhileLoop2() { |
| var c = get42(); |
| L0: |
| while (true) { |
| while (true) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e != null) break L0; |
| while (true) use(e); |
| } |
| } |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| } |
| |
| void testInNestedWhileLoop3() { |
| var c = get42(); |
| int index = 0; |
| while (index < 2) { |
| while (index < 2) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e != null && index++ == 0) break; |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| while (e == null) use(e); |
| } |
| } |
| } |
| |
| void testInDoWhileLoop() { |
| var c = get42(); |
| do { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e != null) break; |
| while (true) use(e); |
| } while (true); |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| } |
| |
| void testInForLoop() { |
| var c = get42(); |
| for (int i = 0; i < 10; i++) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e != null) break; |
| while (true) use(e); |
| } |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| } |
| |
| void testLabeledIf() { |
| var c = get42(); |
| L1: |
| if (c == 42) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e == null) break L1; |
| // This is what matters: 'c' must have been saved in the |
| // environment. |
| Expect.equals(c, 42); |
| while (e == null) use(e); |
| } |
| Expect.equals(c, 42); |
| } |
| |
| void testLabeledIf2() { |
| var c = get42(); |
| L1: |
| if (c == 42) { |
| var e = getNonInt(); |
| Expect.equals(42, e + 2); |
| if (e == null) break L1; |
| Expect.equals(42, e + 1); |
| while (e == null) use(e); |
| } |
| Expect.equals(42, c); |
| } |
| |
| main() { |
| testInWhileLoop(); |
| testInDoWhileLoop(); |
| testInForLoop(); |
| testInNestedWhileLoop(); |
| testInNestedWhileLoop2(); |
| testInNestedWhileLoop3(); |
| testLabeledIf(); |
| testLabeledIf2(); |
| } |