tagged-templates-raw-strings.js   [plain text]


function shouldBe(actual, expected) {
    if (actual !== expected)
        throw new Error('bad value: ' + JSON.stringify(actual));
}

function tag(results) {
    return function (siteObject) {
        shouldBe(siteObject.raw.length, results.length);
        for (var i = 0; i < siteObject.raw.length; ++i) {
            shouldBe(siteObject.raw[i], results[i]);
        }
    };
}

tag([''])``;
tag(['hello'])`hello`;
tag(['hello', 'world'])`hello${0}world`;
tag(['hello\\u2028', 'world'])`hello\u2028${0}world`;
tag(['hello\\u2028\\u2029', 'world'])`hello\u2028\u2029${0}world`;
tag(['hello\\n\\r', 'world'])`hello\n\r${0}world`;

function testEval(content, results) {
    var split = 0;
    var g = tag(results);
    eval("g`" + content + "`");
}

for (var ch of [ '\'', '"', '\\', 'b', 'f', 'n', 'r', 't', 'v' ])
    testEval("\\" + ch, ["\\" + ch]);

var evaluated = [];
for (var i = 0; i < 0x10000; ++i) {
    var code = i.toString(16);
    var input = "\\u" + '0'.repeat(4 - code.length) + code;
    evaluated.push(input);
}
testEval(evaluated.join('${split}'), evaluated)

testEval("Hello\rWorld", [ "Hello\nWorld" ]);
testEval("Hello\nWorld", [ "Hello\nWorld" ]);

testEval("Hello\r\rWorld", [ "Hello\n\nWorld" ]);
testEval("Hello\r\nWorld", [ "Hello\nWorld" ]);
testEval("Hello\n\nWorld", [ "Hello\n\nWorld" ]);
testEval("Hello\n\rWorld", [ "Hello\n\nWorld" ]);

testEval("Hello\n\r\nWorld", [ "Hello\n\nWorld" ]);
testEval("Hello\r\n\rWorld", [ "Hello\n\nWorld" ]);
testEval("Hello\n\n\nWorld", [ "Hello\n\n\nWorld" ]);

testEval("Hello\n\r\n\rWorld", [ "Hello\n\n\nWorld" ]);
testEval("Hello\n\r\n\nWorld", [ "Hello\n\n\nWorld" ]);
testEval("Hello\r\n\n\nWorld", [ "Hello\n\n\nWorld" ]);

testEval("Hello\\\n\r\rWorld", [ "Hello\\\n\n\nWorld" ]);
testEval("Hello\\\r\n\n\nWorld", [ "Hello\\\r\n\n\nWorld" ]);
testEval("Hello\\\n\r\n\nWorld", [ "Hello\\\n\n\nWorld" ]);
testEval("Hello\\\n\r\r\nWorld", [ "Hello\\\n\n\nWorld" ]);

testEval("\u2028", [ "\u2028" ]);
testEval("\u2029", [ "\u2029" ]);
testEval("\\u2028", [ "\\u2028" ]);
testEval("\\u2029", [ "\\u2029" ]);