tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

templLit.js (3116B)


      1 // This Source Code Form is subject to the terms of the Mozilla Public
      2 // License, v. 2.0. If a copy of the MPL was not distributed with this
      3 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 
      5 // This test case is weird in the sense the actual work happens at the eval
      6 // at the end. If template strings are not enabled, the test cases would throw
      7 // a syntax error and we'd have failure reported. To avoid that, the entire
      8 // test case is commented out and is part of a function. We use toString to
      9 // get the string version, obtain the actual lines to run, and then use eval to
     10 // do the actual evaluation.
     11 
     12 function syntaxError (script) {
     13    try {
     14        Function(script);
     15    } catch (e) {
     16        if (e.name === "SyntaxError") {
     17            return;
     18        }
     19    }
     20    throw new Error('Expected syntax error: ' + script);
     21 }
     22 
     23 // TEST BEGIN
     24 
     25 
     26 
     27 // combinations of substitutions
     28 assertEq("abcdef", `ab${"cd"}ef`);
     29 assertEq("ab9ef", `ab${4+5}ef`);
     30 assertEq("cdef", `${"cd"}ef`);
     31 assertEq("abcd", `ab${"cd"}`);
     32 assertEq("cd", `${"cd"}`);
     33 assertEq("", `${""}`);
     34 assertEq("4", `${4}`);
     35 
     36 // multiple substitutions
     37 assertEq("abcdef", `ab${"cd"}e${"f"}`);
     38 assertEq("abcdef", `ab${"cd"}${"e"}f`);
     39 assertEq("abcdef", `a${"b"}${"cd"}e${"f"}`);
     40 assertEq("abcdef", `${"ab"}${"cd"}${"ef"}`);
     41 
     42 // inception
     43 assertEq("abcdef", `a${`b${"cd"}e${"f"}`}`);
     44 
     45 syntaxError("`${}`");
     46 syntaxError("`${`");
     47 syntaxError("`${\\n}`");
     48 syntaxError("`${yield 0}`");
     49 
     50 // Extra whitespace inside a template substitution is ignored.
     51 assertEq(`${
     52 0
     53 }`, "0");
     54 
     55 assertEq(`${ // Comments work in template substitutions.
     56 // Even comments that look like code:
     57 // 0}`, "FAIL");   /* NOTE: This whole line is a comment.
     58 0}`, "0");
     59 
     60 // Template substitutions are expressions, not statements.
     61 syntaxError("`${0;}`");
     62 assertEq(`${{}}`, "[object Object]");
     63 assertEq(`${
     64    function f() {
     65        return "ok";
     66    }()
     67 }`, "ok");
     68 
     69 // Template substitutions can have side effects.
     70 var x = 0;
     71 assertEq(`= ${x += 1}`, "= 1");
     72 assertEq(x, 1);
     73 
     74 // The production for a template substitution is Expression, not
     75 // AssignmentExpression.
     76 x = 0;
     77 assertEq(`${++x, "o"}k`, "ok");
     78 assertEq(x, 1);
     79 
     80 // --> is not a comment inside a template.
     81 assertEq(`
     82 --> this is text
     83 `, "\n--> this is text\n");
     84 
     85 // reentrancy
     86 function f(n) {
     87    if (n === 0)
     88        return "";
     89    return `${n}${f(n - 1)}`;
     90 }
     91 assertEq(f(9), "987654321");
     92 
     93 // Template string substitutions in generator functions can yield.
     94 function* g() {
     95    return `${yield 1} ${yield 2}`;
     96 }
     97 
     98 var it = g();
     99 var next = it.next();
    100 assertEq(next.done, false);
    101 assertEq(next.value, 1);
    102 next = it.next("hello");
    103 assertEq(next.done, false);
    104 assertEq(next.value, 2);
    105 next = it.next("world");
    106 assertEq(next.done, true);
    107 assertEq(next.value, "hello world");
    108 
    109 // undefined
    110 assertEq(`${void 0}`, "undefined");
    111 assertEq(`${Object.doesNotHaveThisProperty}`, "undefined");
    112 
    113 // toString behavior
    114 assertEq("<toString>", `${{valueOf: () => "<valueOf>", toString: () => "<toString>"}}`);
    115 assertEq("Hi 42", Function("try {`${{toString: () => { throw 42;}}}`} catch(e) {return \"Hi \" + e;}")());
    116 
    117 
    118 reportCompare(0, 0, "ok");