// Case 1: Throw and print stack:
testId++;
    try { throw new Error(); } catch (e) { printStack(e.stack); }

// Case 2: Same program as Case 1 but indented.
testId++;
        try { throw new Error(); } catch (e) { printStack(e.stack); }

// Case 3: Same program indented on the same line.
testId++;
try { throw new Error(); } catch (e) { printStack(e.stack); }   try { throw new Error(); } catch (e) { printStack(e.stack); }

// Case 4: Stack with 2 function frames.
testId++;
try {
    function doThrow4b() { throw new Error(); }
    doThrow4b();
} catch(e) {
    printStack(e.stack);
}

// Case 5: Function wrapping a Function.
testId++;
function doThrow5b() { try { function innerFunc() { throw new Error(); } innerFunc(); } catch (e) { printStack(e.stack); }}; doThrow5b();

// Case 6: Same inner function body as Case 5.
testId++;
function doThrow6b() { try { function innerFunc() { throw new Error(); } innerFunc(); } catch (e) { printStack(e.stack); }}; doThrow6b();

// Case 7: Case 1 redone with a Function Expression.
testId++;
    try { (function () { throw new Error(); })(); } catch (e) { printStack(e.stack); }

// Case 8: Case 2 redone with a Function Expression.
testId++;
        try { (function () { throw new Error(); })(); } catch (e) { printStack(e.stack); }

// Case 9: Case 3 redone with a Function Expression.
testId++;
try { (function () { throw new Error(); })(); } catch (e) { printStack(e.stack); }   try { (function () { throw new Error(); })(); } catch (e) { printStack(e.stack); }

// Case 10: Function Expression as multiple lines.
testId++;
try {
    (function () {
        throw new Error();
     })();
} catch(e) {
    printStack(e.stack);
}

// Case 11: Case 4 redone with a Function wrapping Function Expression.
testId++;
try {
    function doThrow11b() {
        (function () { throw new Error(); })();
    }
    doThrow11b();
} catch(e) {
    printStack(e.stack);
}

// Case 12: A Function Expression wrapping a Function Expression.
testId++;
try { (function () {(function () { throw new Error(); })();})(); } catch (e) { printStack(e.stack); }

// Case 13: Same function body as Case 12.
testId++;
try { (function () {(function () { throw new Error(); })();})(); } catch (e) { printStack(e.stack); }

// Case 14: Function Expression in a Function Expression in a Function.
testId++;
try { function doThrow14b() {(function () { (function () { throw new Error(); })();})();} doThrow14b(); } catch (e) { printStack(e.stack); }

// Case 15: Throw in an Eval.
testId++;
eval("try { throw new Error(); } catch(e) { printStack(e.stack); }");

// Case 16: Multiple lines in an Eval.
testId++;
eval("\n" +
"try {\n" +
"    function doThrow15b() { throw new Error(); }\n" +
"    doThrow15b();\n" +
"} catch(e) {\n" +
"    printStack(e.stack);\n" +
"}\n" +
"");

// Case 17: Function Expression in an Eval.
testId++;
eval("try { (function () { throw new Error(); })(); } catch(e) { printStack(e.stack); }");

// Case 18: Multiple lines with a Function Expression in an Eval.
testId++;
eval("\n" +
"try {\n" +
"    (function () { throw new Error(); })();\n" +
"} catch(e) {\n" +
"    printStack(e.stack);\n" +
"}\n" +
"");

// Case 19: Binary op with type coersion on strcat.
testId++;
try {
    testObj19b = {
        toString: function() {
            var result = ("Hello " + "World") + this;
            b19 = 5;
            return result;
        },
        run: function() {
            return testObj19b.toString();
        }
    };
    testObj19b.run();
} catch(e) {
    printStack(e.stack);
}

// Case 20: BinaryOp with type coersion on comparison.
testId++;
try {
    function test20b() {
        var f = function g() {
            if (this != 10) f();
        };
        var a = f();
    }

    test20b();
} catch(e) {
    printStack(e.stack);
}

// Case 21: Regression test from https://bugs.webkit.org/show_bug.cgi?id=118662
testId++;
try {
    eval(
        "function toFuzz21() {\n" +
        "    if (PriorityQueue.prototype.doSort() instanceof (this ^= function () {})) return 2;\n" +
        "}\n" +
        "toFuzz21();"
    );
} catch(e) {
    printStack(e.stack);
}

// Case 22: Regression test from https://bugs.webkit.org/show_bug.cgi?id=118664
testId++;
try {
    function toFuzz22b() {
        var conf = new ConfigObject({})
        for (conf in str1.localeCompare) {
        }
    }
    toFuzz22b();
} catch(e) {
    printStack(e.stack);
}

successfullyParsed = true;
