|  | // 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"; | 
|  |  | 
|  | switcher(val) { | 
|  | var x = 0; | 
|  | switch (val) { | 
|  | case 1: | 
|  | x = 100; | 
|  | break; | 
|  | case 2: | 
|  | x = 200; | 
|  | break; | 
|  | case 3: | 
|  | x = 300; | 
|  | break; | 
|  | default: | 
|  | return 400; | 
|  | break; // Intentional dead code (regression test for crash). | 
|  | } | 
|  | return x; | 
|  | } | 
|  |  | 
|  | // Check unambiguated grammar allowing multiple labels per case/default. | 
|  | switcher2(val) { | 
|  | var x = 0; | 
|  | switch (val) { | 
|  | foo: | 
|  | bar: | 
|  | case 1: | 
|  | baz: | 
|  | case 2: | 
|  | fez: | 
|  | { | 
|  | x = 100; | 
|  | break fez; | 
|  | } | 
|  | break; | 
|  | hest: | 
|  | fisk: | 
|  | case 3: | 
|  | case 4: | 
|  | svin: | 
|  | default: | 
|  | barber: | 
|  | { | 
|  | if (val > 2) { | 
|  | x = 200; | 
|  | break; | 
|  | } else { | 
|  | // Enable when continue to switch-case is implemented. | 
|  | continue hest; | 
|  | } | 
|  | } | 
|  | } | 
|  | return x; | 
|  | } | 
|  |  | 
|  | var x = 0; | 
|  |  | 
|  | @pragma('dart2js:noInline') | 
|  | switcher3(val) { | 
|  | switch (val) { | 
|  | case 1: | 
|  | default: | 
|  | incrementX(); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Tests that switch cases work when there is a case that calls a function | 
|  | // that always throws, and there is no break in the switch statement. | 
|  | switcher4(val) { | 
|  | switch (val) { | 
|  | case 1: | 
|  | return 100; | 
|  | case 2: _throw(); //# 00: compile-time error | 
|  | case 3: | 
|  | _throw(); | 
|  | break; | 
|  | default: | 
|  | return 300; | 
|  | } | 
|  | } | 
|  |  | 
|  | _throw() { | 
|  | throw 'exception'; | 
|  | } | 
|  |  | 
|  | // Tests that we generate a break after the last case if it isn't default. | 
|  | switcher5(val) { | 
|  | var x = 0; | 
|  | switch(val) { | 
|  | case 1: | 
|  | return 100; | 
|  | case 2: | 
|  | return 200; | 
|  | case 3: | 
|  | x = 300; | 
|  | } | 
|  | return x; | 
|  | } | 
|  |  | 
|  | incrementX() { | 
|  | x++; | 
|  | } | 
|  |  | 
|  | badswitches(val) { | 
|  | // Test some badly formed switch bodies. | 
|  | // 01 - a label/statement without a following case/default. | 
|  | // 02 - a label without a following case/default or statement. | 
|  | switch (val) { | 
|  | foo: break; //    //# 01: compile-time error | 
|  | case 2: //        //# 02: compile-time error | 
|  | foo: //           //# 02: continued | 
|  | } | 
|  | } | 
|  |  | 
|  | main() { | 
|  | Expect.equals(100, switcher(1)); | 
|  | Expect.equals(200, switcher(2)); | 
|  | Expect.equals(300, switcher(3)); | 
|  | Expect.equals(400, switcher(4)); | 
|  |  | 
|  | Expect.equals(100, switcher2(1)); | 
|  | Expect.equals(100, switcher2(2)); | 
|  | Expect.equals(200, switcher2(3)); | 
|  | Expect.equals(200, switcher2(4)); | 
|  | Expect.equals(200, switcher2(5)); | 
|  |  | 
|  |  | 
|  | switcher3(1); | 
|  | Expect.equals(1, x); | 
|  |  | 
|  | Expect.equals(100, switcher4(1)); | 
|  |  | 
|  | Expect.equals(100, switcher5(1)); | 
|  | Expect.equals(200, switcher5(2)); | 
|  | Expect.equals(300, switcher5(3)); | 
|  |  | 
|  | badswitches(42); | 
|  | } |