tor-browser

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

trailing_comma_parameters.js (3027B)


      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 // Trailing comma in functions and generators.
      6 
      7 // 14.1 Function Definitions
      8 // FunctionDeclaration[Yield, Default]:
      9 //   function BindingIdentifier[?Yield] ( FormalParameters[~Yield] ) { FunctionBody[~Yield] }
     10 
     11 // 14.4 Generator Function Definitions
     12 // GeneratorDeclaration[Yield, Default]:
     13 //   function * BindingIdentifier[?Yield] ( FormalParameters[+Yield] ) { GeneratorBody }
     14 
     15 
     16 function functionDeclaration(argList, parameters = "", returnExpr = "") {
     17    return eval(`
     18        function f(${argList}) {
     19            var fun = f;
     20            return ${returnExpr};
     21        }
     22        f(${parameters});
     23    `);
     24 }
     25 
     26 function generatorDeclaration(argList, parameters = "", returnExpr = "") {
     27    return eval(`
     28        function* f(${argList}) {
     29            var fun = f;
     30            return ${returnExpr};
     31        }
     32        f(${parameters}).next().value;
     33    `);
     34 }
     35 
     36 const tests = [
     37    functionDeclaration,
     38    generatorDeclaration,
     39 ];
     40 
     41 // Ensure parameters are passed correctly.
     42 for (let test of tests) {
     43    assertEq(test("a, ", "10", "a"), 10);
     44    assertEq(test("a, b, ", "10, 20", "a + b"), 30);
     45    assertEq(test("a = 30, ", "", "a"), 30);
     46    assertEq(test("a = 30, b = 40, ", "", "a + b"), 70);
     47 
     48    assertEq(test("[a], ", "[10]", "a"), 10);
     49    assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30);
     50    assertEq(test("[a] = [30], ", "", "a"), 30);
     51    assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70);
     52 
     53    assertEq(test("{a}, ", "{a: 10}", "a"), 10);
     54    assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30);
     55    assertEq(test("{a} = {a: 30}, ", "", "a"), 30);
     56    assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70);
     57 }
     58 
     59 // Ensure function length doesn't change.
     60 for (let test of tests) {
     61    assertEq(test("a, ", "", "fun.length"), 1);
     62    assertEq(test("a, b, ", "", "fun.length"), 2);
     63 
     64    assertEq(test("[a], ", "[]", "fun.length"), 1);
     65    assertEq(test("[a], [b], ", "[], []", "fun.length"), 2);
     66 
     67    assertEq(test("{a}, ", "{}", "fun.length"), 1);
     68    assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2);
     69 }
     70 
     71 for (let test of tests) {
     72    // Trailing comma in empty parameters list.
     73    assertThrowsInstanceOf(() => test(","), SyntaxError);
     74 
     75    // Leading comma.
     76    assertThrowsInstanceOf(() => test(", a"), SyntaxError);
     77    assertThrowsInstanceOf(() => test(", ...a"), SyntaxError);
     78 
     79    // Multiple trailing comma.
     80    assertThrowsInstanceOf(() => test("a, , "), SyntaxError);
     81    assertThrowsInstanceOf(() => test("a..., , "), SyntaxError);
     82 
     83    // Trailing comma after rest parameter.
     84    assertThrowsInstanceOf(() => test("...a, "), SyntaxError);
     85    assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError);
     86 
     87    // Elision.
     88    assertThrowsInstanceOf(() => test("a, , b"), SyntaxError);
     89 }
     90 
     91 if (typeof reportCompare === "function")
     92    reportCompare(0, 0);