chromium/third_party/blink/web_tests/fast/js/script-tests/switch-behaviour.js

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