mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:52:45 +00:00 
			
		
		
		
	 e5d48ee238
			
		
	
	
		e5d48ee238
		
	
	
	
	
		
			
			When no case match we should not just execute the statements of the default case but also of any cases below the default case.
		
			
				
	
	
		
			110 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| describe("basic switch tests", () => {
 | |
|     test("string case does not match number target", () => {
 | |
|         switch (1 + 2) {
 | |
|             case "3":
 | |
|                 expect().fail();
 | |
|             case 3:
 | |
|                 return;
 | |
|             case 5:
 | |
|             case 1:
 | |
|                 break;
 | |
|             default:
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         expect().fail();
 | |
|     });
 | |
| 
 | |
|     test("string concatenation in target", () => {
 | |
|         var a = "foo";
 | |
| 
 | |
|         switch (a + "bar") {
 | |
|             case 1:
 | |
|                 expect().fail();
 | |
|             case "foobar":
 | |
|             case 2:
 | |
|                 return;
 | |
|         }
 | |
|         expect().fail();
 | |
|     });
 | |
| 
 | |
|     test("default", () => {
 | |
|         switch (100) {
 | |
|             default:
 | |
|                 return;
 | |
|         }
 | |
| 
 | |
|         expect().fail();
 | |
|     });
 | |
| 
 | |
|     test("return from switch statement", () => {
 | |
|         function foo(value) {
 | |
|             switch (value) {
 | |
|                 case 42:
 | |
|                     return "return from 'case 42'";
 | |
|                 default:
 | |
|                     return "return from 'default'";
 | |
|             }
 | |
|         }
 | |
|         expect(foo(42)).toBe("return from 'case 42'");
 | |
|         expect(foo(43)).toBe("return from 'default'");
 | |
|     });
 | |
| 
 | |
|     test("continue from switch statement", () => {
 | |
|         let i = 0;
 | |
|         for (; i < 5; ++i) {
 | |
|             switch (i) {
 | |
|                 case 0:
 | |
|                     continue;
 | |
|                     expect().fail();
 | |
|                 case 0:
 | |
|                     expect().fail();
 | |
|                 default:
 | |
|                     continue;
 | |
|                     expect().fail();
 | |
|             }
 | |
|             expect().fail();
 | |
|         }
 | |
|         expect(i).toBe(5);
 | |
|     });
 | |
| 
 | |
|     test("default branch is not taken if more exact branch exists", () => {
 | |
|         function switchTest(i) {
 | |
|             let result = 0;
 | |
|             switch (i) {
 | |
|                 case 1:
 | |
|                     result += 1;
 | |
|                     break;
 | |
|                 case 1:
 | |
|                     expect().fail();
 | |
|                 case 2:
 | |
|                     result += 2;
 | |
|                 default:
 | |
|                     result += 4;
 | |
|                 case 3:
 | |
|                     result += 8;
 | |
|                     break;
 | |
|                 case 2:
 | |
|                     expect().fail();
 | |
|             }
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
|         expect(switchTest(1)).toBe(1);
 | |
|         expect(switchTest(2)).toBe(14);
 | |
|         expect(switchTest(3)).toBe(8);
 | |
|         expect(switchTest(4)).toBe(12);
 | |
|     });
 | |
| });
 | |
| 
 | |
| describe("errors", () => {
 | |
|     test("syntax errors", () => {
 | |
|         expect("switch () {}").not.toEval();
 | |
|         expect("switch () { case 1: continue; }").not.toEval();
 | |
|         expect("switch () { case 1: break doesnotexist; }").not.toEval();
 | |
|         expect("label: switch () { case 1: break not_the_right_label; }").not.toEval();
 | |
|         expect("label: switch () { case 1: continue label; }").not.toEval();
 | |
|         expect("switch (foo) { bar }").not.toEval();
 | |
|         expect("switch (foo) { default: default: }").not.toEval();
 | |
|     });
 | |
| });
 |