V8 Coverage Report
Files covered Lines
. / test.mjs
100.00 %
941 / 941
    1.      1/*jslint beta, node*/
    2.      1import moduleFs from "fs";
    3.      1import jslint from "./jslint.mjs";
    4.      1
    5.      1let {
    6.      1    assertErrorThrownAsync,
    7.      1    assertJsonEqual,
    8.      1    assertOrThrow,
    9.      1    debugInline,
   10.      1    fsRmRecursive,
   11.      1    fsWriteFileWithParents,
   12.      1    jstestDescribe,
   13.      1    jstestIt,
   14.      1    jstestOnExit,
   15.      1    noop,
   16.      1    v8CoverageListMerge,
   17.      1    v8CoverageReportCreate
   18.      1} = jslint;
   19.      1
   20.      4function processExit0(exitCode) {
   21.      4    assertOrThrow(exitCode === 0, exitCode);
   22.      4}
   23.      6function processExit1(exitCode) {
   24.      6    assertOrThrow(exitCode === 1, exitCode);
   25.      6}
   26.      1
   27.      1(function testCaseFsXxx() {
   28.      1/*
   29.      1 * this function will test fsXxx's handling-behavior
   30.      1 */
   31.      1    // test fsRmRecursive handling-behavior
   32.      1    fsRmRecursive(".artifact/fsRmRecursive");
   33.      1    fsRmRecursive(".artifact/fsRmRecursive", {
   34.      1        process_version: "v12"
   35.      1    });
   36.      1    // test fsWriteFileWithParents handling-behavior
   37.      1    (async function () {
   38.      1        await fsRmRecursive(".tmp/fsWriteFileWithParents");
   39.      1        await fsWriteFileWithParents(
   40.      1            ".tmp/fsWriteFileWithParents/aa/bb/cc",
   41.      1            "aa"
   42.      1        );
   43.      1    }());
   44.      1}());
   45.      1
   46.      1(async function testCaseJslintCli() {
   47.      1/*
   48.      1 * this function will test jslint's cli handling-behavior
   49.      1 */
   50.      1    let packageJson = JSON.parse(
   51.      1        await moduleFs.promises.readFile("package.json")
   52.      1    );
   53.      1    // test null-case handling-behavior
   54.      1    jslint.jslint_cli({
   55.      1        mode_noop: true,
   56.      1        process_exit: processExit0
   57.      1    });
   58.      1    [
   59.      1        ".",            // test dir handling-behavior
   60.      1        "jslint.mjs",   // test file handling-behavior
   61.      1        undefined       // test file-undefined handling-behavior
   62.      3    ].forEach(function (file) {
   63.      3        jslint.jslint_cli({
   64.      3            console_error: noop,        // suppress error
   65.      3            file,
   66.      3            mode_cli: true,
   67.      3            processEnv: {
   68.      3                JSLINT_BETA: "1"
   69.      3            },
   70.      3            process_exit: processExit0
   71.      3        });
   72.      3    });
   73.      1    // test apidoc handling-behavior
   74.      1    jslint.jslint_cli({
   75.      1        mode_cli: true,
   76.      1        processArgv: [
   77.      1            "node",
   78.      1            "jslint.mjs",
   79.      1            "jslint_apidoc=.artifact/apidoc.html",
   80.      1            JSON.stringify({
   81.      1                example_list: [
   82.      1                    "README.md",
   83.      1                    "test.mjs",
   84.      1                    "jslint.mjs"
   85.      1                ],
   86.      1                github_repo: "https://github.com/kaizhu256/v8-coverage-repo",
   87.      1                module_list: [
   88.      1                    {
   89.      1                        pathname: "./v8_coverage_report.mjs"
   90.      1                    }
   91.      1                ],
   92.      1                package_name: "v8-coverage-report",
   93.      1                version: "v" + packageJson.version
   94.      1            })
   95.      1        ],
   96.      1        process_exit: processExit0
   97.      1    });
   98.      1    // test cjs handling-behavior
   99.      1    jslint.jslint_cli({
  100.      1        cjs_module: {
  101.      1            exports: {}
  102.      1        },
  103.      1        cjs_require: {},
  104.      1        process_exit: processExit0
  105.      1    });
  106.      1    // test file-error handling-behavior
  107.      1    jslint.jslint_cli({
  108.      1        // suppress error
  109.      1        console_error: noop,
  110.      1        file: "undefined",
  111.      1        mode_cli: true,
  112.      1        process_exit: processExit1
  113.      1    });
  114.      1    // test syntax-error handling-behavior
  115.      1    jslint.jslint_cli({
  116.      1        // suppress error
  117.      1        console_error: noop,
  118.      1        file: "syntax-error.js",
  119.      1        mode_cli: true,
  120.      1        option: {
  121.      1            trace: true
  122.      1        },
  123.      1        process_exit: processExit1,
  124.      1        source: "syntax error"
  125.      1    });
  126.      1    // test report handling-behavior
  127.      1    jslint.jslint_cli({
  128.      1        // suppress error
  129.      1        console_error: noop,
  130.      1        mode_cli: true,
  131.      1        processArgv: [
  132.      1            "node",
  133.      1            "jslint.mjs",
  134.      1            "jslint_report=.tmp/jslint_report.html",
  135.      1            "jslint.mjs"
  136.      1        ],
  137.      1        process_exit: processExit0
  138.      1    });
  139.      1    // test report-error handling-behavior
  140.      1    jslint.jslint_cli({
  141.      1        // suppress error
  142.      1        console_error: noop,
  143.      1        mode_cli: true,
  144.      1        processArgv: [
  145.      1            "node",
  146.      1            "jslint.mjs",
  147.      1            "jslint_report=.tmp/jslint_report.html",
  148.      1            "syntax-error.js"
  149.      1        ],
  150.      1        process_exit: processExit1,
  151.      1        source: "syntax error"
  152.      1    });
  153.      1    // test report-json handling-behavior
  154.      1    jslint.jslint_cli({
  155.      1        // suppress error
  156.      1        console_error: noop,
  157.      1        mode_cli: true,
  158.      1        processArgv: [
  159.      1            "node",
  160.      1            "jslint.mjs",
  161.      1            "jslint_report=.tmp/jslint_report.html",
  162.      1            "aa.json"
  163.      1        ],
  164.      1        process_exit: processExit0,
  165.      1        source: "[]"
  166.      1    });
  167.      1    // test report-misc handling-behavior
  168.      1    jslint.jslint_cli({
  169.      1        // suppress error
  170.      1        console_error: noop,
  171.      1        mode_cli: true,
  172.      1        processArgv: [
  173.      1            "node",
  174.      1            "jslint.mjs",
  175.      1            "jslint_report=.tmp/jslint_report.html",
  176.      1            "aa.js"
  177.      1        ],
  178.      1        process_exit: processExit1,
  179.      1        source: "(aa)=>aa; function aa([aa]){}"
  180.      1    });
  181.      1    // test report-json-error handling-behavior
  182.      1    jslint.jslint_cli({
  183.      1        // suppress error
  184.      1        console_error: noop,
  185.      1        mode_cli: true,
  186.      1        processArgv: [
  187.      1            "node",
  188.      1            "jslint.mjs",
  189.      1            "jslint_report=.tmp/jslint_report.html",
  190.      1            "aa.json"
  191.      1        ],
  192.      1        process_exit: processExit1,
  193.      1        source: "["
  194.      1    });
  195.      1    // test plugin-vim handling-behavior
  196.      1    jslint.jslint_cli({
  197.      1        // suppress error
  198.      1        console_error: noop,
  199.      1        mode_cli: true,
  200.      1        processArgv: [
  201.      1            "node",
  202.      1            "jslint.mjs",
  203.      1            "jslint_plugin_vim",
  204.      1            "syntax-error.js"
  205.      1        ],
  206.      1        process_exit: processExit1,
  207.      1        source: "syntax error"
  208.      1    });
  209.      1}());
  210.      1
  211.      1(function testCaseJslintCodeValidate() {
  212.      1/*
  213.      1 * this function will validate each code is valid in jslint
  214.      1 */
  215.      1    Object.values({
  216.      1        array: [
  217.      1            "new Array(0);"
  218.      1        ],
  219.      1        async_await: [
  220.      1            "async function aa() {\n    await aa();\n}",
  221.      1            (
  222.      1                "async function aa() {\n"
  223.      1                + "    try {\n"
  224.      1                + "        aa();\n"
  225.      1                + "    } catch (err) {\n"
  226.      1                + "        await err();\n"
  227.      1                + "    }\n"
  228.      1                + "}\n"
  229.      1            ), (
  230.      1                "async function aa() {\n"
  231.      1                + "    try {\n"
  232.      1                + "        await aa();\n"
  233.      1                + "    } catch (err) {\n"
  234.      1                + "        await err();\n"
  235.      1                + "    }\n"
  236.      1                + "}\n"
  237.      1            )
  238.      1        ],
  239.      1
  240.      1// PR-351 - Add BigInt support.
  241.      1
  242.      1        bigint: [
  243.      1            "let aa = 0b0n;\n",
  244.      1            "let aa = 0o0n;\n",
  245.      1            "let aa = 0x0n;\n",
  246.      1            "let aa = BigInt(0n);\n",
  247.      1            "let aa = typeof aa === \"bigint\";\n"
  248.      1        ],
  249.      1        date: [
  250.      1            "Date.getTime();",
  251.      1            "let aa = aa().getTime();",
  252.      1            "let aa = aa.aa().getTime();"
  253.      1        ],
  254.      1        directive: [
  255.      1            "#!\n/*jslint browser:false, node*/\n\"use strict\";",
  256.      1            "/*property aa bb*/"
  257.      1        ],
  258.      1        fart: [
  259.      1            "function aa() {\n    return () => 0;\n}"
  260.      1        ],
  261.      1        for: [
  262.      1            (
  263.      1                "/*jslint for*/\n"
  264.      1                + "function aa(bb) {\n"
  265.      1                + "    for (bb = 0; bb < 0; bb += 1) {\n"
  266.      1                + "        bb();\n"
  267.      1                + "    }\n"
  268.      1                + "}\n"
  269.      1            )
  270.      1        ],
  271.      1        jslint_disable: [
  272.      1            "/*jslint-disable*/\n0\n/*jslint-enable*/"
  273.      1        ],
  274.      1        jslint_quiet: [
  275.      1            "0 //jslint-quiet"
  276.      1        ],
  277.      1        json: [
  278.      1            "{\"aa\":[[],-0,null]}"
  279.      1        ],
  280.      1        label: [
  281.      1            (
  282.      1                "function aa() {\n"
  283.      1                + "bb:\n"
  284.      1                + "    while (true) {\n"
  285.      1                + "        if (true) {\n"
  286.      1                + "            break bb;\n"
  287.      1                + "        }\n"
  288.      1                + "    }\n"
  289.      1                + "}\n"
  290.      1            )
  291.      1        ],
  292.      1        loop: [
  293.      1            "function aa() {\n    do {\n        aa();\n    } while (aa());\n}"
  294.      1        ],
  295.      1        module: [
  296.      1            "export default Object.freeze();",
  297.      1            "import {aa, bb} from \"aa\";\naa(bb);",
  298.      1            "import {} from \"aa\";",
  299.      1            "import(\"aa\").then(function () {\n    return;\n});",
  300.      1            "let aa = 0;\nimport(aa).then(aa).then(aa).catch(aa).finally(aa);"
  301.      1        ],
  302.      1        number: [
  303.      1            "let aa = 0.0e0;",
  304.      1            "let aa = 0b0;",
  305.      1            "let aa = 0o0;",
  306.      1            "let aa = 0x0;"
  307.      1        ],
  308.      1        optional_chaining: [
  309.      1            "let aa = aa?.bb?.cc;"
  310.      1        ],
  311.      1        param: [
  312.      1            (
  313.      1                "function aa({aa, bb}) {\n"
  314.      1                + "    return {aa, bb};\n"
  315.      1                + "}\n"
  316.      1            ), (
  317.      1                "function aa({constructor}) {\n"
  318.      1                + "    return {constructor};\n"
  319.      1                + "}\n"
  320.      1            )
  321.      1        ],
  322.      1        property: [
  323.      1            "let aa = aa[`!`];"
  324.      1        ],
  325.      1        regexp: [
  326.      1            "function aa() {\n    return /./;\n}",
  327.      1            "let aa = /(?!.)(?:.)(?=.)/;",
  328.      1            "let aa = /./gimuy;",
  329.      1            "let aa = /[\\--\\-]/;"
  330.      1        ],
  331.      1        ternary: [
  332.      1            (
  333.      1                "let aa = (\n    aa()\n    ? 0\n    : 1\n) "
  334.      1                + "&& (\n    aa()\n    ? 0\n    : 1\n);"
  335.      1            ),
  336.      1            "let aa = (\n    aa()\n    ? `${0}`\n    : `${1}`\n);"
  337.      1        ],
  338.      1        try_catch: [
  339.      1            (
  340.      1                "let aa = 0;\n"
  341.      1                + "try {\n"
  342.      1                + "    aa();\n"
  343.      1                + "} catch (err) {\n"
  344.      1                + "    aa = err;\n"
  345.      1                + "}\n"
  346.      1                + "try {\n"
  347.      1                + "    aa();\n"
  348.      1                + "} catch (err) {\n"
  349.      1                + "    aa = err;\n"
  350.      1                + "}\n"
  351.      1                + "aa();\n"
  352.      1            )
  353.      1        ],
  354.      1        use_strict: [
  355.      1            (
  356.      1                "\"use strict\";\n"
  357.      1                + "let aa = 0;\n"
  358.      1                + "function bb() {\n"
  359.      1                + "    \"use strict\";\n"
  360.      1                + "    return aa;\n"
  361.      1                + "}\n"
  362.      1            )
  363.      1        ],
  364.      1        var: [
  365.      1
  366.      1// PR-363 - Bugfix - add test against false-warning
  367.      1// <uninitialized 'bb'> in code '/*jslint node*/\nlet {aa:bb} = {}; bb();'
  368.      1
  369.      1            "/*jslint node*/\n",
  370.      1            ""
  371.      2        ].map(function (directive) {
  372.      2            return [
  373.      2                "let [\n    aa, bb = 0\n] = 0;\naa();\nbb();",
  374.      2                "let [...aa] = [...aa];\naa();",
  375.      2                "let constructor = 0;\nconstructor();",
  376.      2                "let {\n    aa: bb\n} = 0;\nbb();",
  377.      2                "let {\n    aa: bb,\n    bb: cc\n} = 0;\nbb();\ncc();",
  378.      2                "let {aa, bb} = 0;\naa();\nbb();",
  379.      2                "let {constructor} = 0;\nconstructor();"
  380.     14            ].map(function (code) {
  381.     14                return directive + code;
  382.     14            });
  383.      2        }).flat()
  384.     22    }).forEach(function (codeList) {
  385.     22        let elemPrv = "";
  386.     56        codeList.forEach(function (code) {
  387.     56            let warnings;
  388.     56            // Assert codeList is sorted.
  389.     56            assertOrThrow(elemPrv < code, JSON.stringify([
  390.     56                elemPrv, code
  391.     56            ], undefined, 4));
  392.     56            elemPrv = code;
  393.     56            warnings = jslint.jslint(code, {
  394.     56                beta: true
  395.     56            }).warnings;
  396.     56            assertOrThrow(
  397.     56                warnings.length === 0,
  398.     56                JSON.stringify([code, warnings])
  399.     56            );
  400.     56        });
  401.     22    });
  402.      1}());
  403.      1
  404.      1(async function testCaseJslintOption() {
  405.      1/*
  406.      1 * this function will test jslint's option handling-behavior
  407.      1 */
  408.      1    let elemPrv = "";
  409.      1    [
  410.      1        [
  411.      1            "let aa = aa | 0;", {bitwise: true}, []
  412.      1        ], [
  413.      1            ";\naa(new XMLHttpRequest());", {browser: true}, ["aa"]
  414.      1        ], [
  415.      1            "let aa = \"aa\" + 0;", {convert: true}, []
  416.      1        ], [
  417.      1            "registerType();", {couch: true}, []
  418.      1        ], [
  419.      1            "debugger;", {devel: true}, []
  420.      1        ], [
  421.      1            "new Function();\neval();", {eval: true}, []
  422.      1        ], [
  423.      1            (
  424.      1                "function aa(aa) {\n"
  425.      1                + "    for (aa = 0; aa < 0; aa += 1) {\n"
  426.      1                + "        aa();\n"
  427.      1                + "    }\n"
  428.      1                + "}\n"
  429.      1            ), {for: true}, []
  430.      1        ], [
  431.      1            "let aa = {get aa() {\n    return;\n}};", {getset: true}, []
  432.      1        ], [
  433.      1            "let aa = {set aa(aa) {\n    return aa;\n}};", {getset: true}, []
  434.      1        ], [
  435.      1            String(
  436.      1                await moduleFs.promises.readFile("jslint.mjs", "utf8")
  437.      1            ).replace((
  438.      1                /    /g
  439.      1            ), "  "),
  440.      1            {indent2: true},
  441.      1            []
  442.      1        ], [
  443.      1            "function aa() {\n  return;\n}", {indent2: true}, []
  444.      1        ], [
  445.      1            "/".repeat(100), {long: true}, []
  446.      1        ], [
  447.      1            "let aa = aa._;", {name: true}, []
  448.      1        ], [
  449.      1            "require();", {node: true}, []
  450.      1        ], [
  451.      1            "let aa = 'aa';", {single: true}, []
  452.      1        ], [
  453.      1            "let aa = this;", {this: true}, []
  454.      1        ], [
  455.      1            "", {trace: true}, []
  456.      1        ], [
  457.      1            (
  458.      1                "function aa({bb, aa}) {\n"
  459.      1                + "    switch (aa) {\n"
  460.      1                + "    case 1:\n"
  461.      1                + "        break;\n"
  462.      1                + "    case 0:\n"
  463.      1                + "        break;\n"
  464.      1                + "    default:\n"
  465.      1                + "        return {bb, aa};\n"
  466.      1                + "    }\n"
  467.      1                + "}\n"
  468.      1            ), {unordered: true}, []
  469.      1        ], [
  470.      1            "let {bb, aa} = 0;", {unordered: true}, []
  471.      1        ], [
  472.      1            (
  473.      1                "function aa() {\n"
  474.      1                + "    if (aa) {\n"
  475.      1                + "        let bb = 0;\n"
  476.      1                + "        return bb;\n"
  477.      1                + "    }\n"
  478.      1                + "}\n"
  479.      1            ), {variable: true}, []
  480.      1        ], [
  481.      1            "let bb = 0;\nlet aa = 0;", {variable: true}, []
  482.      1        ], [
  483.      1            "\t", {white: true}, []
  484.      1        ]
  485.     22    ].forEach(function ([
  486.     22        source, option_dict, global_list
  487.     22    ]) {
  488.     22        let elemNow = JSON.stringify([
  489.     22            option_dict, source, global_list
  490.     22        ]);
  491.     22        // Assert list is sorted.
  492.     22        assertOrThrow(elemPrv < elemNow, JSON.stringify([
  493.     22            elemPrv, elemNow
  494.     22        ], undefined, 4));
  495.     22        elemPrv = elemNow;
  496.     22        option_dict.beta = true;
  497.     22        // test jslint's option handling-behavior
  498.     22        assertOrThrow(
  499.     22            jslint.jslint(
  500.     22                source,
  501.     22                option_dict,
  502.     22                global_list
  503.     22            ).warnings.length === 0,
  504.     22            "jslint.jslint(" + JSON.stringify([
  505.     22                source, option_dict, global_list
  506.     22            ]) + ")"
  507.     22        );
  508.     22        // test jslint's directive handling-behavior
  509.     22        source = (
  510.     22            "/*jslint " + JSON.stringify(option_dict).slice(1, -1).replace((
  511.     22                /"/g
  512.     22            ), "") + "*/\n"
  513.     22            + (
  514.     22                global_list.length === 0
  515.     21                ? ""
  516.      1                : "/*global " + global_list.join(",") + "*/\n"
  517.     22            )
  518.     22            + source.replace((
  519.     22                /^#!/
  520.     22            ), "//")
  521.     22        );
  522.     22        assertOrThrow(jslint.jslint(source).warnings.length === 0, source);
  523.     22    });
  524.      1    assertOrThrow(jslint.jslint("", {
  525.      1        test_internal_error: true
  526.      1    }).warnings.length === 1);
  527.      1}());
  528.      1
  529.      1(async function testCaseJslintWarningsValidate() {
  530.      1/*
  531.      1 * this function will validate each jslint <warning> is raised with given
  532.      1 * malformed <code>
  533.      1 */
  534.      1    String(
  535.      1        await moduleFs.promises.readFile("jslint.mjs", "utf8")
  536.      1    ).replace((
  537.      1        /(\n\s*?\/\/\s*?test_cause:\s*?)(\S[\S\s]*?\S)(\n\n\s*?) *?\S/g
  538.    327    ), function (match0, header, causeList, footer) {
  539.    327        let tmp;
  540.    327        // console.error(match0);
  541.    327        // Validate header.
  542.    327        assertOrThrow(header === "\n\n// test_cause:\n", match0);
  543.    327        // Validate footer.
  544.    327        assertOrThrow(footer === "\n\n", match0);
  545.    327        // Validate causeList.
  546.    327        causeList = causeList.replace((
  547.    327            /^\/\/ /gm
  548.    327        ), "").replace((
  549.    327            /^\["\n([\S\s]*?)\n"(,.*?)$/gm
  550.     45        ), function (ignore, source, param) {
  551.     45            source = "[" + JSON.stringify(source) + param;
  552.     45            assertOrThrow(source.length > (80 - 3), source);
  553.     45            return source;
  554.     45        }).replace((
  555.    327            / \/\/jslint-quiet$/gm
  556.    327        ), "");
  557.    497        tmp = causeList.split("\n").map(function (cause) {
  558.    497            return (
  559.    497                "["
  560.   2485                + JSON.parse(cause).map(function (elem) {
  561.   2485                    return JSON.stringify(elem);
  562.   2485                }).join(", ")
  563.    497                + "]"
  564.    497            );
  565.    497        }).sort().join("\n");
  566.    327        assertOrThrow(causeList === tmp, "\n" + causeList + "\n\n" + tmp);
  567.    497        causeList.split("\n").forEach(function (cause) {
  568.    497            cause = JSON.parse(cause);
  569.    497            tmp = jslint.jslint(cause[0], {
  570.    497                beta: true,
  571.    497                test_cause: true
  572.    497            }).causes;
  573.    497            // Validate cause.
  574.    497            assertOrThrow(
  575.    497                tmp[JSON.stringify(cause.slice(1))],
  576.    497                (
  577.    497                    "\n" + JSON.stringify(cause) + "\n\n"
  578.    497                    + Object.keys(tmp).sort().join("\n")
  579.    497                )
  580.    497            );
  581.    497        });
  582.    327        return "";
  583.    327    });
  584.      1}());
  585.      1
  586.      1(async function testCaseMisc() {
  587.      1/*
  588.      1 * this function will test misc handling-behavior
  589.      1 */
  590.      1    // test debugInline's handling-behavior
  591.      1    noop(debugInline);
  592.      1    // test assertErrorThrownAsync's error handling-behavior
  593.      1    await assertErrorThrownAsync(function () {
  594.      1        return assertErrorThrownAsync(noop);
  595.      1    });
  596.      1    // test assertJsonEqual's error handling-behavior
  597.      1    await assertErrorThrownAsync(function () {
  598.      1        assertJsonEqual(1, 2);
  599.      1    });
  600.      1    // test assertOrThrow's error handling-behavior
  601.      1    await assertErrorThrownAsync(function () {
  602.      1        assertOrThrow(undefined, "undefined");
  603.      1    });
  604.      1    await assertErrorThrownAsync(function () {
  605.      1        assertOrThrow(undefined, new Error());
  606.      1    });
  607.      1}());
  608.      1
  609.      1(async function () {
  610.      1    let testCoverageMergeData = JSON.parse(
  611.      1        await moduleFs.promises.readFile(
  612.      1            "test_coverage_merge_data.json",
  613.      1            "utf8"
  614.      1        )
  615.      1    );
  616.      1
  617.      1    jstestDescribe((
  618.      1        "test jstestXxx's handling-behavior"
  619.      1    ), function () {
  620.      1        jstestIt((
  621.      1            "test jstestDescribe's error handling-behavior"
  622.      1        ), function () {
  623.      1            throw new Error();
  624.      1        }, "pass");
  625.      1        jstestIt((
  626.      1            "test jstestOnExit's error handling-behavior"
  627.      1        ), function () {
  628.      1            jstestOnExit(undefined, noop, 1);
  629.      1        });
  630.      1    });
  631.      1
  632.      1    jstestDescribe((
  633.      1        "test v8CoverageListMerge's handling-behavior"
  634.      1    ), function () {
  635.      1        let functionsExpected = JSON.stringify([
  636.      1            {
  637.      1                functionName: "test",
  638.      1                isBlockCoverage: true,
  639.      1                ranges: [
  640.      1                    {
  641.      1                        count: 2,
  642.      1                        endOffset: 4,
  643.      1                        startOffset: 0
  644.      1                    },
  645.      1                    {
  646.      1                        count: 1,
  647.      1                        endOffset: 3,
  648.      1                        startOffset: 1
  649.      1                    }
  650.      1                ]
  651.      1            }
  652.      1        ]);
  653.      1        let functionsInput = JSON.stringify([
  654.      1            {
  655.      1                functionName: "test",
  656.      1                isBlockCoverage: true,
  657.      1                ranges: [
  658.      1                    {
  659.      1                        count: 2,
  660.      1                        endOffset: 4,
  661.      1                        startOffset: 0
  662.      1                    },
  663.      1                    {
  664.      1                        count: 1,
  665.      1                        endOffset: 2,
  666.      1                        startOffset: 1
  667.      1                    },
  668.      1                    {
  669.      1                        count: 1,
  670.      1                        endOffset: 3,
  671.      1                        startOffset: 2
  672.      1                    }
  673.      1                ]
  674.      1            }
  675.      1        ]);
  676.      1        jstestIt((
  677.      1            "accepts empty arrays for `v8CoverageListMerge`"
  678.      1        ), function () {
  679.      1            assertJsonEqual(v8CoverageListMerge([]), {
  680.      1                result: []
  681.      1            });
  682.      1        });
  683.      1        jstestIt((
  684.      1            "funcCovs.length === 1"
  685.      1        ), function () {
  686.      1            assertJsonEqual(v8CoverageListMerge([
  687.      1                {
  688.      1                    result: [
  689.      1                        {
  690.      1                            functions: [
  691.      1                                {
  692.      1                                    functionName: "test",
  693.      1                                    isBlockCoverage: true,
  694.      1                                    ranges: [
  695.      1                                        {
  696.      1                                            count: 2,
  697.      1                                            endOffset: 4,
  698.      1                                            startOffset: 0
  699.      1                                        }
  700.      1                                    ]
  701.      1                                }
  702.      1                            ],
  703.      1                            moduleUrl: "/lib.js",
  704.      1                            scriptId: "1"
  705.      1                        }
  706.      1                    ]
  707.      1                },
  708.      1                {
  709.      1                    result: [
  710.      1                        {
  711.      1                            functions: [],
  712.      1                            moduleUrl: "/lib.js",
  713.      1                            scriptId: "2"
  714.      1                        }
  715.      1                    ]
  716.      1                }
  717.      1            ]), {
  718.      1                result: [
  719.      1                    {
  720.      1                        functions: [
  721.      1                            {
  722.      1                                functionName: "test",
  723.      1                                isBlockCoverage: true,
  724.      1                                ranges: [
  725.      1                                    {
  726.      1                                        count: 2,
  727.      1                                        endOffset: 4,
  728.      1                                        startOffset: 0
  729.      1                                    }
  730.      1                                ]
  731.      1                            }
  732.      1                        ],
  733.      1                        scriptId: "0"
  734.      1                    }
  735.      1                ]
  736.      1            });
  737.      1        });
  738.      1        jstestIt((
  739.      1            "accepts arrays with a single item for `v8CoverageListMerge`"
  740.      1        ), function () {
  741.      1            assertJsonEqual(v8CoverageListMerge([
  742.      1                {
  743.      1                    result: [
  744.      1                        {
  745.      1                            functions: JSON.parse(functionsInput),
  746.      1                            moduleUrl: "/lib.js",
  747.      1                            scriptId: "123"
  748.      1                        }
  749.      1                    ]
  750.      1                }
  751.      1            ]), {
  752.      1                result: [
  753.      1                    {
  754.      1                        functions: JSON.parse(functionsExpected),
  755.      1                        moduleUrl: "/lib.js",
  756.      1                        scriptId: "0"
  757.      1                    }
  758.      1                ]
  759.      1            });
  760.      1        });
  761.      1        jstestIt((
  762.      1            "accepts arrays with two identical items for"
  763.      1            + " `v8CoverageListMerge`"
  764.      1        ), function () {
  765.      1            assertJsonEqual(v8CoverageListMerge([
  766.      1                {
  767.      1                    result: [
  768.      1                        {
  769.      1                            functions: JSON.parse(functionsInput),
  770.      1                            scriptId: "123",
  771.      1                            url: "/lib.js"
  772.      1                        }, {
  773.      1                            functions: JSON.parse(functionsInput),
  774.      1                            scriptId: "123",
  775.      1                            url: "/lib.js"
  776.      1                        }
  777.      1                    ]
  778.      1                }
  779.      1            ]), {
  780.      1                result: [
  781.      1                    {
  782.      1                        functions: JSON.parse(functionsExpected),
  783.      1                        scriptId: "0",
  784.      1                        url: "/lib.js"
  785.      1                    },
  786.      1                    {
  787.      1                        functions: JSON.parse(functionsExpected),
  788.      1                        scriptId: "1",
  789.      1                        url: "/lib.js"
  790.      1                    }
  791.      1                ]
  792.      1            });
  793.      1        });
  794.      1        [
  795.      1            "test_coverage_merge_is_block_coverage_test.json",
  796.      1            "test_coverage_merge_issue_2_mixed_is_block_coverage_test.json",
  797.      1            "test_coverage_merge_node_10_internal_errors_one_of_test.json",
  798.      1            "test_coverage_merge_reduced_test.json",
  799.      1            "test_coverage_merge_simple_test.json",
  800.      1            "test_coverage_merge_various_test.json"
  801.      6        ].forEach(function (file) {
  802.      6            jstestIt(file, function () {
  803.      6                file = testCoverageMergeData[file];
  804.     84                file.forEach(function ({
  805.     84                    expected,
  806.     84                    inputs
  807.     84                }) {
  808.     84                    assertJsonEqual(v8CoverageListMerge(inputs), expected);
  809.     84                });
  810.      6            });
  811.      6        });
  812.      1        jstestIt((
  813.      1            "merge multiple node-sqlite coverage files"
  814.      1        ), function () {
  815.      1            let data1 = [
  816.      1                "test_v8_coverage_node_sqlite_9884_1633662346346_0.json",
  817.      1                "test_v8_coverage_node_sqlite_13216_1633662333140_0.json"
  818.      2            ].map(function (file) {
  819.      2                return testCoverageMergeData[file];
  820.      2            });
  821.      1            let data2 = testCoverageMergeData[
  822.      1                "test_v8_coverage_node_sqlite_merged.json"
  823.      1            ];
  824.      1            data1 = v8CoverageListMerge(data1);
  825.      1            data1 = v8CoverageListMerge([data1]);
  826.      1
  827.      1// Debug data1.
  828.      1// await moduleFs.promises.writeFile(
  829.      1//     ".test_v8_coverage_node_sqlite_merged.json",
  830.      1//     JSON.stringify(objectDeepCopyWithKeysSorted(data1), undefined, 4) + "\n"
  831.      1// );
  832.      1
  833.      1            assertJsonEqual(data1, data2);
  834.      1        });
  835.      1    });
  836.      1
  837.      1    jstestDescribe((
  838.      1        "test v8CoverageReportCreate's handling-behavior"
  839.      1    ), function () {
  840.      1        jstestIt((
  841.      1            "test null-case handling-behavior"
  842.      1        ), async function () {
  843.      1            await assertErrorThrownAsync(function () {
  844.      1                return v8CoverageReportCreate({});
  845.      1            }, "invalid coverageDir");
  846.      1        });
  847.      1
  848.      1// CL-xxx - coverage - Relax requirement for coverageDir to be in cwd.
  849.      1//         jstestIt((
  850.      1//             "test invalid-coverageDir handling-behavior"
  851.      1//         ), async function () {
  852.      1//             await assertErrorThrownAsync(function () {
  853.      1//                 return jslint.jslint_cli({
  854.      1//                     // suppress error
  855.      1//                     console_error: noop,
  856.      1//                     mode_cli: true,
  857.      1//                     processArgv: [
  858.      1//                         "node", "jslint.mjs",
  859.      1//                         "v8_coverage_report=..",
  860.      1//                         "node", "jslint.mjs"
  861.      1//                     ]
  862.      1//                 });
  863.      1//             }, "is not subdirectory of cwd");
  864.      1//         });
  865.      1
  866.      1        jstestIt((
  867.      1            "test coverage-report jslint.mjs handling-behavior"
  868.      1        ), async function () {
  869.      1            await jslint.jslint_cli({
  870.      1                mode_cli: true,
  871.      1                processArgv: [
  872.      1                    "node", "jslint.mjs",
  873.      1                    "v8_coverage_report=.tmp/coverage_jslint",
  874.      1                    "node", "jslint.mjs"
  875.      1                ]
  876.      1            });
  877.      1        });
  878.      1        [
  879.      1            [
  880.      1                "v8CoverageReportCreate_high.js", (
  881.      1                    "switch(0){\n"
  882.      1                    + "case 0:break;\n"
  883.      1                    + "}\n"
  884.      1                )
  885.      1            ], [
  886.      1                "v8CoverageReportCreate_ignore.js", (
  887.      1                    "/*mode-coverage-ignore-file*/\n"
  888.      1                    + "switch(0){\n"
  889.      1                    + "case 0:break;\n"
  890.      1                    + "}\n"
  891.      1                )
  892.      1            ], [
  893.      1                "v8CoverageReportCreate_low.js", (
  894.      1                    "switch(0){\n"
  895.      1                    + "case 1:break;\n"
  896.      1                    + "case 2:break;\n"
  897.      1                    + "case 3:break;\n"
  898.      1                    + "case 4:break;\n"
  899.      1                    + "}\n"
  900.      1                )
  901.      1            ], [
  902.      1                "v8CoverageReportCreate_medium.js", (
  903.      1                    "switch(0){\n"
  904.      1                    + "case 0:break;\n"
  905.      1                    + "case 1:break;\n"
  906.      1                    + "case 2:break;\n"
  907.      1                    + "}\n"
  908.      1                )
  909.      1            ]
  910.      4        ].forEach(function ([
  911.      4            file, data
  912.      4        ], ii) {
  913.      4            jstestIt(file, async function () {
  914.      4                let dir = ".tmp/coverage" + ii + "/";
  915.      4                file = dir + file;
  916.      4                await fsWriteFileWithParents(file, data);
  917.      4                await jslint.jslint_cli({
  918.      4                    mode_cli: true,
  919.      4                    processArgv: [
  920.      4                        "node", "jslint.mjs",
  921.      4                        "v8_coverage_report=" + dir,
  922.      4                        "node",
  923.      4                        file
  924.      4                    ]
  925.      4                });
  926.      4                // test npm handling-behavior
  927.      1                if (ii === 0) {
  928.      1                    await jslint.jslint_cli({
  929.      1                        mode_cli: true,
  930.      1                        processArgv: [
  931.      1                            "node", "jslint.mjs",
  932.      1                            "v8_coverage_report=" + dir,
  933.      1                            "npm", "--version"
  934.      1                        ]
  935.      1                    });
  936.      1                }
  937.      4            });
  938.      4        });
  939.      1    });
  940.      1}());
  941.      1