| // Copyright (c) 2016, 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'; |
| |
| testSimpleBreak() { |
| var x = 1; |
| while (true) { |
| try { |
| x++; |
| break; |
| } finally { |
| x++; |
| break; |
| } |
| } |
| return x; |
| } |
| |
| testReturnFinally() { |
| try { |
| return 1; |
| } finally { |
| return 42; |
| } |
| } |
| |
| testNestedReturnFinally() { |
| try { |
| try { |
| return 1; |
| } finally { |
| return 2; |
| } |
| } finally { |
| return 42; |
| } |
| } |
| |
| testReturnInsideLoop() { |
| while (true) { |
| try { |
| print("hello"); |
| } finally { |
| return 42; |
| } |
| } |
| } |
| |
| testStopContinueInsideLoop() { |
| while (true) { |
| try { |
| continue; |
| } finally { |
| return 42; |
| } |
| } |
| } |
| |
| testStopBreakInsideLoop() { |
| var foo = 1; |
| while (true) { |
| try { |
| if (foo == 1) { |
| // 1st iteration we break. |
| break; |
| } else if (foo == 2) { |
| // 2nd iteration we return. |
| return 42; |
| } |
| } finally { |
| // 1st iteration we overrwrite break with continue. |
| if (foo == 1) { |
| foo++; |
| continue; |
| } else { |
| // Let return work |
| } |
| } |
| } |
| return foo; |
| } |
| |
| testStopBreakInsideLoop2() { |
| var foo = 1; |
| while (true) { |
| try { |
| if (foo == 1) { |
| // 1st iteration we break. |
| break; |
| } else if (foo == 2) { |
| // 2nd iteration we return. |
| return -1; |
| } |
| } finally { |
| // 1st iteration we overrwrite break with continue. |
| if (foo == 1) { |
| foo++; |
| continue; |
| } else { |
| // 2nd iteration we overrwrite return with break. |
| foo = 42; |
| break; |
| } |
| } |
| } |
| return foo; |
| } |
| |
| testStopContinueInsideSwitch() { |
| var foo = 1; |
| switch (foo) { |
| jump5: |
| case 5: |
| return -1; |
| |
| case 1: |
| try { |
| continue jump5; |
| } finally { |
| return 42; |
| } |
| } |
| } |
| |
| testStopContinueInsideSwitch2() { |
| var foo = 1; |
| switch (foo) { |
| jump5: |
| case 5: |
| return -1; |
| |
| jump42: |
| case 5: |
| return 42; |
| |
| case 1: |
| try { |
| continue jump5; |
| } finally { |
| continue jump42; |
| } |
| } |
| } |
| |
| testNestedFinally() { |
| var events = ''; |
| try { |
| try { |
| events = '$events|start'; |
| } finally { |
| events = '$events|start-catch'; |
| } |
| try { |
| try { |
| return; |
| } finally { |
| events = '$events|inner'; |
| throw 0; |
| } |
| } finally { |
| events = '$events|middle'; |
| } |
| } catch (e) { |
| events = '$events|outer-catch'; |
| } finally { |
| events = '$events|outer-finally'; |
| } |
| Expect.equals( |
| events, '|start|start-catch|inner|middle|outer-catch|outer-finally'); |
| } |
| |
| main() { |
| Expect.isTrue(testSimpleBreak() == 3); |
| Expect.isTrue(testReturnFinally() == 42); |
| Expect.isTrue(testNestedReturnFinally() == 42); |
| Expect.isTrue(testReturnInsideLoop() == 42); |
| Expect.isTrue(testStopContinueInsideLoop() == 42); |
| Expect.isTrue(testStopBreakInsideLoop() == 42); |
| Expect.isTrue(testStopBreakInsideLoop2() == 42); |
| Expect.isTrue(testStopContinueInsideLoop() == 42); |
| Expect.isTrue(testStopContinueInsideSwitch() == 42); |
| Expect.isTrue(testStopContinueInsideSwitch2() == 42); |
| testNestedFinally(); |
| } |