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"');