V8 Coverage Report
Files covered Lines Remaining
. / test.mjs
100.00 %
1576 / 1576

0 / 1576
    1.      1/*jslint beta, node*/
    2.      1import jslint from "./jslint.mjs";
    3.      1import jslintCjs from "./jslint_wrapper_cjs.cjs";
    4.      1import moduleFs from "fs";
    5.      1import modulePath from "path";
    6.      1
    7.      1let {
    8.      1    assertErrorThrownAsync,
    9.      1    assertJsonEqual,
   10.      1    assertOrThrow,
   11.      1    debugInline,
   12.      1    fsWriteFileWithParents,
   13.      1    globExclude,
   14.      1    jstestDescribe,
   15.      1    jstestIt,
   16.      1    jstestOnExit,
   17.      1    moduleFsInit,
   18.      1    noop,
   19.      1    v8CoverageListMerge,
   20.      1    v8CoverageReportCreate
   21.      1} = jslint;
   22.      1let sourceJslintMjs;
   23.      1let testCoverageMergeData;
   24.      1
   25.      1await (async function init() {
   26.      1
   27.      1// Coverage-hack - Ugly-hack to get test-coverage for all initialization-states.
   28.      1
   29.      1    moduleFsInit();
   30.      1    moduleFsInit();
   31.      1
   32.      1// Cleanup directory .tmp
   33.      1
   34.      1    await moduleFs.promises.rm(".tmp", {
   35.      1        recursive: true
   36.      1    }).catch(noop);
   37.      1
   38.      1// init sourceJslintMjs
   39.      1
   40.      1    sourceJslintMjs = await moduleFs.promises.readFile("jslint.mjs", "utf8");
   41.      1
   42.      1// init testCoverageMergeData
   43.      1
   44.      1    testCoverageMergeData = JSON.parse(
   45.      1        await moduleFs.promises.readFile(
   46.      1            "test_coverage_merge_data.json",
   47.      1            "utf8"
   48.      1        )
   49.      1    );
   50.      1}());
   51.      1
   52.      1jstestDescribe((
   53.      1    "test fsXxx handling-behavior"
   54.      1), function testBehaviorFsXxx() {
   55.      1    jstestIt((
   56.      1        "test fsWriteFileWithParents handling-behavior"
   57.      1    ), async function () {
   58.      1        await Promise.all([
   59.      1            1, 2, 3, 4
   60.      4        ].map(async function () {
   61.      4            await fsWriteFileWithParents(
   62.      4                ".tmp/fsWriteFileWithParents/aa/bb/cc",
   63.      4                "aa"
   64.      4            );
   65.      4        }));
   66.      1        assertJsonEqual(
   67.      1            await moduleFs.promises.readFile(
   68.      1                ".tmp/fsWriteFileWithParents/aa/bb/cc",
   69.      1                "utf8"
   70.      1            ),
   71.      1            "aa"
   72.      1        );
   73.      1    });
   74.      1});
   75.      1
   76.      1jstestDescribe((
   77.      1    "test globXxx handling-behavior"
   78.      1), function testBehaviorGlobXxx() {
   79.      1    jstestIt((
   80.      1        "test globAssertNotWeird-error handling-behavior"
   81.      1    ), async function () {
   82.      1        await Promise.all([
   83.      1            "\n",
   84.      1            "\r",
   85.      1            "\u0000"
   86.      3        ].map(async function (char) {
   87.      3            await assertErrorThrownAsync(function () {
   88.      3                return globExclude({
   89.      3                    pathnameList: [
   90.      3                        "aa",
   91.      3                        `cc/${char}/dd`,
   92.      3                        "bb"
   93.      3                    ]
   94.      3                });
   95.      3            }, (
   96.      3                "Weird character "
   97.      3                + JSON.stringify(char).replace("\\", "\\\\")
   98.      3                + " found in "
   99.      3            ));
  100.      3        }));
  101.      1    });
  102.      1    jstestIt((
  103.      1        "test globExclude handling-behavior"
  104.      1    ), function () {
  105.      1        let pathnameList = [
  106.      1            ".dockerignore",
  107.      1            ".eslintrc.js",
  108.      1            ".gitignore",
  109.      1            ".npmignore",
  110.      1            ".travis.yml",
  111.      1            "/node_modules/aa/bb/cc.js",
  112.      1            "/node_modules/aa/bb/dd.js",
  113.      1            "CHANGELOG.md",
  114.      1            "CONTRIBUTING.md",
  115.      1            "Dockerfile",
  116.      1            "LICENSE",
  117.      1            "Makefile",
  118.      1            "README.md",
  119.      1            "appveyor.yml",
  120.      1            "benchmark/insert-transaction.sql",
  121.      1            "benchmark/insert.js",
  122.      1            "binding.gyp",
  123.      1            "cloudformation/ci.template.js",
  124.      1            "deps/common-sqlite.gypi",
  125.      1            "deps/extract.py",
  126.      1            "deps/sqlite-autoconf-3340000.tar.gz",
  127.      1            "deps/sqlite3.gyp",
  128.      1            "examples/simple-chaining.js",
  129.      1            "lib/index.js",
  130.      1            "lib/sqlite3-binding.js",
  131.      1            "lib/sqlite3.js",
  132.      1            "lib/trace.js",
  133.      1            "node_modules/aa/bb/cc.js",
  134.      1            "node_modules/aa/bb/dd.js",
  135.      1            "package.json",
  136.      1            "scripts/build-appveyor.bat",
  137.      1            "scripts/build-local.bat",
  138.      1            "scripts/build_against_electron.sh",
  139.      1            "scripts/build_against_node.sh",
  140.      1            "scripts/build_against_node_webkit.sh",
  141.      1            "scripts/build_for_node_webkit.cmd",
  142.      1            "scripts/install_node.sh",
  143.      1            "scripts/validate_tag.sh",
  144.      1            "sqlite3.js",
  145.      1            "src/async.h",
  146.      1            "src/backup.cc",
  147.      1            "src/backup.h",
  148.      1            "src/database.cc",
  149.      1            "src/database.h",
  150.      1            "src/gcc-preinclude.h",
  151.      1            "src/macros.h",
  152.      1            "src/node_sqlite3.cc",
  153.      1            "src/statement.cc",
  154.      1            "src/statement.h",
  155.      1            "src/threading.h",
  156.      1            "test/affected.test.js",
  157.      1            "test/backup.test.js",
  158.      1            "test/blob.test.js",
  159.      1            "test/cache.test.js",
  160.      1            "test/constants.test.js",
  161.      1            "test/database_fail.test.js",
  162.      1            "test/each.test.js",
  163.      1            "test/exec.test.js",
  164.      1            "test/extension.test.js",
  165.      1            "test/fts-content.test.js",
  166.      1            "test/interrupt.test.js",
  167.      1            "test/issue-108.test.js",
  168.      1            "test/json.test.js",
  169.      1            "test/map.test.js",
  170.      1            "test/named_columns.test.js",
  171.      1            "test/named_params.test.js",
  172.      1            "test/null_error.test.js",
  173.      1            "test/nw/.gitignore",
  174.      1            "test/nw/Makefile",
  175.      1            "test/nw/index.html",
  176.      1            "test/nw/package.json",
  177.      1            "test/open_close.test.js",
  178.      1            "test/other_objects.test.js",
  179.      1            "test/parallel_insert.test.js",
  180.      1            "test/prepare.test.js",
  181.      1            "test/profile.test.js",
  182.      1            "test/rerun.test.js",
  183.      1            "test/scheduling.test.js",
  184.      1            "test/serialization.test.js",
  185.      1            "test/support/createdb-electron.js",
  186.      1            "test/support/createdb.js",
  187.      1            "test/support/elmo.png",
  188.      1            "test/support/helper.js",
  189.      1            "test/support/prepare.db",
  190.      1            "test/support/script.sql",
  191.      1            "test/trace.test.js",
  192.      1            "test/unicode.test.js",
  193.      1            "test/upsert.test.js",
  194.      1            "test/verbose.test.js",
  195.      1            "tools/docker/architecture/linux-arm/Dockerfile",
  196.      1            "tools/docker/architecture/linux-arm/run.sh",
  197.      1            "tools/docker/architecture/linux-arm64/Dockerfile",
  198.      1            "tools/docker/architecture/linux-arm64/run.sh"
  199.      1        ];
  200.      1        [
  201.      1            "tes?/",
  202.      1            "tes[-t-]/",
  203.      1            "tes[-t]/",
  204.      1            "tes[0-9A-Z_a-z-]/",
  205.      1            "tes[t-]/",
  206.      1            "test/**/*.js"
  207.      6        ].forEach(function (aa) {
  208.      6            [
  209.      6                "li*/*.js",
  210.      6                "li?/*.js",
  211.      6                "lib/",
  212.      6                "lib/*",
  213.      6                "lib/**/*.js",
  214.      6                "lib/*.js"
  215.     36            ].forEach(function (bb) {
  216.     36                [
  217.     36                    "",
  218.     36                    "**/node_modules/",
  219.     36                    "node_modules/"
  220.    108                ].forEach(function (cc) {
  221.    108                    assertJsonEqual(
  222.    108                        globExclude({
  223.    108                            excludeList: [
  224.    108                                "tes[!0-9A-Z_a-z-]/",
  225.    108                                "tes[^0-9A-Z_a-z-]/",
  226.    108                                "test/suppor*/*elper.js",
  227.    108                                "test/suppor?/?elper.js",
  228.    108                                "test/support/helper.js"
  229.    108                            ].concat(aa, cc),
  230.    108                            includeList: [
  231.    108                                "**/*.cjs",
  232.    108                                "**/*.js",
  233.    108                                "**/*.mjs",
  234.    108                                "lib/sqlite3.js"
  235.    108                            ].concat(bb),
  236.    108                            pathnameList
  237.    108                        }).pathnameList,
  238.    108                        [
  239.    108                            ".eslintrc.js",
  240.    108                            "benchmark/insert.js",
  241.    108                            "cloudformation/ci.template.js",
  242.    108                            "examples/simple-chaining.js",
  243.    108                            "lib/index.js",
  244.    108                            "lib/sqlite3-binding.js",
  245.    108                            "lib/sqlite3.js",
  246.    108                            "lib/trace.js",
  247.    108                            "sqlite3.js"
  248.    108                        ].concat(
  249.    108                            cc === "**/node_modules/"
  250.     36                            ? [
  251.     36                                "node_modules/aa/bb/cc.js",
  252.     36                                "node_modules/aa/bb/dd.js"
  253.     36                            ]
  254.     72                            : cc === "node_modules/"
  255.     72                            ? [
  256.     72                                "/node_modules/aa/bb/cc.js",
  257.     72                                "/node_modules/aa/bb/dd.js"
  258.     72                            ]
  259.     72                            : [
  260.     72                                "/node_modules/aa/bb/cc.js",
  261.     72                                "/node_modules/aa/bb/dd.js",
  262.     72                                "node_modules/aa/bb/cc.js",
  263.     72                                "node_modules/aa/bb/dd.js"
  264.     72                            ]
  265.    108                        ).sort()
  266.    108                    );
  267.    108                });
  268.     36            });
  269.      6        });
  270.      1    });
  271.      1    jstestIt((
  272.      1        "test globToRegexp handling-behavior"
  273.      1    ), function () {
  274.      1        Object.entries({
  275.      1            "*": (
  276.      1                /^[^\/]*?$/gm
  277.      1            ),
  278.      1            "**": (
  279.      1                /^.*?$/gm
  280.      1            ),
  281.      1            "***": (
  282.      1                /^.*?$/gm
  283.      1            ),
  284.      1            "****": (
  285.      1                /^.*?$/gm
  286.      1            ),
  287.      1            "****////****": (
  288.      1                /^.*?$/gm
  289.      1            ),
  290.      1            "***///***": (
  291.      1                /^.*?$/gm
  292.      1            ),
  293.      1            "**/*": (
  294.      1                /^.*?$/gm
  295.      1            ),
  296.      1            "**/node_modules/": (
  297.      1                /^.*?\/node_modules\/.*?$/gm
  298.      1            ),
  299.      1            "**/node_modules/**/*": (
  300.      1                /^.*?\/node_modules\/.*?$/gm
  301.      1            ),
  302.      1            "?": (
  303.      1                /^[^\/]$/gm
  304.      1            ),
  305.      1            "[!0-9A-Za-z-]": (
  306.      1                /^[^0-9A-Za-z\-]$/gm
  307.      1            ),
  308.      1            "[0-9A-Za-z-]": (
  309.      1                /^[0-9A-Za-z\-]$/gm
  310.      1            ),
  311.      1            "[[]] ]][[": (
  312.      1                /^[\[]\] \]\][\[]$/gm
  313.      1            ),
  314.      1            "[]": (
  315.      1                /^$/gm
  316.      1            ),
  317.      1            "[^0-9A-Za-z-]": (
  318.      1                /^[^0-9A-Za-z\-]$/gm
  319.      1            ),
  320.      1            "aa/bb/cc": (
  321.      1                /^aa\/bb\/cc$/gm
  322.      1            ),
  323.      1            "aa/bb/cc/": (
  324.      1                /^aa\/bb\/cc\/.*?$/gm
  325.      1            ),
  326.      1            "li*/*": (
  327.      1                /^li[^\/]*?\/[^\/]*?$/gm
  328.      1            ),
  329.      1            "li?/*": (
  330.      1                /^li[^\/]\/[^\/]*?$/gm
  331.      1            ),
  332.      1            "lib/": (
  333.      1                /^lib\/.*?$/gm
  334.      1            ),
  335.      1            "lib/*": (
  336.      1                /^lib\/[^\/]*?$/gm
  337.      1            ),
  338.      1            "lib/**/*.js": (
  339.      1                /^lib\/.*?\.js$/gm
  340.      1            ),
  341.      1            "lib/*.js": (
  342.      1                /^lib\/[^\/]*?\.js$/gm
  343.      1            ),
  344.      1            "node_modules/": (
  345.      1                /^node_modules\/.*?$/gm
  346.      1            ),
  347.      1            "node_modules/**/*": (
  348.      1                /^node_modules\/.*?$/gm
  349.      1            ),
  350.      1            "tes[!0-9A-Z_a-z-]/**/*": (
  351.      1                /^tes[^0-9A-Z_a-z\-]\/.*?$/gm
  352.      1            ),
  353.      1            "tes[0-9A-Z_a-z-]/**/*": (
  354.      1                /^tes[0-9A-Z_a-z\-]\/.*?$/gm
  355.      1            ),
  356.      1            "tes[^0-9A-Z_a-z-]/**/*": (
  357.      1                /^tes[^0-9A-Z_a-z\-]\/.*?$/gm
  358.      1            ),
  359.      1            "test/**/*": (
  360.      1                /^test\/.*?$/gm
  361.      1            ),
  362.      1            "test/**/*.js": (
  363.      1                /^test\/.*?\.js$/gm
  364.      1            ),
  365.      1            "test/suppor*/*elper.js": (
  366.      1                /^test\/suppor[^\/]*?\/[^\/]*?elper\.js$/gm
  367.      1            ),
  368.      1            "test/suppor?/?elper.js": (
  369.      1                /^test\/suppor[^\/]\/[^\/]elper\.js$/gm
  370.      1            ),
  371.      1            "test/support/helper.js": (
  372.      1                /^test\/support\/helper\.js$/gm
  373.      1            )
  374.     33        }).forEach(function ([
  375.     33            pattern, rgx
  376.     33        ]) {
  377.     33            assertJsonEqual(
  378.     33                globExclude({
  379.     33                    excludeList: [
  380.     33                        pattern
  381.     33                    ]
  382.     33                }).excludeList[0].source,
  383.     33                rgx.source
  384.     33            );
  385.     33            assertJsonEqual(
  386.     33                globExclude({
  387.     33                    includeList: [
  388.     33                        pattern
  389.     33                    ]
  390.     33                }).includeList[0].source,
  391.     33                rgx.source
  392.     33            );
  393.     33        });
  394.      1    });
  395.      1});
  396.      1
  397.      1jstestDescribe((
  398.      1    "test jslint's cli handling-behavior"
  399.      1), function testBehaviorJslintCli() {
  400.      5    function processExit0(exitCode) {
  401.      5        assertOrThrow(exitCode === 0, exitCode);
  402.      5    }
  403.      6    function processExit1(exitCode) {
  404.      6        assertOrThrow(exitCode === 1, exitCode);
  405.      6    }
  406.      1    jstestIt((
  407.      1        "test cli-null-case handling-behavior"
  408.      1    ), function () {
  409.      1        jslint.jslint_cli({
  410.      1            mode_noop: true,
  411.      1            process_exit: processExit0
  412.      1        });
  413.      1    });
  414.      1    jstestIt((
  415.      1        "test cli-window-jslint handling-behavior"
  416.      1    ), function () {
  417.      1        [
  418.      1            "&window_jslint=",
  419.      1            "&window_jslint=12",
  420.      1            "&window_jslint=1?",
  421.      1            "&window_jslint=?",
  422.      1            "?window_jslint=",
  423.      1            "?window_jslint=12",
  424.      1            "?window_jslint=1?",
  425.      1            "?window_jslint=?",
  426.      1            "window_jslint=1",
  427.      1            "window_jslint=1&",
  428.      1            "window_jslint=12",
  429.      1            "window_jslint=1?"
  430.     12        ].forEach(function (import_meta_url) {
  431.     12            jslint.jslint_cli({
  432.     12                import_meta_url
  433.     12            });
  434.     12            assertOrThrow(globalThis.jslint === undefined);
  435.     12        });
  436.      1        [
  437.      1            "&window_jslint=1",
  438.      1            "&window_jslint=1&",
  439.      1            "?window_jslint=1",
  440.      1            "?window_jslint=1&"
  441.      4        ].forEach(function (import_meta_url) {
  442.      4            jslint.jslint_cli({
  443.      4                import_meta_url
  444.      4            });
  445.      4            assertOrThrow(globalThis.jslint === jslint);
  446.      4            delete globalThis.jslint;
  447.      4        });
  448.      1    });
  449.      1    jstestIt((
  450.      1        "test cli-cjs-and-invalid-file handling-behavior"
  451.      1    ), async function () {
  452.      1        await fsWriteFileWithParents(".test_dir.cjs/touch.txt", "");
  453.      1        [
  454.      1            ".",            // test dir handling-behavior
  455.      1            "jslint.mjs",   // test file handling-behavior
  456.      1            undefined       // test file-undefined handling-behavior
  457.      3        ].forEach(function (file) {
  458.      3            jslint.jslint_cli({
  459.      3                file,
  460.      3                mode_cli: true,
  461.      3                process_env: {
  462.      3                    JSLINT_BETA: "1"
  463.      3                },
  464.      3                process_exit: processExit0
  465.      3            });
  466.      3        });
  467.      1    });
  468.      1    jstestIt((
  469.      1        "test cli-apidoc handling-behavior"
  470.      1    ), function () {
  471.      1        jslint.jslint_cli({
  472.      1            mode_cli: true,
  473.      1            process_argv: [
  474.      1                "node",
  475.      1                "jslint.mjs",
  476.      1                "jslint_apidoc=.artifact/apidoc.html",
  477.      1                JSON.stringify({
  478.      1                    example_list: [
  479.      1                        "README.md",
  480.      1                        "test.mjs",
  481.      1                        "jslint.mjs"
  482.      1                    ],
  483.      1                    github_repo: "https://github.com/jslint-org/jslint",
  484.      1                    module_list: [
  485.      1                        {
  486.      1                            pathname: "./jslint.mjs"
  487.      1                        }
  488.      1                    ],
  489.      1                    package_name: "JSLint",
  490.      1                    version: jslint.jslint_edition
  491.      1                })
  492.      1            ],
  493.      1            process_exit: processExit0
  494.      1        });
  495.      1    });
  496.      1    jstestIt((
  497.      1        "test cli-file-error handling-behavior"
  498.      1    ), function () {
  499.      1        jslint.jslint_cli({
  500.      1            // suppress error
  501.      1            console_error: noop,
  502.      1            file: "undefined",
  503.      1            mode_cli: true,
  504.      1            process_exit: processExit1
  505.      1        });
  506.      1    });
  507.      1    jstestIt((
  508.      1        "test cli-syntax-error handling-behavior"
  509.      1    ), function () {
  510.      1        jslint.jslint_cli({
  511.      1            // suppress error
  512.      1            console_error: noop,
  513.      1            file: "syntax-error.js",
  514.      1            mode_cli: true,
  515.      1            option: {
  516.      1                trace: true
  517.      1            },
  518.      1            process_exit: processExit1,
  519.      1            source: "syntax error"
  520.      1        });
  521.      1    });
  522.      1    jstestIt((
  523.      1        "test cli-report handling-behavior"
  524.      1    ), function () {
  525.      1        jslint.jslint_cli({
  526.      1            // suppress error
  527.      1            console_error: noop,
  528.      1            mode_cli: true,
  529.      1            process_argv: [
  530.      1                "node",
  531.      1                "jslint.mjs",
  532.      1                "jslint_report=.tmp/jslint_report.html",
  533.      1                "jslint.mjs"
  534.      1            ],
  535.      1            process_exit: processExit0
  536.      1        });
  537.      1    });
  538.      1    jstestIt((
  539.      1        "test cli-report-error handling-behavior"
  540.      1    ), function () {
  541.      1        jslint.jslint_cli({
  542.      1            // suppress error
  543.      1            console_error: noop,
  544.      1            mode_cli: true,
  545.      1            process_argv: [
  546.      1                "node",
  547.      1                "jslint.mjs",
  548.      1                "jslint_report=.tmp/jslint_report.html",
  549.      1                "syntax-error.js"
  550.      1            ],
  551.      1            process_exit: processExit1,
  552.      1            source: "syntax error"
  553.      1        });
  554.      1    });
  555.      1    jstestIt((
  556.      1        "test cli-report-json handling-behavior"
  557.      1    ), function () {
  558.      1        jslint.jslint_cli({
  559.      1            // suppress error
  560.      1            console_error: noop,
  561.      1            mode_cli: true,
  562.      1            process_argv: [
  563.      1                "node",
  564.      1                "jslint.mjs",
  565.      1                "jslint_report=.tmp/jslint_report.html",
  566.      1                "aa.json"
  567.      1            ],
  568.      1            process_exit: processExit0,
  569.      1            source: "[]"
  570.      1        });
  571.      1    });
  572.      1    jstestIt((
  573.      1        "test cli-report-json-error handling-behavior"
  574.      1    ), function () {
  575.      1        jslint.jslint_cli({
  576.      1            // suppress error
  577.      1            console_error: noop,
  578.      1            mode_cli: true,
  579.      1            process_argv: [
  580.      1                "node",
  581.      1                "jslint.mjs",
  582.      1                "jslint_report=.tmp/jslint_report.html",
  583.      1                "aa.json"
  584.      1            ],
  585.      1            process_exit: processExit1,
  586.      1            source: "["
  587.      1        });
  588.      1    });
  589.      1    jstestIt((
  590.      1        "test cli-report-misc handling-behavior"
  591.      1    ), function () {
  592.      1        jslint.jslint_cli({
  593.      1            // suppress error
  594.      1            console_error: noop,
  595.      1            mode_cli: true,
  596.      1            process_argv: [
  597.      1                "node",
  598.      1                "jslint.mjs",
  599.      1                "jslint_report=.tmp/jslint_report.html",
  600.      1                "aa.js"
  601.      1            ],
  602.      1            process_exit: processExit0,
  603.      1            source: "let aa = 0;"
  604.      1        });
  605.      1        jslint.jslint_cli({
  606.      1            // suppress error
  607.      1            console_error: noop,
  608.      1            mode_cli: true,
  609.      1            process_argv: [
  610.      1                "node",
  611.      1                "jslint.mjs",
  612.      1                "jslint_report=.tmp/jslint_report.html",
  613.      1                "aa.js"
  614.      1            ],
  615.      1            process_exit: processExit1,
  616.      1            source: "(aa)=>aa; function aa([aa]){}"
  617.      1        });
  618.      1    });
  619.      1    jstestIt((
  620.      1        "test cli-jslint-wrapper-vim handling-behavior"
  621.      1    ), function () {
  622.      1        jslint.jslint_cli({
  623.      1            // suppress error
  624.      1            console_error: noop,
  625.      1            mode_cli: true,
  626.      1            process_argv: [
  627.      1                "node",
  628.      1                "jslint.mjs",
  629.      1                "jslint_wrapper_vim",
  630.      1                "syntax-error.js"
  631.      1            ],
  632.      1            process_exit: processExit1,
  633.      1            source: "syntax error"
  634.      1        });
  635.      1    });
  636.      1});
  637.      1
  638.      1jstestDescribe((
  639.      1    "test jslint's no-warnings handling-behavior"
  640.      1), function testBehaviorJslintNoWarnings() {
  641.      1    jstestIt((
  642.      1        "test jslint's no-warnings handling-behavior"
  643.      1    ), function () {
  644.      1        Object.values({
  645.      1            array: [
  646.      1                "new Array(0);"
  647.      1            ],
  648.      1            async_await: [
  649.      1                "async function aa() {\n    await aa();\n}",
  650.      1
  651.      1// PR-405 - Bugfix - fix expression after "await" mis-identified as statement.
  652.      1
  653.      1                "async function aa() {\n    await aa;\n}",
  654.      1                (
  655.      1                    "async function aa() {\n"
  656.      1                    + "    try {\n"
  657.      1                    + "        aa();\n"
  658.      1                    + "    } catch (err) {\n"
  659.      1                    + "        await err();\n"
  660.      1                    + "    }\n"
  661.      1                    + "}\n"
  662.      1                ),
  663.      1                (
  664.      1                    "async function aa() {\n"
  665.      1                    + "    try {\n"
  666.      1                    + "        await aa();\n"
  667.      1                    + "    } catch (err) {\n"
  668.      1                    + "        await err();\n"
  669.      1                    + "    }\n"
  670.      1                    + "}\n"
  671.      1                ),
  672.      1
  673.      1// PR-370 - Add top-level-await support.
  674.      1
  675.      1                "await String();\n"
  676.      1            ],
  677.      1
  678.      1// PR-351 - Add BigInt support.
  679.      1
  680.      1            bigint: [
  681.      1                "let aa = 0b0n;\n",
  682.      1                "let aa = 0o0n;\n",
  683.      1                "let aa = 0x0n;\n",
  684.      1                "let aa = BigInt(0n);\n",
  685.      1                "let aa = typeof aa === \"bigint\";\n"
  686.      1            ],
  687.      1            date: [
  688.      1                "Date.getTime();",
  689.      1                "let aa = aa().getTime();",
  690.      1                "let aa = aa.aa().getTime();"
  691.      1            ],
  692.      1            directive: [
  693.      1                "#!\n/*jslint browser:false, node*/\n\"use strict\";",
  694.      1                "/*property aa bb*/"
  695.      1            ],
  696.      1            for: [
  697.      1                (
  698.      1                    "/*jslint for*/\n"
  699.      1                    + "function aa(bb) {\n"
  700.      1                    + "    for (bb = 0; bb < 0; bb += 1) {\n"
  701.      1                    + "        bb();\n"
  702.      1                    + "    }\n"
  703.      1                    + "}\n"
  704.      1                )
  705.      1            ],
  706.      1            jslint_disable: [
  707.      1                "/*jslint-disable*/\n0\n/*jslint-enable*/"
  708.      1            ],
  709.      1            jslint_ignore_line: [
  710.      1                "0 //jslint-ignore-line"
  711.      1            ],
  712.      1            json: [
  713.      1                "{\"aa\":[[],-0,null]}"
  714.      1            ],
  715.      1            label: [
  716.      1                (
  717.      1                    "function aa() {\n"
  718.      1                    + "bb:\n"
  719.      1                    + "    while (true) {\n"
  720.      1                    + "        if (true) {\n"
  721.      1                    + "            break bb;\n"
  722.      1                    + "        }\n"
  723.      1                    + "    }\n"
  724.      1                    + "}\n"
  725.      1                )
  726.      1            ],
  727.      1            loop: [
  728.      1                (
  729.      1                    "function aa() {\n"
  730.      1                    + "    do {\n"
  731.      1                    + "        aa();\n"
  732.      1                    + "    } while (aa());\n"
  733.      1                    + "}\n"
  734.      1                ),
  735.      1
  736.      1// PR-378 - Relax warning "function_in_loop".
  737.      1
  738.      1                (
  739.      1                    "function aa() {\n"
  740.      1                    + "    while (true) {\n"
  741.      1                    + "        (function () {\n"
  742.      1                    + "            return;\n"
  743.      1                    + "        }());\n"
  744.      1                    + "    }\n"
  745.      1                    + "}\n"
  746.      1                )
  747.      1            ],
  748.      1            module: [
  749.      1                "export default Object.freeze();",
  750.      1
  751.      1// PR-439 - Add grammar for "export async function ...".
  752.      1
  753.      1                (
  754.      1                    "export default Object.freeze(async function () {\n"
  755.      1                    + "    return await 0;\n"
  756.      1                    + "});\n"
  757.      1                ),
  758.      1                "import {aa, bb} from \"aa\";\naa(bb);",
  759.      1                "import {} from \"aa\";",
  760.      1                "import(\"aa\").then(function () {\n    return;\n});",
  761.      1                (
  762.      1                    "let aa = 0;\n"
  763.      1                    + "import(aa).then(aa).then(aa)"
  764.      1                    + ".catch(aa).finally(aa);\n"
  765.      1                )
  766.      1            ],
  767.      1            number: [
  768.      1                "let aa = 0.0e0;",
  769.      1                "let aa = 0b0;",
  770.      1                "let aa = 0o0;",
  771.      1                "let aa = 0x0;"
  772.      1            ],
  773.      1
  774.      1// PR-390 - Add numeric-separator support.
  775.      1
  776.      1            numeric_separator: [
  777.      1                "let aa = 0.0_0_0;",
  778.      1                "let aa = 0b0_1111_1111n;\n",
  779.      1                "let aa = 0o0_1234_1234n;\n",
  780.      1                "let aa = 0x0_1234_1234n;\n",
  781.      1                "let aa = 1_234_234.1_234_234E1_234_234;"
  782.      1            ],
  783.      1            optional_chaining: [
  784.      1                "let aa = aa?.bb?.cc;"
  785.      1            ],
  786.      1            param: [
  787.      1                "function aa({aa, bb}) {\n    return {aa, bb};\n}\n",
  788.      1                (
  789.      1                    "function aa({constructor}) {\n"
  790.      1                    + "    return {constructor};\n"
  791.      1                    + "}\n"
  792.      1                )
  793.      1            ],
  794.      1            property: [
  795.      1                "let aa = aa[`!`];"
  796.      1            ],
  797.      1            regexp: [
  798.      1                "function aa() {\n    return /./;\n}",
  799.      1                "let aa = /(?!.)(?:.)(?=.)/;",
  800.      1                "let aa = /./gimuy;",
  801.      1                "let aa = /[\\--\\-]/;"
  802.      1            ],
  803.      1            ternary: [
  804.      1                (
  805.      1                    "let aa = (\n"
  806.      1                    + "    aa()\n"
  807.      1                    + "    ? 0\n"
  808.      1                    + "    : 1\n"
  809.      1                    + ") "
  810.      1                    + "&& (\n"
  811.      1                    + "    aa()\n"
  812.      1                    + "    ? 0\n"
  813.      1                    + "    : 1\n"
  814.      1                    + ");"
  815.      1                ),
  816.      1                (
  817.      1                    "let aa = (\n"
  818.      1                    + "    aa()\n"
  819.      1                    + "    ? `${0}`\n"
  820.      1                    + "    : `${1}`\n"
  821.      1                    + ");"
  822.      1                ),
  823.      1
  824.      1// PR-394 - Bugfix
  825.      1// Fix jslint falsely believing megastring literals `0` and `1` are similar.
  826.      1
  827.      1                (
  828.      1                    "let aa = (\n"
  829.      1                    + "    aa()\n"
  830.      1                    + "    ? `0`\n"
  831.      1                    + "    : `1`\n"
  832.      1                    + ");"
  833.      1                )
  834.      1            ],
  835.      1            try_catch: [
  836.      1                (
  837.      1                    "let aa = 0;\n"
  838.      1                    + "try {\n"
  839.      1                    + "    aa();\n"
  840.      1                    + "} catch (err) {\n"
  841.      1                    + "    aa = err;\n"
  842.      1                    + "}\n"
  843.      1                    + "try {\n"
  844.      1                    + "    aa();\n"
  845.      1                    + "} catch (err) {\n"
  846.      1                    + "    aa = err;\n"
  847.      1                    + "}\n"
  848.      1                    + "aa();\n"
  849.      1                )
  850.      1            ],
  851.      1            try_finally: [
  852.      1                (
  853.      1                    "let aa = 0;\n"
  854.      1                    + "try {\n"
  855.      1                    + "    aa();\n"
  856.      1                    + "} finally {\n"
  857.      1                    + "    aa();\n"
  858.      1                    + "}\n"
  859.      1                )
  860.      1            ],
  861.      1            use_strict: [
  862.      1                (
  863.      1                    "\"use strict\";\n"
  864.      1                    + "let aa = 0;\n"
  865.      1                    + "function bb() {\n"
  866.      1                    + "    \"use strict\";\n"
  867.      1                    + "    return aa;\n"
  868.      1                    + "}\n"
  869.      1                )
  870.      1            ],
  871.      1            var: [
  872.      1
  873.      1// PR-363 - Bugfix
  874.      1// Add test against false-warning <uninitialized 'bb'> in code
  875.      1// '/*jslint node*/\nlet {aa:bb} = {}; bb();'.
  876.      1
  877.      1                "/*jslint node*/\n",
  878.      1                ""
  879.      2            ].map(function (directive) {
  880.      2                return [
  881.      2                    "let [\n    aa, bb = 0\n] = 0;\naa();\nbb();",
  882.      2                    "let aa = 0;\nlet [...bb] = [...aa];\nbb();",
  883.      2
  884.      2// PR-459 - Allow destructuring-assignment after function-definition.
  885.      2
  886.      2                    (
  887.      2                        "let aa;\n"
  888.      2                        + "let bb;\n"
  889.      2                        + "function cc() {\n"
  890.      2                        + "    return;\n"
  891.      2                        + "}\n"
  892.      2                        + "[aa, bb] = cc();\n"
  893.      2                    ),
  894.      2                    "let constructor = 0;\nconstructor();",
  895.      2                    "let {\n    aa: bb\n} = 0;\nbb();",
  896.      2                    "let {\n    aa: bb,\n    bb: cc\n} = 0;\nbb();\ncc();",
  897.      2                    "let {aa, bb} = 0;\naa();\nbb();",
  898.      2                    "let {constructor} = 0;\nconstructor();"
  899.     16                ].map(function (code) {
  900.     16                    return directive + code;
  901.     16                });
  902.      2            }).flat()
  903.     23        }).forEach(function (codeList) {
  904.     23            let elemPrv = "";
  905.     68            codeList.forEach(function (code) {
  906.     68                let warnings;
  907.     68                // Assert codeList is sorted.
  908.     68                assertOrThrow(elemPrv < code, JSON.stringify([
  909.     68                    elemPrv, code
  910.     68                ], undefined, 4));
  911.     68                elemPrv = code;
  912.     68                [
  913.     68                    jslint.jslint,
  914.     68                    jslintCjs.jslint
  915.    136                ].forEach(function (jslint) {
  916.    136                    warnings = jslint(code, {
  917.    136                        beta: true
  918.    136                    }).warnings;
  919.    136                    assertOrThrow(
  920.    136                        warnings.length === 0,
  921.    136                        JSON.stringify([code, warnings])
  922.    136                    );
  923.    136                });
  924.     68            });
  925.     23        });
  926.      1    });
  927.      1});
  928.      1
  929.      1jstestDescribe((
  930.      1    "test jslint's option handling-behavior"
  931.      1), function testBehaviorJslintOption() {
  932.      1    let elemPrv = "";
  933.      1    [
  934.      1        [
  935.      1            "let aa = aa | 0;", {bitwise: true}, []
  936.      1        ], [
  937.      1            ";\naa(new XMLHttpRequest());", {browser: true}, ["aa"]
  938.      1        ], [
  939.      1            "let aa = \"aa\" + 0;", {convert: true}, []
  940.      1        ], [
  941.      1            "registerType();", {couch: true}, []
  942.      1        ], [
  943.      1            "debugger;", {devel: true}, []
  944.      1        ], [
  945.      1
  946.      1// PR-404 - Alias "evil" to jslint-directive "eval" for backwards-compat.
  947.      1
  948.      1            "new Function();\neval();", {eval: true, evil: true}, []
  949.      1        ], [
  950.      1            "let aa = () => 0;", {fart: true}, []
  951.      1        ], [
  952.      1            (
  953.      1                "let aa = async (bb, {cc, dd}, [ee, ff], ...gg) => {\n"
  954.      1                + "    bb += 1;\n"
  955.      1                + "    return await (bb + cc + dd + ee + ff + gg);\n"
  956.      1                + "};\n"
  957.      1            ), {fart: true}, []
  958.      1        ], [
  959.      1            (
  960.      1                "function aa(aa) {\n"
  961.      1                + "    for (aa = 0; aa < 0; aa += 1) {\n"
  962.      1                + "        aa();\n"
  963.      1                + "    }\n"
  964.      1                + "}\n"
  965.      1            ), {for: true}, []
  966.      1        ], [
  967.      1            "let aa = {get aa() {\n    return;\n}};", {getset: true}, []
  968.      1        ], [
  969.      1            "let aa = {set aa(aa) {\n    return aa;\n}};", {getset: true}, []
  970.      1        ], [
  971.      1            sourceJslintMjs.replace((
  972.      1                /    /g
  973.      1            ), "  "), {indent2: true}, []
  974.      1        ], [
  975.      1            "function aa() {\n  return;\n}", {indent2: true}, []
  976.      1        ], [
  977.      1            "/".repeat(100), {long: true}, []
  978.      1        ], [
  979.      1
  980.      1// PR-404 - Alias "nomen" to jslint-directive "name" for backwards-compat.
  981.      1
  982.      1            "let aa = aa._;", {name: true, nomen: true}, []
  983.      1        ], [
  984.      1            "require();", {node: true}, []
  985.      1        ], [
  986.      1            "let aa = 'aa';", {single: true}, []
  987.      1        ], [
  988.      1
  989.      1// PR-404 - Add new directive "subscript" to play nice with Google Closure.
  990.      1
  991.      1            "aa[\"aa\"] = 1;", {subscript: true}, ["aa"]
  992.      1        ], [
  993.      1            "", {test_internal_error: true}, []
  994.      1        ], [
  995.      1            "let aa = this;", {this: true}, []
  996.      1        ], [
  997.      1            "", {trace: true}, []
  998.      1        ], [
  999.      1            (
 1000.      1                "function aa({bb, aa}) {\n"
 1001.      1                + "    switch (aa) {\n"
 1002.      1                + "    case 1:\n"
 1003.      1                + "        break;\n"
 1004.      1                + "    case 0:\n"
 1005.      1                + "        break;\n"
 1006.      1                + "    default:\n"
 1007.      1                + "        return {bb, aa};\n"
 1008.      1                + "    }\n"
 1009.      1                + "}\n"
 1010.      1            ), {unordered: true}, []
 1011.      1        ], [
 1012.      1            "let {bb, aa} = 0;", {unordered: true}, []
 1013.      1        ], [
 1014.      1            (
 1015.      1                "function aa() {\n"
 1016.      1                + "    if (aa) {\n"
 1017.      1                + "        let bb = 0;\n"
 1018.      1                + "        return bb;\n"
 1019.      1                + "    }\n"
 1020.      1                + "}\n"
 1021.      1            ), {variable: true}, []
 1022.      1        ], [
 1023.      1            "let bb = 0;\nlet aa = 0;", {variable: true}, []
 1024.      1        ], [
 1025.      1            "\t", {white: true}, []
 1026.      1        ]
 1027.     26    ].forEach(function ([
 1028.     26        source, option_dict, global_list
 1029.     26    ]) {
 1030.     26        jstestIt((
 1031.     26            `test option=${JSON.stringify(option_dict)} handling-behavior`
 1032.     26        ), function () {
 1033.     26            let elemNow = JSON.stringify([
 1034.     26                option_dict, source, global_list
 1035.     26            ]);
 1036.     26            let warningsLength = (
 1037.     26                option_dict.test_internal_error
 1038.      1                ? 1
 1039.     25                : 0
 1040.     26            );
 1041.     26            // Assert list is sorted.
 1042.     26            assertOrThrow(elemPrv < elemNow, JSON.stringify([
 1043.     26                elemPrv, elemNow
 1044.     26            ], undefined, 4));
 1045.     26            elemPrv = elemNow;
 1046.     26            option_dict.beta = true;
 1047.     26            [
 1048.     26                jslint.jslint,
 1049.     26                jslintCjs.jslint
 1050.     52            ].forEach(function (jslint) {
 1051.     52                // test jslint's option handling-behavior
 1052.     52                assertOrThrow(
 1053.     52                    jslint(
 1054.     52                        source,
 1055.     52                        option_dict,
 1056.     52                        global_list
 1057.     52                    ).warnings.length === warningsLength,
 1058.     52                    "jslint.jslint(" + JSON.stringify([
 1059.     52                        source, option_dict, global_list
 1060.     52                    ]) + ")"
 1061.     52                );
 1062.     52                // test jslint's directive handling-behavior
 1063.     52                source = (
 1064.     52                    "/*jslint " + JSON.stringify(
 1065.     52                        option_dict
 1066.     52                    ).slice(1, -1).replace((
 1067.     52                        /"/g
 1068.     52                    ), "") + "*/\n"
 1069.     52                    + (
 1070.     52                        global_list.length === 0
 1071.     48                        ? ""
 1072.      4                        : "/*global " + global_list.join(",") + "*/\n"
 1073.     52                    )
 1074.     52                    + source.replace((
 1075.     52                        /^#!/
 1076.     52                    ), "//")
 1077.     52                );
 1078.     52                assertOrThrow(
 1079.     52                    jslint(source).warnings.length === warningsLength,
 1080.     52                    source
 1081.     52                );
 1082.     52            });
 1083.     26        });
 1084.     26    });
 1085.      1});
 1086.      1
 1087.      1jstestDescribe((
 1088.      1    "test jslint's warnings handling-behavior"
 1089.      1), function testBehaviorJslintWarnings() {
 1090.      1    jstestIt((
 1091.      1        "test jslint's warning handling-behavior"
 1092.      1    ), function () {
 1093.      1
 1094.      1// this function will validate each jslint <warning> is raised with given
 1095.      1// malformed <code>
 1096.      1
 1097.      1        sourceJslintMjs.replace((
 1098.      1            /(\n\s*?\/\/\s*?test_cause:\s*?)(\S[\S\s]*?\S)(\n\n\s*?) *?\S/g
 1099.    327        ), function (match0, header, causeList, footer) {
 1100.    327            let tmp;
 1101.    327            // console.error(match0);
 1102.    327            // Validate header.
 1103.    327            assertOrThrow(header === "\n\n// test_cause:\n", match0);
 1104.    327            // Validate footer.
 1105.    327            assertOrThrow(footer === "\n\n", match0);
 1106.    327            // Validate causeList.
 1107.    327            causeList = causeList.replace((
 1108.    327                /^\/\/ /gm
 1109.    327            ), "").replace((
 1110.    327                /^\["\n([\S\s]*?)\n"(,.*?)$/gm
 1111.     43            ), function (ignore, source, param) {
 1112.     43                source = "[" + JSON.stringify(source) + param;
 1113.     43                assertOrThrow(source.length > (80 - 3), source);
 1114.     43                return source;
 1115.     43            }).replace((
 1116.    327                / \/\/jslint-ignore-line$/gm
 1117.    327            ), "");
 1118.    503            tmp = causeList.split("\n").map(function (cause) {
 1119.    503                return (
 1120.    503                    "["
 1121.   2515                    + JSON.parse(cause).map(function (elem) {
 1122.   2515                        return JSON.stringify(elem);
 1123.   2515                    }).join(", ")
 1124.    503                    + "]"
 1125.    503                );
 1126.    503            }).sort().join("\n");
 1127.    327            assertOrThrow(
 1128.    327                causeList === tmp,
 1129.    327                "\n" + causeList + "\n\n" + tmp
 1130.    327            );
 1131.    503            causeList.split("\n").forEach(function (cause) {
 1132.    503                cause = JSON.parse(cause);
 1133.    503                tmp = jslint.jslint(cause[0], {
 1134.    503                    beta: true,
 1135.    503                    test_cause: true
 1136.    503                }).causes;
 1137.    503                // Validate cause.
 1138.    503                assertOrThrow(
 1139.    503                    tmp[JSON.stringify(cause.slice(1))],
 1140.    503                    (
 1141.    503                        "\n" + JSON.stringify(cause) + "\n\n"
 1142.    503                        + Object.keys(tmp).sort().join("\n")
 1143.    503                    )
 1144.    503                );
 1145.    503            });
 1146.    327            return "";
 1147.    327        });
 1148.      1    });
 1149.      1});
 1150.      1
 1151.      1jstestDescribe((
 1152.      1    "test jstestXxx handling-behavior"
 1153.      1), function testBehaviorJstestXxx() {
 1154.      1    jstestIt((
 1155.      1        "test jstestDescribe error handling-behavior"
 1156.      1    ), function () {
 1157.      1        throw new Error();
 1158.      1    }, "pass");
 1159.      1    jstestIt((
 1160.      1        "test jstestOnExit tests-failed handling-behavior"
 1161.      1    ), function () {
 1162.      1        jstestOnExit(undefined, "testsFailed");
 1163.      1    });
 1164.      1});
 1165.      1
 1166.      1jstestDescribe((
 1167.      1    "test misc handling-behavior"
 1168.      1), function testBehaviorMisc() {
 1169.      1    jstestIt((
 1170.      1        "test misc handling-behavior"
 1171.      1    ), async function () {
 1172.      1        // test debugInline handling-behavior
 1173.      1        noop(debugInline);
 1174.      1        // test assertErrorThrownAsync error handling-behavior
 1175.      1        await assertErrorThrownAsync(function () {
 1176.      1            return assertErrorThrownAsync(noop);
 1177.      1        });
 1178.      1        // test assertJsonEqual error handling-behavior
 1179.      1        await assertErrorThrownAsync(function () {
 1180.      1            assertJsonEqual(1, 2);
 1181.      1        });
 1182.      1        await assertErrorThrownAsync(function () {
 1183.      1            assertJsonEqual(1, 2, "undefined");
 1184.      1        });
 1185.      1        await assertErrorThrownAsync(function () {
 1186.      1            assertJsonEqual(1, 2, {});
 1187.      1        });
 1188.      1        // test assertOrThrow error handling-behavior
 1189.      1        await assertErrorThrownAsync(function () {
 1190.      1            assertOrThrow(undefined, "undefined");
 1191.      1        });
 1192.      1        await assertErrorThrownAsync(function () {
 1193.      1            assertOrThrow(undefined, new Error());
 1194.      1        });
 1195.      1    });
 1196.      1});
 1197.      1
 1198.      1jstestDescribe((
 1199.      1    "test v8CoverageListMerge handling-behavior"
 1200.      1), function testBehaviorV8CoverageListMerge() {
 1201.      1    let functionsInput = JSON.stringify([
 1202.      1        {
 1203.      1            functionName: "test",
 1204.      1            isBlockCoverage: true,
 1205.      1            ranges: [
 1206.      1                {
 1207.      1                    count: 2,
 1208.      1                    endOffset: 4,
 1209.      1                    startOffset: 0
 1210.      1                },
 1211.      1                {
 1212.      1                    count: 1,
 1213.      1                    endOffset: 2,
 1214.      1                    startOffset: 1
 1215.      1                },
 1216.      1                {
 1217.      1                    count: 1,
 1218.      1                    endOffset: 3,
 1219.      1                    startOffset: 2
 1220.      1                }
 1221.      1            ]
 1222.      1        }
 1223.      1    ]);
 1224.      1    jstestIt((
 1225.      1        "accepts empty arrays for `v8CoverageListMerge`"
 1226.      1    ), function () {
 1227.      1        assertJsonEqual(v8CoverageListMerge([]), {
 1228.      1            result: []
 1229.      1        });
 1230.      1    });
 1231.      1    jstestIt((
 1232.      1        "funcCovs.length === 1"
 1233.      1    ), function () {
 1234.      1        assertJsonEqual(v8CoverageListMerge([
 1235.      1            {
 1236.      1                result: [
 1237.      1                    {
 1238.      1                        functions: [
 1239.      1                            {
 1240.      1                                functionName: "test",
 1241.      1                                isBlockCoverage: true,
 1242.      1                                ranges: [
 1243.      1                                    {
 1244.      1                                        count: 2,
 1245.      1                                        endOffset: 4,
 1246.      1                                        startOffset: 0
 1247.      1                                    }
 1248.      1                                ]
 1249.      1                            }
 1250.      1                        ],
 1251.      1                        moduleUrl: "/lib.js",
 1252.      1                        scriptId: "1"
 1253.      1                    }
 1254.      1                ]
 1255.      1            },
 1256.      1            {
 1257.      1                result: [
 1258.      1                    {
 1259.      1                        functions: [],
 1260.      1                        moduleUrl: "/lib.js",
 1261.      1                        scriptId: "2"
 1262.      1                    }
 1263.      1                ]
 1264.      1            }
 1265.      1        ]), {
 1266.      1            result: [
 1267.      1                {
 1268.      1                    functions: [
 1269.      1                        {
 1270.      1                            functionName: "test",
 1271.      1                            isBlockCoverage: true,
 1272.      1                            ranges: [
 1273.      1                                {
 1274.      1                                    count: 2,
 1275.      1                                    endOffset: 4,
 1276.      1                                    startOffset: 0
 1277.      1                                }
 1278.      1                            ]
 1279.      1                        }
 1280.      1                    ],
 1281.      1                    scriptId: "0"
 1282.      1                }
 1283.      1            ]
 1284.      1        });
 1285.      1    });
 1286.      1    jstestIt((
 1287.      1        "accepts arrays with a single item for `v8CoverageListMerge`"
 1288.      1    ), function () {
 1289.      1        assertJsonEqual(v8CoverageListMerge([
 1290.      1            {
 1291.      1                result: [
 1292.      1                    {
 1293.      1                        functions: JSON.parse(functionsInput),
 1294.      1                        moduleUrl: "/lib.js",
 1295.      1                        scriptId: "123"
 1296.      1                    }
 1297.      1                ]
 1298.      1            }
 1299.      1        ]), {
 1300.      1            result: [
 1301.      1                {
 1302.      1                    functions: [
 1303.      1                        {
 1304.      1                            functionName: "test",
 1305.      1                            isBlockCoverage: true,
 1306.      1                            ranges: [
 1307.      1                                {
 1308.      1                                    count: 2,
 1309.      1                                    endOffset: 4,
 1310.      1                                    startOffset: 0
 1311.      1                                },
 1312.      1                                {
 1313.      1                                    count: 1,
 1314.      1                                    endOffset: 3,
 1315.      1                                    startOffset: 1
 1316.      1                                }
 1317.      1                            ]
 1318.      1                        }
 1319.      1                    ],
 1320.      1                    moduleUrl: "/lib.js",
 1321.      1                    scriptId: "0"
 1322.      1                }
 1323.      1            ]
 1324.      1        });
 1325.      1    });
 1326.      1    jstestIt((
 1327.      1        "accepts arrays with two identical items for"
 1328.      1        + " `v8CoverageListMerge`"
 1329.      1    ), function () {
 1330.      1        assertJsonEqual(v8CoverageListMerge([
 1331.      1            {
 1332.      1                result: [
 1333.      1                    {
 1334.      1                        functions: JSON.parse(functionsInput),
 1335.      1                        scriptId: "123",
 1336.      1                        url: "/lib.js"
 1337.      1                    }, {
 1338.      1                        functions: JSON.parse(functionsInput),
 1339.      1                        scriptId: "123",
 1340.      1                        url: "/lib.js"
 1341.      1                    }
 1342.      1                ]
 1343.      1            }
 1344.      1        ]), {
 1345.      1            result: [
 1346.      1                {
 1347.      1                    functions: [
 1348.      1                        {
 1349.      1                            functionName: "test",
 1350.      1                            isBlockCoverage: true,
 1351.      1                            ranges: [
 1352.      1                                {
 1353.      1                                    count: 4,
 1354.      1                                    endOffset: 4,
 1355.      1                                    startOffset: 0
 1356.      1                                },
 1357.      1                                {
 1358.      1                                    count: 2,
 1359.      1                                    endOffset: 3,
 1360.      1                                    startOffset: 1
 1361.      1                                }
 1362.      1                            ]
 1363.      1                        }
 1364.      1                    ],
 1365.      1                    scriptId: "0",
 1366.      1                    url: "/lib.js"
 1367.      1                }
 1368.      1            ]
 1369.      1        });
 1370.      1    });
 1371.      1    [
 1372.      1        "test_coverage_merge_is_block_coverage_test.json",
 1373.      1        "test_coverage_merge_issue_2_mixed_is_block_coverage_test.json",
 1374.      1        "test_coverage_merge_node_10_internal_errors_one_of_test.json",
 1375.      1        "test_coverage_merge_reduced_test.json",
 1376.      1        "test_coverage_merge_simple_test.json",
 1377.      1        "test_coverage_merge_various_test.json"
 1378.      6    ].forEach(function (file) {
 1379.      6        jstestIt(file, function () {
 1380.      6            file = testCoverageMergeData[file];
 1381.     84            file.forEach(function ({
 1382.     84                expected,
 1383.     84                inputs
 1384.     84            }) {
 1385.     84                assertJsonEqual(v8CoverageListMerge(inputs), expected);
 1386.     84            });
 1387.      6        });
 1388.      6    });
 1389.      1    jstestIt((
 1390.      1        "merge multiple node-sqlite coverage files"
 1391.      1    ), function () {
 1392.      1        let data1 = [
 1393.      1            "test_v8_coverage_node_sqlite_9884_1633662346346_0.json",
 1394.      1            "test_v8_coverage_node_sqlite_13216_1633662333140_0.json"
 1395.      2        ].map(function (file) {
 1396.      2            return testCoverageMergeData[file];
 1397.      2        });
 1398.      1        let data2 = testCoverageMergeData[
 1399.      1            "test_v8_coverage_node_sqlite_merged.json"
 1400.      1        ];
 1401.      1        data1 = v8CoverageListMerge(data1);
 1402.      1        data1 = v8CoverageListMerge([data1]);
 1403.      1
 1404.      1// Debug data1.
 1405.      1// await moduleFs.promises.writeFile(
 1406.      1//     ".test_v8_coverage_node_sqlite_merged.json",
 1407.      1//     JSON.stringify(objectDeepCopyWithKeysSorted(data1), undefined, 4) + "\n"
 1408.      1// );
 1409.      1
 1410.      1        assertJsonEqual(data1, data2);
 1411.      1    });
 1412.      1});
 1413.      1
 1414.      1jstestDescribe((
 1415.      1    "test v8CoverageReportCreate handling-behavior"
 1416.      1), function testBehaviorV8CoverageReportCreate() {
 1417.      1    jstestIt((
 1418.      1        "test null-case handling-behavior"
 1419.      1    ), async function () {
 1420.      1        await assertErrorThrownAsync(function () {
 1421.      1            return v8CoverageReportCreate({});
 1422.      1        }, "invalid coverageDir");
 1423.      1    });
 1424.      1    jstestIt((
 1425.      1        "test coverage-report jslint.mjs handling-behavior"
 1426.      1    ), async function () {
 1427.      1        // test remove-old-coverage handling-behavior
 1428.      1        await fsWriteFileWithParents(
 1429.      1            ".tmp/coverage_jslint/coverage-0-0-0.json",
 1430.      1            ""
 1431.      1        );
 1432.      1        await jslint.jslint_cli({
 1433.      1            console_error: noop, // comment to debug
 1434.      1            mode_cli: true,
 1435.      1            process_argv: [
 1436.      1                "node", "jslint.mjs",
 1437.      1                "v8_coverage_report=.tmp/coverage_jslint",
 1438.      1                "--exclude=aa.js",
 1439.      1                "--include-node-modules=1",
 1440.      1                "--include=jslint.mjs",
 1441.      1                "node", "jslint.mjs"
 1442.      1            ]
 1443.      1        });
 1444.      1    });
 1445.      1    [
 1446.      1        [
 1447.      1            "v8CoverageReportCreate_high.js", (
 1448.      1                "switch(0){\n"
 1449.      1                + "case 0:break;\n"
 1450.      1                + "}\n"
 1451.      1            )
 1452.      1        ], [
 1453.      1            "v8CoverageReportCreate_ignore.js", (
 1454.      1                "/*coverage-ignore-file*/\n"
 1455.      1                + "switch(0){\n"
 1456.      1                + "case 0:break;\n"
 1457.      1                + "}\n"
 1458.      1            )
 1459.      1        ], [
 1460.      1            "v8CoverageReportCreate_low.js", (
 1461.      1                "switch(0){\n"
 1462.      1                + "case 1:break;\n"
 1463.      1                + "case 2:break;\n"
 1464.      1                + "case 3:break;\n"
 1465.      1                + "case 4:break;\n"
 1466.      1                + "}\n"
 1467.      1            )
 1468.      1        ], [
 1469.      1            "v8CoverageReportCreate_medium.js", (
 1470.      1                "switch(0){\n"
 1471.      1                + "case 0:break;\n"
 1472.      1                + "case 1:break;\n"
 1473.      1                + "case 2:break;\n"
 1474.      1                + "}\n"
 1475.      1            )
 1476.      1        ]
 1477.      4    ].forEach(function ([
 1478.      4        file, data
 1479.      4    ], ii) {
 1480.      4        jstestIt(file, async function () {
 1481.      4            let dir = ".tmp/coverage_" + ii + "/";
 1482.      4            file = dir + file;
 1483.      4            await fsWriteFileWithParents(file, data);
 1484.      4            await jslint.jslint_cli({
 1485.      4                console_error: noop, // comment to debug
 1486.      4                mode_cli: true,
 1487.      4                process_argv: [
 1488.      4                    "node", "jslint.mjs",
 1489.      4                    "v8_coverage_report=" + dir,
 1490.      4                    "node",
 1491.      4                    file
 1492.      4                ]
 1493.      4            });
 1494.      4        });
 1495.      4    });
 1496.      1    jstestIt((
 1497.      1        "test npm handling-behavior"
 1498.      1    ), async function () {
 1499.      1        await jslint.jslint_cli({
 1500.      1            console_error: noop, // comment to debug
 1501.      1            mode_cli: true,
 1502.      1            process_argv: [
 1503.      1                "node", "jslint.mjs",
 1504.      1                "v8_coverage_report=.tmp/coverage_npm",
 1505.      1                "npm", "--version"
 1506.      1            ]
 1507.      1        });
 1508.      1    });
 1509.      1    jstestIt((
 1510.      1        "test misc handling-behavior"
 1511.      1    ), async function () {
 1512.      1        await Promise.all([
 1513.      1            [
 1514.      1                ".tmp/coverage_misc/aa.js", "\n".repeat(0x100)
 1515.      1            ], [
 1516.      1                ".tmp/coverage_misc/coverage-0-0-0.json", JSON.stringify({
 1517.      1                    "result": [
 1518.      1                        {
 1519.      1                            "functions": [
 1520.      1                                {
 1521.      1                                    "functionName": "",
 1522.      1                                    "isBlockCoverage": true,
 1523.      1                                    "ranges": [
 1524.      1                                        {
 1525.      1                                            "count": 1,
 1526.      1                                            "endOffset": 0xf0,
 1527.      1                                            "startOffset": 0x10
 1528.      1                                        },
 1529.      1                                        {
 1530.      1                                            "count": 1,
 1531.      1                                            "endOffset": 0x40,
 1532.      1                                            "startOffset": 0x20
 1533.      1                                        },
 1534.      1                                        {
 1535.      1                                            "count": 1,
 1536.      1                                            "endOffset": 0x80,
 1537.      1                                            "startOffset": 0x60
 1538.      1                                        },
 1539.      1                                        {
 1540.      1                                            "count": 0,
 1541.      1                                            "endOffset": 0x45,
 1542.      1                                            "startOffset": 0x25
 1543.      1                                        },
 1544.      1                                        {
 1545.      1                                            "count": 0,
 1546.      1                                            "endOffset": 0x85,
 1547.      1                                            "startOffset": 0x65
 1548.      1                                        }
 1549.      1                                    ]
 1550.      1                                }
 1551.      1                            ],
 1552.      1                            "scriptId": "0",
 1553.      1                            "url": "file:///" + modulePath.resolve(
 1554.      1                                ".tmp/coverage_misc/aa.js"
 1555.      1                            )
 1556.      1                        }
 1557.      1                    ]
 1558.      1                }, undefined, 4)
 1559.      1            ]
 1560.      2        ].map(async function ([
 1561.      2            file, data
 1562.      2        ]) {
 1563.      2            await fsWriteFileWithParents(file, data);
 1564.      2        }));
 1565.      1        await jslint.jslint_cli({
 1566.      1            console_error: noop, // comment to debug
 1567.      1            mode_cli: true,
 1568.      1            process_argv: [
 1569.      1                "node", "jslint.mjs",
 1570.      1                "v8_coverage_report=.tmp/coverage_misc"
 1571.      1                // "node", ".tmp/coverage_misc/aa.js"
 1572.      1            ]
 1573.      1        });
 1574.      1    });
 1575.      1});
 1576.      1