12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- /*
- These tests deliberately produce syntax errors to check what line the parser thinks we're on.
- Note that line numbers are higher than you might expect as the parsed code is:
- function anonymous(
- ) {
- <code>
- }
- ⚠ PLEASE MAKE SURE TO NOT LET YOUR EDITOR REMOVE THE LS/PS LINE TERMINATORS!
- */
- test("LINE FEED is a line terminator", () => {
- expect(() => {
- Function("\n\n@");
- }).toThrowWithMessage(SyntaxError, "line: 5, column: 1");
- });
- test("CARRIAGE RETURN is a line terminator", () => {
- expect(() => {
- Function("\r\r@");
- }).toThrowWithMessage(SyntaxError, "line: 5, column: 1");
- });
- test("LINE SEPARATOR is a line terminator", () => {
- expect(() => {
- Function("
@");
- }).toThrowWithMessage(SyntaxError, "line: 5, column: 1");
- });
- test("PARAGRAPH SEPARATOR is a line terminator", () => {
- expect(() => {
- Function("
@");
- }).toThrowWithMessage(SyntaxError, "line: 5, column: 1");
- });
- test("CR LF is counted as only one line terminator", () => {
- expect(() => {
- Function("\r\n\r\n@");
- }).toThrowWithMessage(SyntaxError, "line: 5, column: 1");
- });
- test("LF/CR are not allowed in string literal", () => {
- expect(() => {
- Function(`"
- "`);
- }).toThrowWithMessage(SyntaxError, "Unexpected token UnterminatedStringLiteral");
- });
- test("LS/PS are allowed in string literal", () => {
- expect(`"
"`).toEval();
- expect(`"
"`).toEval();
- });
- test("line terminators can be mixed (but please don't)", () => {
- expect(() => {
- Function("\r
\r\n
\n\r@");
- }).toThrowWithMessage(SyntaxError, "line: 9, column: 1");
- });
- test("all line terminators are valid for line continuations", () => {
- expect(Function('return "a\\\nb"')()).toBe("ab");
- expect(Function('return "a\\\rb"')()).toBe("ab");
- expect(Function('return "a\\\r\nb"')()).toBe("ab");
- expect(Function('return "a\\
b"')()).toBe("ab");
- expect(Function('return "a\\
b"')()).toBe("ab");
- });
- test("template-literals raw and real value", () => {
- let lastTemplate;
- let lastRaw;
- function tag(cs) {
- lastTemplate = cs[0];
- lastRaw = cs.raw[0];
- }
- function checkTemplate(string_value, expected_template, expected_raw) {
- eval("tag`" + string_value + "`");
- expect(lastTemplate).toBe(expected_template);
- expect(lastRaw).toBe(expected_raw);
- }
- checkTemplate("", "", "");
- checkTemplate("\n", "\n", "\n");
- checkTemplate("\r", "\n", "\n");
- checkTemplate("\r\n", "\n", "\n");
- checkTemplate("\n\r\n", "\n\n", "\n\n");
- checkTemplate("a\\\nb", "ab", "a\\\nb");
- checkTemplate("a\\\rb", "ab", "a\\\nb");
- checkTemplate("a\\
b", "ab", "a\\
b");
- checkTemplate("a\\
b", "ab", "a\\
b");
- });
|