template-literal-line-terminators.js   [plain text]



function test(actual, expected) {
    if (actual !== expected)
        throw new Error("bad value: " + actual);
}

function testEval(script, expected) {
    test(eval(script), expected);
}

function testEvalLineNumber(script, expected, lineNum) {
    testEval(script, expected);

    var error = null;
    var actualLine;
    try {
        eval(script + ';throw new Error("line");');
    } catch (error) {
        actualLine = error.line;
    }
    test(actualLine, lineNum);
}

test(`Hello`, "Hello");
test(`Hello World`, "Hello World");
test(`
`, "\n");
test(`Hello
World`, "Hello\nWorld");

testEvalLineNumber("`Hello World`", "Hello World", 1);

testEvalLineNumber("`Hello\rWorld`", "Hello\nWorld", 2);
testEvalLineNumber("`Hello\nWorld`", "Hello\nWorld", 2);

testEvalLineNumber("`Hello\r\rWorld`", "Hello\n\nWorld", 3);
testEvalLineNumber("`Hello\r\nWorld`", "Hello\nWorld", 2);
testEvalLineNumber("`Hello\n\nWorld`", "Hello\n\nWorld", 3);
testEvalLineNumber("`Hello\n\rWorld`", "Hello\n\nWorld", 2);

testEvalLineNumber("`Hello\n\r\nWorld`", "Hello\n\nWorld", 3);
testEvalLineNumber("`Hello\r\n\rWorld`", "Hello\n\nWorld", 3);
testEvalLineNumber("`Hello\n\n\nWorld`", "Hello\n\n\nWorld", 4);

testEvalLineNumber("`Hello\n\r\n\rWorld`", "Hello\n\n\nWorld", 3);
testEvalLineNumber("`Hello\n\r\n\nWorld`", "Hello\n\n\nWorld", 4);
testEvalLineNumber("`Hello\r\n\n\nWorld`", "Hello\n\n\nWorld", 4);

testEvalLineNumber("`Hello\\\n\r\rWorld`", "Hello\n\nWorld", 3);
testEvalLineNumber("`Hello\\\r\n\n\nWorld`", "Hello\n\nWorld", 4);
testEvalLineNumber("`Hello\\\n\r\n\nWorld`", "Hello\n\nWorld", 4);
testEvalLineNumber("`Hello\\\n\r\r\nWorld`", "Hello\n\nWorld", 3);

testEvalLineNumber("`\u2028`", "\u2028", 2);
testEvalLineNumber("`\u2029`", "\u2029", 2);
testEvalLineNumber("`\\u2028`", "\u2028", 1);
testEvalLineNumber("`\\u2029`", "\u2029", 1);