| description('This test covers the correctness and behaviour of switch statements.'); |
| |
| // To make sure that there are no jump table indexing problems each of these functions |
| // has multiple no-op switch statements to force not trivial jump table offsets for the |
| // primary switch being tested. |
| function characterSwitch(scrutinee) { |
| switch(null){ |
| case '_': |
| } |
| switch(scrutinee) { |
| case '\0': |
| return '\0'; |
| case 'A': |
| return 'A'; |
| case 'a': |
| return 'a'; |
| case 'A': |
| return 'Should not hit second \'A\''; |
| case '1': |
| return '1'; |
| default: |
| return 'default'; |
| case 'B': |
| return 'B'; |
| switch(null){ |
| case '1': |
| } |
| } |
| switch(null){ |
| case '_': |
| } |
| return 'Did not reach default clause'; |
| } |
| |
| function sparseCharacterSwitch(scrutinee) { |
| switch(null){ |
| case '1': |
| } |
| switch(null){ |
| case '12': |
| } |
| switch(scrutinee) { |
| case '\0': |
| return '\0'; |
| case 'A': |
| return 'A'; |
| case 'a': |
| return 'a'; |
| case 'A': |
| return 'Should not hit second \'A\''; |
| case '1': |
| return '1'; |
| default: |
| return 'default'; |
| case 'B': |
| return 'B'; |
| case '\uffff': |
| return '\uffff'; |
| switch(null){ |
| case '1': |
| } |
| switch(null){ |
| case '12': |
| } |
| } |
| return 'Did not reach default clause'; |
| switch(null){ |
| case '1': |
| } |
| switch(null){ |
| case '12': |
| } |
| } |
| |
| function stringSwitch(scrutinee) { |
| switch(null){ |
| case '12': |
| } |
| switch(scrutinee) { |
| case '\0': |
| return '\0'; |
| case 'A': |
| return 'A'; |
| case 'a': |
| return 'a'; |
| case 'A': |
| return 'Should not hit second \'A\''; |
| case '1': |
| return '1'; |
| case '-1': |
| return '-1'; |
| case '[object Object]': |
| return '[object Object]'; |
| case 'some string': |
| return 'some string'; |
| default: |
| return 'default'; |
| case 'B': |
| return 'B'; |
| case '\uffff': |
| return '\uffff' |
| switch(null){ |
| case '12': |
| } |
| } |
| return 'Did not reach default clause'; |
| switch(null){ |
| case '12': |
| } |
| } |
| |
| function numberSwitch(scrutinee) { |
| switch(null){ |
| case 1: |
| } |
| switch(scrutinee) { |
| case 0: |
| return 0; |
| case 1: |
| return 1; |
| case 1: |
| return 'Should not hit second 1'; |
| default: |
| return 'default'; |
| case -1: |
| return -1; |
| switch(null){ |
| case 1: |
| } |
| } |
| return 'Did not reach default clause'; |
| switch(null){ |
| case 1: |
| } |
| } |
| |
| function sparseNumberSwitch(scrutinee) { |
| switch(null){ |
| case 1: |
| } |
| switch(scrutinee) { |
| case 0: |
| return 0; |
| case 1: |
| return 1; |
| case 1: |
| return 'Should not hit second 1'; |
| default: |
| return 'default'; |
| case -1: |
| return -1; |
| case -1000000000: |
| return -1000000000; |
| case 1000000000: |
| return 1000000000; |
| switch(null){ |
| case 1: |
| } |
| } |
| return 'Did not reach default clause'; |
| switch(null){ |
| case 1: |
| } |
| } |
| |
| function generalSwitch(scrutinee) { |
| switch(null){ |
| case 1: |
| } |
| switch(null){ |
| case '1': |
| } |
| switch(null){ |
| case '12': |
| } |
| switch(scrutinee) { |
| case 0: |
| return 0; |
| case 1: |
| return 1; |
| case 1: |
| return 'Should not hit second 1'; |
| default: |
| return 'default'; |
| case -1: |
| return -1; |
| case -1000000000: |
| return -1000000000; |
| case 1000000000: |
| return 1000000000; |
| case '\0': |
| return '\0'; |
| case 'A': |
| return 'A'; |
| case 'a': |
| return 'a'; |
| case 'A': |
| return 'Should not hit second \'A\''; |
| case '1': |
| return '1'; |
| case '-1': |
| return '-1'; |
| case '[object Object]': |
| return '[object Object]'; |
| case 'some string': |
| return 'some string'; |
| case 'B': |
| return 'B'; |
| case '\uffff': |
| return '\uffff' |
| switch(null){ |
| case 1: |
| } |
| switch(null){ |
| case '1': |
| } |
| switch(null){ |
| case '12': |
| } |
| } |
| return 'Did not reach default clause'; |
| switch(null){ |
| case 1: |
| } |
| switch(null){ |
| case '1': |
| } |
| switch(null){ |
| case '12': |
| } |
| } |
| |
| // Character switch |
| var emptyString1 = ""; |
| var emptyString2 = ""; |
| shouldBe("characterSwitch('A' + emptyString1)", '"A"'); |
| shouldBe("characterSwitch('A' + emptyString1 + emptyString2)", '"A"'); |
| shouldBe("characterSwitch(emptyString1 + emptyString2)", '"default"'); |
| |
| shouldBe("characterSwitch('\0')", '"\0"'); |
| shouldBe("characterSwitch('A')", '"A"'); |
| shouldBe("characterSwitch('a')", '"a"'); |
| shouldBe("characterSwitch('1')", '"1"'); |
| shouldBe("characterSwitch('-1')", '"default"'); |
| shouldBe("characterSwitch('B')", '"B"'); |
| shouldBe("characterSwitch('\uffff')", '"default"'); |
| shouldBe("characterSwitch({toString: function(){return 'B'}})", '"default"'); |
| shouldBe("characterSwitch(0)", '"default"'); |
| shouldBe("characterSwitch(-0)", '"default"'); |
| shouldBe("characterSwitch(1)", '"default"'); |
| shouldBe("characterSwitch(1.1)", '"default"'); |
| shouldBe("characterSwitch(-1)", '"default"'); |
| shouldBe("characterSwitch(-1000000000)", '"default"'); |
| shouldBe("characterSwitch(1000000000)", '"default"'); |
| shouldBe("characterSwitch({})", '"default"'); |
| |
| // Sparse character switch |
| shouldBe("sparseCharacterSwitch('\0')", '"\0"'); |
| shouldBe("sparseCharacterSwitch('A')", '"A"'); |
| shouldBe("sparseCharacterSwitch('a')", '"a"'); |
| shouldBe("sparseCharacterSwitch('1')", '"1"'); |
| shouldBe("sparseCharacterSwitch('-1')", '"default"'); |
| shouldBe("sparseCharacterSwitch('B')", '"B"'); |
| shouldBe("sparseCharacterSwitch('\uffff')", '"\uffff"'); |
| shouldBe("sparseCharacterSwitch({toString: function(){return 'B'}})", '"default"'); |
| shouldBe("sparseCharacterSwitch(0)", '"default"'); |
| shouldBe("sparseCharacterSwitch(-0)", '"default"'); |
| shouldBe("sparseCharacterSwitch(1)", '"default"'); |
| shouldBe("sparseCharacterSwitch(1.1)", '"default"'); |
| shouldBe("sparseCharacterSwitch(-1)", '"default"'); |
| shouldBe("sparseCharacterSwitch(-1000000000)", '"default"'); |
| shouldBe("sparseCharacterSwitch(1000000000)", '"default"'); |
| shouldBe("sparseCharacterSwitch({})", '"default"'); |
| |
| // String switch |
| shouldBe("stringSwitch('\0')", '"\0"'); |
| shouldBe("stringSwitch('A')", '"A"'); |
| shouldBe("stringSwitch('a')", '"a"'); |
| shouldBe("stringSwitch('1')", '"1"'); |
| shouldBe("stringSwitch('-1')", '"-1"'); |
| shouldBe("stringSwitch('B')", '"B"'); |
| shouldBe("stringSwitch('\uffff')", '"\uffff"'); |
| shouldBe("stringSwitch('some string')", '"some string"'); |
| shouldBe("stringSwitch({toString: function(){return 'some string'}})", '"default"'); |
| shouldBe("stringSwitch('s')", '"default"'); |
| shouldBe("stringSwitch(0)", '"default"'); |
| shouldBe("stringSwitch(-0)", '"default"'); |
| shouldBe("stringSwitch(1)", '"default"'); |
| shouldBe("stringSwitch(1.1)", '"default"'); |
| shouldBe("stringSwitch(-1)", '"default"'); |
| shouldBe("stringSwitch(-1000000000)", '"default"'); |
| shouldBe("stringSwitch(1000000000)", '"default"'); |
| shouldBe("stringSwitch({})", '"default"'); |
| |
| // Number switch |
| shouldBe("numberSwitch('\0')", '"default"'); |
| shouldBe("numberSwitch('A')", '"default"'); |
| shouldBe("numberSwitch('a')", '"default"'); |
| shouldBe("numberSwitch('1')", '"default"'); |
| shouldBe("numberSwitch('-1')", '"default"'); |
| shouldBe("numberSwitch('B')", '"default"'); |
| shouldBe("numberSwitch('\uffff')", '"default"'); |
| shouldBe("numberSwitch('some string')", '"default"'); |
| shouldBe("numberSwitch({valueOf: function(){return 0}})", '"default"'); |
| shouldBe("numberSwitch('s')", '"default"'); |
| shouldBe("numberSwitch(0)", '0'); |
| shouldBe("numberSwitch(-0)", '0'); |
| shouldBe("numberSwitch(1)", '1'); |
| shouldBe("numberSwitch(1.1)", '"default"'); |
| shouldBe("numberSwitch(-1)", '-1'); |
| shouldBe("numberSwitch(-1000000000)", '"default"'); |
| shouldBe("numberSwitch(1000000000)", '"default"'); |
| shouldBe("numberSwitch({})", '"default"'); |
| |
| // Sparse number switch |
| shouldBe("sparseNumberSwitch('\0')", '"default"'); |
| shouldBe("sparseNumberSwitch('A')", '"default"'); |
| shouldBe("sparseNumberSwitch('a')", '"default"'); |
| shouldBe("sparseNumberSwitch('1')", '"default"'); |
| shouldBe("sparseNumberSwitch('-1')", '"default"'); |
| shouldBe("sparseNumberSwitch('B')", '"default"'); |
| shouldBe("sparseNumberSwitch('\uffff')", '"default"'); |
| shouldBe("sparseNumberSwitch('some string')", '"default"'); |
| shouldBe("sparseNumberSwitch({valueOf: function(){return 0}})", '"default"'); |
| shouldBe("sparseNumberSwitch('s')", '"default"'); |
| shouldBe("sparseNumberSwitch(0)", '0'); |
| shouldBe("sparseNumberSwitch(-0)", '0'); |
| shouldBe("sparseNumberSwitch(1)", '1'); |
| shouldBe("sparseNumberSwitch(1.1)", '"default"'); |
| shouldBe("sparseNumberSwitch(-1)", '-1'); |
| shouldBe("sparseNumberSwitch(-1000000000)", '-1000000000'); |
| shouldBe("sparseNumberSwitch(1000000000)", '1000000000'); |
| shouldBe("sparseNumberSwitch({})", '"default"'); |
| |
| // General switch |
| shouldBe("generalSwitch('\0')", '"\0"'); |
| shouldBe("generalSwitch('A')", '"A"'); |
| shouldBe("generalSwitch('a')", '"a"'); |
| shouldBe("generalSwitch('1')", '"1"'); |
| shouldBe("generalSwitch('-1')", '"-1"'); |
| shouldBe("generalSwitch('B')", '"B"'); |
| shouldBe("generalSwitch('\uffff')", '"\uffff"'); |
| shouldBe("generalSwitch('some string')", '"some string"'); |
| shouldBe("generalSwitch({valueOf: function(){return 0}})", '"default"'); |
| shouldBe("generalSwitch('s')", '"default"'); |
| shouldBe("generalSwitch(0)", '0'); |
| shouldBe("generalSwitch(-0)", '0'); |
| shouldBe("generalSwitch(1)", '1'); |
| shouldBe("generalSwitch(1.1)", '"default"'); |
| shouldBe("generalSwitch(-1)", '-1'); |
| shouldBe("generalSwitch(-1000000000)", '-1000000000'); |
| shouldBe("generalSwitch(1000000000)", '1000000000'); |
| shouldBe("generalSwitch({})", '"default"'); |