// Copyright 2026 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"

#include <algorithm>
#include <atomic>
#include <chrono>
#include <cstdint>
#include <filesystem>
#include <fstream>
#include <memory>
#include <optional>
#include <ostream>
#include <sstream>
#include <string>
#include <string_view>
#include <thread>
#include <utility>
#include <vector>

#include "src/dawn/common/SystemUtils.h"
#include "src/dawn/node/napi_v8/napi_v8.h"
#include "src/dawn/node/standalone/EventLoop.h"
#include "src/dawn/node/standalone/FileBundle.h"
#include "src/dawn/node/standalone/Polyfills.h"
#include "src/dawn/node/test/TestZip.h"
#include "src/dawn/node/test/V8TestEnvironment.h"
#include "src/utils/gtest.h"

namespace {

// How long the clock tests sleep, and the bounds a reading taken across that sleep must fall
// within. The lower bound sits under the sleep to leave room for clock-source rounding; the upper
// is loose enough that only a wrong unit, rather than a loaded machine, can reach it.
constexpr std::chrono::milliseconds kSleepDuration{50};
constexpr double kMinElapsedMs = 40.0;
constexpr double kMaxElapsedMs = 5000.0;

// Redirects `stream` into a buffer for the lifetime of this object, so that tests can assert on
// the exact bytes a polyfill writes rather than merely that it did not crash.
class StreamCapture {
  public:
    explicit StreamCapture(std::ostream& stream) : stream_(stream) {
        original_ = stream_.rdbuf(buffer_.rdbuf());
    }

    ~StreamCapture() { stream_.rdbuf(original_); }

    StreamCapture(const StreamCapture&) = delete;
    StreamCapture& operator=(const StreamCapture&) = delete;

    std::string Str() const { return buffer_.str(); }

  private:
    std::ostringstream buffer_;
    std::ostream& stream_;
    std::streambuf* original_;
};

// A directory of its own for a test that needs real files, removed when the test ends. The name
// carries the test that asked for it, and a counter keeps two of them apart.
class TempDir {
  public:
    TempDir() {
        static std::atomic<uint32_t> counter{0};
        const ::testing::TestInfo* info = ::testing::UnitTest::GetInstance()->current_test_info();
        std::filesystem::path base = std::filesystem::temp_directory_path();
        for (uint32_t attempt = 0; attempt < kMaxAttempts; ++attempt) {
            std::filesystem::path candidate =
                base /
                ("dawn_polyfills_" + std::string(info->name()) + "_" + std::to_string(counter++));
            std::error_code ec;
            if (std::filesystem::create_directory(candidate, ec)) {
                path_ = candidate;
                return;
            }
        }
        ADD_FAILURE() << "no temporary directory could be created under " << base;
    }

    ~TempDir() {
        std::error_code ec;
        std::filesystem::remove_all(path_, ec);
    }

    TempDir(const TempDir&) = delete;
    TempDir& operator=(const TempDir&) = delete;

    // Paths handed to JavaScript use forward slashes throughout: Windows accepts them, and unlike
    // a backslash they do not start an escape sequence when pasted into a string literal.
    std::string JsPath() const { return path_.generic_string(); }

    // Creates a file in the directory and returns its path, for JavaScript.
    std::string WriteFile(const std::string& name, const std::string& contents) const {
        std::filesystem::path file = path_ / name;
        std::error_code ec;
        std::filesystem::create_directories(file.parent_path(), ec);
        std::ofstream out(file, std::ios::binary);
        out << contents;
        out.close();
        EXPECT_TRUE(out.good()) << "could not write " << file;
        return file.generic_string();
    }

  private:
    static constexpr uint32_t kMaxAttempts = 32;

    std::filesystem::path path_;
};

class PolyfillsTest : public dawn::node::test::V8IsolateTest {
  protected:
    PolyfillsTest() : V8IsolateTest(v8::MicrotasksPolicy::kExplicit) {}

    void SetUp() override {
        V8IsolateTest::SetUp();
        env_ = dawn::napi_v8::CreateEnv(isolate_, context(), dawn::node::test::V8Platform());
    }

    void TearDown() override {
        dawn::napi_v8::DestroyEnv(env_);
        V8IsolateTest::TearDown();
    }

    // The loop the timer polyfills schedule onto. A test drives it by hand with RunOneIteration()
    // rather than running it, so that nothing depends on how long anything takes.
    dawn::node::standalone::EventLoop& loop() { return dawn::napi_v8::GetEventLoop(env_); }

    napi_value RunScript(const std::string& code) {
        napi_value script_src;
        napi_value result;
        napi_status status =
            napi_create_string_utf8(env_, code.c_str(), code.length(), &script_src);
        EXPECT_EQ(status, napi_ok);
        status = napi_run_script(env_, script_src, &result);
        EXPECT_EQ(status, napi_ok);
        return result;
    }

    void RunScriptAllowingExit(const std::string& code) {
        napi_value script_src;
        napi_value result;
        ASSERT_EQ(napi_create_string_utf8(env_, code.c_str(), code.length(), &script_src), napi_ok);
        napi_run_script(env_, script_src, &result);
        isolate_->CancelTerminateExecution();
    }

    void RunMicrotasks() { isolate_->PerformMicrotaskCheckpoint(); }

    // Whether evaluating `expression` throws an Error. RunScript() expects the script itself to
    // succeed, so the throw has to be caught in JavaScript rather than escaping to the fixture.
    bool Throws(const std::string& expression) {
        return ToBool(RunScript("(function() { try { " + expression +
                                "; return false; } catch (e) { return e instanceof Error; } })()"));
    }

    std::string ToString(napi_value value) {
        size_t length = 0;
        EXPECT_EQ(napi_get_value_string_utf8(env_, value, nullptr, 0, &length), napi_ok);
        std::vector<char> buffer(length + 1);
        EXPECT_EQ(napi_get_value_string_utf8(env_, value, buffer.data(), buffer.size(), &length),
                  napi_ok);
        return std::string(buffer.data(), length);
    }

    bool ToBool(napi_value value) {
        bool result = false;
        EXPECT_EQ(napi_get_value_bool(env_, value, &result), napi_ok);
        return result;
    }

    uint32_t ToUint32(napi_value value) {
        uint32_t result = 0;
        EXPECT_EQ(napi_get_value_uint32(env_, value, &result), napi_ok);
        return result;
    }

    double ToDouble(napi_value value) {
        double result = 0.0;
        EXPECT_EQ(napi_get_value_double(env_, value, &result), napi_ok);
        return result;
    }

    // Writes a zip holding `entries` into `dir` and registers the polyfills with it as the bundle,
    // rooted at `root`, which defaults to the zip's own path.
    void RegisterWithBundle(const TempDir& dir,
                            const std::vector<dawn::node::test::ZipEntry>& entries,
                            std::string root = "") {
        const std::filesystem::path zip = std::filesystem::path(dir.JsPath()) / "cts.zip";
        ASSERT_TRUE(dawn::node::test::WriteZip(zip, entries));
        dawn::Result<std::unique_ptr<dawn::node::standalone::FileBundle>, std::string> bundle =
            dawn::node::standalone::FileBundle::OpenZip(zip.string());
        if (bundle.IsError()) {
            FAIL() << zip << ": " << *bundle.AcquireError();
        }
        bundle_ = bundle.AcquireSuccess();
        dawn::node::standalone::PolyfillOptions options;
        options.bundle = bundle_.get();
        options.bundle_root = root.empty() ? zip.generic_string() : root;
        dawn::node::standalone::RegisterPolyfills(env_, loop(), options);
    }

    napi_env env_ = nullptr;

  private:
    std::unique_ptr<dawn::node::standalone::FileBundle> bundle_;
};

TEST_F(PolyfillsTest, ConsoleGlobals) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(
        ToBool(RunScript("typeof console.log === 'function' && "
                         "typeof console.warn === 'function' && "
                         "typeof console.error === 'function' && "
                         "typeof console.info === 'function' && "
                         "typeof console.debug === 'function'")));
}

TEST_F(PolyfillsTest, ConsoleLogInfoAndDebugWriteLinesToStdout) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    StreamCapture out(std::cout);
    StreamCapture log(std::clog);
    StreamCapture err(std::cerr);
    RunScript("console.log('one'); console.info('two'); console.debug('three');");

    // All three are unprefixed stdout writes, one line each.
    EXPECT_EQ(out.Str(), "one\ntwo\nthree\n");
    EXPECT_EQ(log.Str(), "");
    EXPECT_EQ(err.Str(), "");
}

TEST_F(PolyfillsTest, ConsoleWarnAndErrorAreLabelled) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    StreamCapture out(std::cout);
    StreamCapture log(std::clog);
    StreamCapture err(std::cerr);
    RunScript("console.warn('careful'); console.error('broken');");

    EXPECT_EQ(out.Str(), "");
    EXPECT_EQ(log.Str(), "[WARN] careful\n");
    EXPECT_EQ(err.Str(), "[ERROR] broken\n");
}

TEST_F(PolyfillsTest, ConsoleJoinsArgumentsWithSpaces) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    StreamCapture out(std::cout);
    RunScript("console.log('a', 1, true, null, undefined, {}, [1, 2]);");
    RunScript("console.log();");

    EXPECT_EQ(out.Str(), "a 1 true null undefined [object Object] 1,2\n\n");
}

TEST_F(PolyfillsTest, FsExistsSync) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("present.txt", "x");

    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('" + file + "')")));
    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('" + dir.JsPath() + "')")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync('" + dir.JsPath() + "/absent.txt')")));

    // Anything that is not a path answers false rather than throwing.
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync(42)")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync()")));
}

TEST_F(PolyfillsTest, FsReadFileSyncDecodesWithAnEncoding) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("hello.txt", "Hello WebGPU\n");

    // The encoding may be given on its own or inside an options object.
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', 'utf8')")),
              "Hello WebGPU\n");
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', {encoding: 'utf8'})")),
              "Hello WebGPU\n");
    // All buffer encodings are case-insensitive.
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', 'UTF-8')")),
              "Hello WebGPU\n");
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', {encoding: 'Utf8'})")),
              "Hello WebGPU\n");
}

TEST_F(PolyfillsTest, FsReadFileSyncReturnsBytesWithoutAnEncoding) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    // Bytes that are neither printable nor valid UTF-8, so a decoded read could not reproduce
    // them.
    std::string file = dir.WriteFile("bytes.bin", std::string("\x01\x02\x00\xff", 4));

    EXPECT_TRUE(
        ToBool(RunScript("_fs_polyfill.readFileSync('" + file + "') instanceof Uint8Array")));
    EXPECT_EQ(
        ToString(RunScript("Array.from(_fs_polyfill.readFileSync('" + file + "')).join(',')")),
        "1,2,0,255");
}

TEST_F(PolyfillsTest, FsReadFileSyncThrowsForAMissingFile) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;

    EXPECT_TRUE(Throws("_fs_polyfill.readFileSync('" + dir.JsPath() + "/absent.txt')"));
}

TEST_F(PolyfillsTest, FsReadFileSyncPreservesNewlinesVerbatim) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("crlf.txt", "a\r\nb\n");

    // The file is read as bytes whether or not it is decoded, so a CR survives. Opening in text
    // mode on Windows would drop it and leave us disagreeing with Node.
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', 'utf8')")), "a\r\nb\n");
    EXPECT_EQ(
        ToString(RunScript("Array.from(_fs_polyfill.readFileSync('" + file + "')).join(',')")),
        "97,13,10,98,10");
}

TEST_F(PolyfillsTest, FsReadFileSyncHandlesAnEmptyFile) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("empty.txt", "");

    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', 'utf8')")), "");
    EXPECT_EQ(ToUint32(RunScript("_fs_polyfill.readFileSync('" + file + "').length")), 0u);
}

// An option the polyfill cannot honour has to be reported, not ignored: quietly returning
// something that does not match what was asked for is worse than failing.
TEST_F(PolyfillsTest, FsRejectsUnsupportedOptions) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("hello.txt", "Hello WebGPU");

    EXPECT_TRUE(Throws("_fs_polyfill.readFileSync('" + file + "', {flag: 'r'})"));
    EXPECT_TRUE(Throws("_fs_polyfill.readFileSync('" + file + "', 'latin1')"));
    EXPECT_TRUE(Throws("_fs_polyfill.readFileSync('" + file + "', 42)"));
    EXPECT_TRUE(Throws("_fs_polyfill.readdirSync('" + dir.JsPath() + "', {withFileTypes: true})"));
    EXPECT_TRUE(Throws("_fs_polyfill.statSync('" + file + "', {bigint: true})"));

    // An absent, undefined or null options argument is not an unsupported one.
    EXPECT_FALSE(Throws("_fs_polyfill.readFileSync('" + file + "')"));
    EXPECT_FALSE(Throws("_fs_polyfill.readFileSync('" + file + "', undefined)"));
    EXPECT_FALSE(Throws("_fs_polyfill.readFileSync('" + file + "', {encoding: null})"));
    EXPECT_FALSE(Throws("_fs_polyfill.readdirSync('" + dir.JsPath() + "', 'utf8')"));
}

// Node's readdirSync() answers with Buffers under the 'buffer' encoding, and its readFileSync()
// rejects that encoding outright. We reject it in both: there is no Buffer in this runtime, and
// handing back Uint8Arrays instead would break the first caller to call toString() on one.
TEST_F(PolyfillsTest, FsRejectsTheBufferEncoding) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("hello.txt", "Hello WebGPU");

    EXPECT_TRUE(Throws("_fs_polyfill.readdirSync('" + dir.JsPath() + "', 'buffer')"));
    EXPECT_TRUE(Throws("_fs_polyfill.readdirSync('" + dir.JsPath() + "', {encoding: 'buffer'})"));
    EXPECT_TRUE(Throws("_fs_polyfill.readFileSync('" + file + "', 'buffer')"));

    // Bytes are still reachable from readFileSync, just by omitting the encoding rather than by
    // naming one, which is what Node does too.
    EXPECT_TRUE(
        ToBool(RunScript("_fs_polyfill.readFileSync('" + file + "') instanceof Uint8Array")));
}

TEST_F(PolyfillsTest, FsRejectsUncPaths) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    // Node accepts UNC paths; this runtime deliberately refuses them, because Node and
    // std::filesystem disagree about where a UNC root ends. String.raw keeps the backslashes away
    // from JavaScript's escape rules so the path reaches the polyfill exactly as written.
    EXPECT_TRUE(Throws(R"(_fs_polyfill.readFileSync(String.raw`\\server\share\a`))"));
    EXPECT_TRUE(Throws(R"(_fs_polyfill.readdirSync(String.raw`\\server\share`))"));
    EXPECT_TRUE(Throws(R"(_fs_polyfill.statSync(String.raw`\\server\share\a`))"));

    // existsSync() answers false rather than throwing for arguments it cannot use, but a UNC path
    // is not a question about whether something exists, so it is refused rather than reported
    // absent.
    EXPECT_TRUE(Throws(R"(_fs_polyfill.existsSync(String.raw`\\server\share\a`))"));

    // The device forms share the prefix and go the same way.
    EXPECT_TRUE(Throws(R"(_fs_polyfill.existsSync(String.raw`\\?\C:\a`))"));
    EXPECT_TRUE(Throws(R"(_fs_polyfill.existsSync(String.raw`\\.\PhysicalDrive0`))"));
}

TEST_F(PolyfillsTest, FsAcceptsPathsThatMerelyResembleUnc) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("hello.txt", "Hello WebGPU");

    // It takes two leading separators to make a UNC path. One is not enough, and a backslash
    // anywhere else is just a character. None of these exist, but none of them are refused
    // either - the distinction being that a refusal throws.
    EXPECT_FALSE(ToBool(RunScript(R"(_fs_polyfill.existsSync(String.raw`\server\share`))")));
    EXPECT_FALSE(ToBool(RunScript(R"(_fs_polyfill.existsSync('a\\b'))")));

    // Where the two platforms part company. On Windows "//server/share" is UNC and refused; on
    // POSIX a leading "//" is a legal path that the path module already handles correctly, so it
    // is left alone.
#if defined(_WIN32)
    EXPECT_TRUE(Throws("_fs_polyfill.existsSync('//no/such/path')"));
#else
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync('//no/such/path')")));
#endif

    // And an ordinary path is untouched by any of this.
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', 'utf8')")),
              "Hello WebGPU");
}

TEST_F(PolyfillsTest, FsReaddirSync) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    dir.WriteFile("a.txt", "a");
    dir.WriteFile("b.txt", "b");

    // The entries are names, not paths, and the order is the filesystem's.
    EXPECT_EQ(
        ToString(RunScript("_fs_polyfill.readdirSync('" + dir.JsPath() + "').sort().join(',')")),
        "a.txt,b.txt");
}

TEST_F(PolyfillsTest, FsStatSync) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("file.txt", "x");

    EXPECT_TRUE(ToBool(RunScript("const f = _fs_polyfill.statSync('" + file +
                                 "'); f.isFile() && !f.isDirectory()")));
    EXPECT_TRUE(ToBool(RunScript("const d = _fs_polyfill.statSync('" + dir.JsPath() +
                                 "'); d.isDirectory() && !d.isFile()")));
}

TEST_F(PolyfillsTest, FsReadFileCallbackRunsAsynchronously) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("hello.txt", "Hello WebGPU");

    RunScript(
        "globalThis.error = 'unset'; globalThis.data = 'unset';"
        "_fs_polyfill.readFile('" +
        file + "', 'utf8', (err, data) => { globalThis.error = err; globalThis.data = data; });");

    // Nothing has happened yet: that the callback waits for the microtask checkpoint is what
    // makes this the asynchronous form.
    EXPECT_EQ(ToString(RunScript("globalThis.data")), "unset");

    RunMicrotasks();
    EXPECT_TRUE(ToBool(RunScript("globalThis.error === null")));
    EXPECT_EQ(ToString(RunScript("globalThis.data")), "Hello WebGPU");
}

TEST_F(PolyfillsTest, FsReadFileCallbackReportsFailure) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;

    // With the encoding omitted the callback takes the second argument position.
    RunScript(
        "globalThis.error = 'unset';"
        "_fs_polyfill.readFile('" +
        dir.JsPath() + "/absent.txt', (err) => { globalThis.error = err; });");

    RunMicrotasks();
    EXPECT_TRUE(ToBool(RunScript("globalThis.error instanceof Error")));
}

TEST_F(PolyfillsTest, FsPromisesResolve) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string file = dir.WriteFile("hello.txt", "Hello WebGPU");

    RunScript(
        "globalThis.data = 'unset';"
        "_fs_polyfill.promises.readFile('" +
        file + "', 'utf8').then((d) => { globalThis.data = d; });");
    EXPECT_EQ(ToString(RunScript("globalThis.data")), "unset");

    RunMicrotasks();
    EXPECT_EQ(ToString(RunScript("globalThis.data")), "Hello WebGPU");

    RunScript(
        "globalThis.entries = 'unset';"
        "_fs_polyfill.promises.readdir('" +
        dir.JsPath() + "').then((e) => { globalThis.entries = e.join(','); });");
    RunMicrotasks();
    EXPECT_EQ(ToString(RunScript("globalThis.entries")), "hello.txt");

    RunScript(
        "globalThis.isFile = 'unset';"
        "_fs_polyfill.promises.stat('" +
        file + "').then((s) => { globalThis.isFile = s.isFile(); });");
    RunMicrotasks();
    EXPECT_TRUE(ToBool(RunScript("globalThis.isFile")));
}

TEST_F(PolyfillsTest, FsPromisesRejectWhenTheSyncCallThrows) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;

    RunScript(
        "globalThis.reason = 'unset';"
        "_fs_polyfill.promises.stat('" +
        dir.JsPath() + "/absent').catch((e) => { globalThis.reason = e; });");

    RunMicrotasks();
    EXPECT_TRUE(ToBool(RunScript("globalThis.reason instanceof Error")));
}

// The path module answers in the host's separator, so the expectations below are written in their
// POSIX spelling and translated. dirname() is the exception: Node slices its answer out of the
// input, so whatever separator was written comes back unchanged.
std::string Native(std::string_view posix) {
    std::string native(posix);
#if defined(_WIN32)
    std::replace(native.begin(), native.end(), '/', '\\');
#endif
    return native;
}

// A rooted path that names no drive is resolved against the drive of the working directory, as it
// is in Node, so an absolute expectation has to carry that drive on Windows.
std::string RootedNative(std::string_view posix) {
    return std::filesystem::current_path().root_name().string() + Native(posix);
}

TEST_F(PolyfillsTest, PathNormalize) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('/a/b/../c/./d')")), Native("/a/c/d"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('a//b')")), Native("a/b"));

    // A trailing slash says the path names a directory, so it is kept.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('a//b/')")), Native("a/b/"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('/a/b/')")), Native("/a/b/"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('./')")), Native("./"));

    // The input is what decides that, and only the input: lexically_normal() invents a trailing
    // separator of its own whenever the last component was a dot segment, and it has to be
    // discarded. Without that, the first of these answers 'a/'.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('a/b/..')")), Native("a"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('a/b/../')")), Native("a/"));

    // A '..' that cannot be cancelled is kept in a relative path but dropped at the root.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('../../a')")), Native("../../a"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('/..')")), Native("/"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('')")), ".");

#if !defined(_WIN32)
    // A leading run of separators collapses to one. std::filesystem keeps it, because POSIX
    // reserves "//" for the implementation. POSIX-only: on Windows this shape is UNC.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('//a/b')")), "/a/b");
#endif
}

TEST_F(PolyfillsTest, PathJoin) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('a', 'b', 'c')")), Native("a/b/c"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('/a', 'b/', '../c')")), Native("/a/c"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('a', '', 'b')")), Native("a/b"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('')")), ".");

    // join() concatenates unconditionally, where operator/ would let a rooted argument discard
    // everything before it and answer '/b'.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('/a', '/b')")), Native("/a/b"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('/', 'a')")), Native("/a"));

    // join() normalizes, so the trailing slash of the last argument survives, and a '..' argument
    // does not leave one behind.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('a', 'b/')")), Native("a/b/"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('a', 'b', '..')")), Native("a"));
}

TEST_F(PolyfillsTest, PathDirname) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    // The answer is a slice of the argument, so it comes back in the separator it was written in
    // on either platform.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('/a/b/c.js')")), "/a/b");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('/a')")), "/");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('a.js')")), ".");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('')")), ".");

    // Unlike normalize(), dirname() ignores a trailing slash rather than reading it as a segment
    // boundary, so these name the parent of b, not b itself.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('/a/b/')")), "/a");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('a/')")), ".");

    // And it does not normalize what it keeps, which is why it cannot be parent_path(): that
    // would answer '/a'.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('/a//b')")), "/a/");

#if !defined(_WIN32)
    // Nothing but separators names the root, and a leading "//" is kept whole. POSIX-only: on
    // Windows two leading separators are UNC, which is refused rather than answered.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('///')")), "/");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('//a')")), "//");
#endif
}

TEST_F(PolyfillsTest, PathResolve) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('/a/b', 'c')")), RootedNative("/a/b/c"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('/a/b', '../c')")), RootedNative("/a/c"));

    // An absolute argument discards everything to its left, and a call with no absolute argument
    // at all is taken relative to the working directory.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('/a/b', '/c')")), RootedNative("/c"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('a')")),
              (std::filesystem::current_path() / "a").string());

    // Unlike normalize(), resolve() never answers with a trailing separator, whether the argument
    // carried one or lexically_normal() invented one.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('/a/b/')")), RootedNative("/a/b"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('/a/b/..')")), RootedNative("/a"));

    // An empty argument is skipped rather than read as '.', and a call with nothing left is the
    // working directory. std::filesystem::absolute('') fails outright.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('/a', '')")), RootedNative("/a"));
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('')")),
              std::filesystem::current_path().string());
}

TEST_F(PolyfillsTest, PathRelative) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('/a/b', '/a/b/c/d')")), Native("c/d"));

    // Identical paths are "" and not ".", which is what lexically_relative() answers.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('/a/b', '/a/b')")), "");

    // Leaving the common prefix behind takes one '..' per remaining segment of `from`.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('/a/b/c', '/a/d')")), Native("../../d"));

    // A zero-length side means the working directory, because resolve() is what defines both ends.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('', 'a')")), "a");
}

TEST_F(PolyfillsTest, PathRejectsUncPaths) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    // The same refusal the fs entry points make, for the same reason: Node and std::filesystem
    // disagree about where a UNC root ends. Any argument can carry the prefix, not just the first.
    EXPECT_TRUE(Throws(R"(_path_polyfill.normalize(String.raw`\\server\share\a`))"));
    EXPECT_TRUE(Throws(R"(_path_polyfill.dirname(String.raw`\\server\share\a`))"));
    EXPECT_TRUE(Throws(R"(_path_polyfill.join('a', String.raw`\\server\share`))"));
    EXPECT_TRUE(Throws(R"(_path_polyfill.resolve(String.raw`\\server\share`))"));
    EXPECT_TRUE(Throws(R"(_path_polyfill.relative('a', String.raw`\\?\C:\a`))"));
}

#if defined(_WIN32)
// The shapes that have no POSIX spelling to translate. Every expectation here is what
// path.win32 answers.
TEST_F(PolyfillsTest, PathDriveLetters) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    // A drive with no root directory names the working directory on that drive, and Node spells
    // the implied here-ness out rather than leaving the bare drive.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('C:')")), "C:.");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('C:.')")), "C:.");

    // Either separator is accepted on the way in; the preferred one comes back out.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('C:/a/b/')")), "C:\\a\\b\\");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.normalize('C:/a/b/..')")), "C:\\a");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.join('C:/a', 'b/')")), "C:\\a\\b\\");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('C:/a', 'b')")), "C:\\a\\b");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('C:/a/b', 'C:/a/c')")), "..\\c");

    // Except from dirname(), which slices the argument and so keeps what was written. The drive
    // is the root here, and is never cut into.
    EXPECT_EQ(ToString(RunScript(R"(_path_polyfill.dirname(String.raw`C:\a\b`))")), "C:\\a");
    EXPECT_EQ(ToString(RunScript("_path_polyfill.dirname('C:/a//b')")), "C:/a/");
    EXPECT_EQ(ToString(RunScript(R"(_path_polyfill.dirname(String.raw`C:\a`))")), "C:\\");

    // Two drives are unrelated, so there is no path from one to the other and the answer is just
    // the destination. lexically_relative() says "" for that, which would read as "the same
    // place". Purely lexical, so the drives need not exist.
    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('C:/a', 'D:/b')")), "D:\\b");
}
#endif

TEST_F(PolyfillsTest, PathRejectsArgumentsThatAreNotStrings) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(Throws("_path_polyfill.normalize()"));
    EXPECT_TRUE(Throws("_path_polyfill.normalize(5)"));
    EXPECT_TRUE(Throws("_path_polyfill.join('a', null)"));
    EXPECT_TRUE(Throws("_path_polyfill.relative('a')"));
}

TEST_F(PolyfillsTest, PathSep) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("_path_polyfill.sep")), Native("/"));
}

TEST_F(PolyfillsTest, ProcessArgvAndCwd) {
    dawn::node::standalone::PolyfillOptions options;
    options.argv = {"runner", "arg1", "arg2"};
    dawn::node::standalone::RegisterPolyfills(env_, loop(), options);

    EXPECT_EQ(ToUint32(RunScript("process.argv.length")), 3u);
    EXPECT_EQ(ToString(RunScript("process.argv.join(',')")), "runner,arg1,arg2");

    // cwd() must report the real working directory, not merely something of type string.
    EXPECT_EQ(ToString(RunScript("process.cwd()")), std::filesystem::current_path().string());
}

TEST_F(PolyfillsTest, BundleIsTheWorkingDirectory) {
    TempDir dir;
    RegisterWithBundle(dir, {{"out-node/a.js", "x"}});
    const std::string root =
        (std::filesystem::path(dir.JsPath()) / "cts.zip").lexically_normal().string();

    // process.cwd() names the zip, and relative paths resolve into it.
    EXPECT_EQ(ToString(RunScript("process.cwd()")), root);
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('out-node/a.js')")),
              (std::filesystem::path(root) / "out-node" / "a.js").string());
    EXPECT_EQ(ToString(RunScript("_path_polyfill.resolve('')")), root);
    EXPECT_EQ(ToString(RunScript("_path_polyfill.relative('out-node', 'out-node/a.js')")), "a.js");
}

TEST_F(PolyfillsTest, FsReadsTheBundleThroughRelativeAndAbsolutePaths) {
    TempDir dir;
    const std::string bytes("\x00\x01\xff\r\n", 5);
    RegisterWithBundle(dir, {{"dir/text.txt", "Hello zip\n"}, {"dir/bytes.bin", bytes}});

    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('dir/text.txt', 'utf8')")),
              "Hello zip\n");
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('./dir/../dir/text.txt', 'utf8')")),
              "Hello zip\n");
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + dir.JsPath() +
                                 "/cts.zip/dir/text.txt', 'utf8')")),
              "Hello zip\n");
    // Without an encoding the bytes come back as a Uint8Array.
    EXPECT_EQ(
        ToString(RunScript("Array.from(_fs_polyfill.readFileSync('dir/bytes.bin')).join(',')")),
        "0,1,255,13,10");
}

TEST_F(PolyfillsTest, FsUnderTheBundleRootIsServedByTheBundleAlone) {
    // The root is a real directory with a real file in it that the zip does not hold, so a lookup
    // that reached the disk would find it.
    TempDir dir;
    dir.WriteFile("real.txt", "on disk");
    RegisterWithBundle(dir, {{"zipped.txt", "in zip"}}, dir.JsPath());

    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('zipped.txt')")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync('real.txt')")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync('" + dir.JsPath() + "/real.txt')")));
    EXPECT_TRUE(Throws("_fs_polyfill.readFileSync('real.txt', 'utf8')"));
    EXPECT_TRUE(Throws("_fs_polyfill.statSync('real.txt')"));
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readdirSync('.').join(',')")), "zipped.txt");
}

TEST_F(PolyfillsTest, FsExistsReaddirAndStatOnTheBundle) {
    TempDir dir;
    RegisterWithBundle(dir, {{"a/b/c.txt", "c"}, {"a/d.txt", "d"}});

    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('a/b/c.txt')")));
    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('a/b')")));
    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('a/b/')")));
    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('.')")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync('a/b/missing.txt')")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.existsSync('')")));

    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readdirSync('a').join(',')")), "b,d.txt");
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readdirSync('a/b/..').join(',')")), "b,d.txt");
    EXPECT_TRUE(Throws("_fs_polyfill.readdirSync('a/d.txt')"));
    EXPECT_TRUE(Throws("_fs_polyfill.readdirSync('nope')"));
    EXPECT_TRUE(Throws("_fs_polyfill.readdirSync('')"));

    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.statSync('a/d.txt').isFile()")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.statSync('a/d.txt').isDirectory()")));
    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.statSync('a/b').isDirectory()")));
    EXPECT_FALSE(ToBool(RunScript("_fs_polyfill.statSync('a/b').isFile()")));
    EXPECT_TRUE(Throws("_fs_polyfill.statSync('a/nope')"));
}

TEST_F(PolyfillsTest, FsOutsideTheBundleRootReadsTheDisk) {
    TempDir zip_dir;
    TempDir disk_dir;
    const std::string file = disk_dir.WriteFile("disk.txt", "on disk");
    RegisterWithBundle(zip_dir, {{"zipped.txt", "in zip"}});

    EXPECT_TRUE(ToBool(RunScript("_fs_polyfill.existsSync('" + file + "')")));
    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('" + file + "', 'utf8')")), "on disk");
    EXPECT_TRUE(
        ToBool(RunScript("_fs_polyfill.statSync('" + disk_dir.JsPath() + "').isDirectory()")));
    EXPECT_EQ(
        ToString(RunScript("_fs_polyfill.readdirSync('" + disk_dir.JsPath() + "').join(',')")),
        "disk.txt");
}

TEST_F(PolyfillsTest, FsRelativePathLeavingTheBundleReadsTheDiskBesideIt) {
    TempDir dir;
    dir.WriteFile("beside.txt", "beside the zip");
    RegisterWithBundle(dir, {{"zipped.txt", "in zip"}});

    EXPECT_EQ(ToString(RunScript("_fs_polyfill.readFileSync('../beside.txt', 'utf8')")),
              "beside the zip");
}

TEST_F(PolyfillsTest, RequireLoadsModulesFromTheBundle) {
    TempDir dir;
    RegisterWithBundle(dir, {{"lib/leaf.js", "exports.dir = __dirname;"},
                             {"lib/main.js", "module.exports = require('./leaf.js');"}});

    // A specifier relative to the working directory, then one relative to the requiring module,
    // both inside the zip.
    RunScript("globalThis.leaf = require('./lib/main.js');");
    EXPECT_EQ(
        ToString(RunScript("globalThis.leaf.dir")),
        (std::filesystem::path(dir.JsPath()) / "cts.zip" / "lib").lexically_normal().string());
    EXPECT_TRUE(Throws("require('./lib/missing.js')"));
}

TEST_F(PolyfillsTest, ProcessArgvIsEmptyByDefault) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(ToBool(RunScript("Array.isArray(process.argv)")));
    EXPECT_EQ(ToUint32(RunScript("process.argv.length")), 0u);
}

TEST_F(PolyfillsTest, ProcessEnvExposesDawnFlags) {
    dawn::ScopedEnvironmentVar dawn_flags("DAWN_FLAGS", "--a-flag");
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("process.env.DAWN_FLAGS")), "--a-flag");
}

TEST_F(PolyfillsTest, ProcessEnvIsEmptyWithoutDawnFlags) {
    dawn::ScopedEnvironmentVar dawn_flags("DAWN_FLAGS", nullptr);
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    // `process.env` is not the real environment: only the variables the runner reads are copied
    // into it, so with DAWN_FLAGS unset it is empty.
    EXPECT_EQ(ToUint32(RunScript("Object.keys(process.env).length")), 0u);
}

TEST_F(PolyfillsTest, ProcessExitStopsTheLoop) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScriptAllowingExit("process.exit(42)");
    EXPECT_TRUE(loop().stopped());
    EXPECT_EQ(loop().exit_code(), 42);
}

TEST_F(PolyfillsTest, ProcessExitDefaultsToZero) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScriptAllowingExit("process.exit()");
    EXPECT_TRUE(loop().stopped());
    EXPECT_EQ(loop().exit_code(), 0);
}

TEST_F(PolyfillsTest, ProcessExitWithACodeThatIsNotANumberExitsWithZero) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScriptAllowingExit("process.exit('not a number')");
    EXPECT_TRUE(loop().stopped());
    EXPECT_EQ(loop().exit_code(), 0);
}

using PolyfillsDeathTest = PolyfillsTest;

TEST_F(PolyfillsDeathTest, ProcessAbortKillsTheProcess) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    DAWN_EXPECT_DEATH_IF_SUPPORTED(RunScript("process.abort()"), "");
}

TEST_F(PolyfillsTest, ProcessStreamWritesAreVerbatim) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    StreamCapture out(std::cout);
    StreamCapture log(std::clog);
    RunScript("process.stdout.write('no'); process.stdout.write(' newline');");
    RunScript("process.stderr.write('unlabelled');");

    // Unlike console.log(), write() adds neither a newline nor a prefix.
    EXPECT_EQ(out.Str(), "no newline");
    EXPECT_EQ(log.Str(), "unlabelled");
}

TEST_F(PolyfillsTest, ProcessStreamWriteReturnsTrue) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    StreamCapture out(std::cout);
    StreamCapture log(std::clog);

    // write() reports whether the caller may write again immediately, rather than waiting for a
    // 'drain' event.
    EXPECT_TRUE(ToBool(RunScript("process.stdout.write('x')")));
    EXPECT_TRUE(ToBool(RunScript("process.stderr.write('x')")));
}

// process.exit() must not return to JavaScript: once it is called, no further JavaScript runs,
// JavaScript cannot catch the unwind, and a later exit() cannot overwrite the exit code.
TEST_F(PolyfillsTest, ProcessExitDoesNotReturnToJavaScript) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript("globalThis._log = []; globalThis._record = (s) => { globalThis._log.push(s); };");
    RunScriptAllowingExit(R"(
        try {
            process.exit(3);
            _record('after-exit');
        } catch (e) {
            _record('caught');
        } finally {
            _record('finally');
        }
        _record('after-try');
        process.exit(0);
    )");

    // The second exit() was never reached, so the first exit code stands, and nothing after the
    // exit() ran - not even the `finally` block, which JavaScript would otherwise always run.
    EXPECT_TRUE(loop().stopped());
    EXPECT_EQ(loop().exit_code(), 3);
    EXPECT_EQ(ToString(RunScript("globalThis._log.join(',')")), "");
}

TEST_F(PolyfillsTest, ProcessExitFromMicrotaskDoesNotReturnToJavaScript) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._log = [];
        globalThis._record = (s) => { globalThis._log.push(s); };
        Promise.resolve().then(() => {
            process.exit(3);
            _record('after-exit');
        });
        Promise.resolve().then(() => { _record('later-microtask'); });
    )");

    RunMicrotasks();
    isolate_->CancelTerminateExecution();

    // Neither the rest of the microtask that exited nor the microtask queued behind it ran.
    EXPECT_TRUE(loop().stopped());
    EXPECT_EQ(loop().exit_code(), 3);
    EXPECT_EQ(ToString(RunScript("globalThis._log.join(',')")), "");
}

TEST_F(PolyfillsTest, EventGlobals) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(
        ToBool(RunScript("typeof EventTarget === 'function' && "
                         "typeof Event === 'function' && "
                         "typeof CustomEvent === 'function' && "
                         "typeof MessageEvent === 'function' && "
                         "typeof DOMException === 'function'")));

    // EventTarget dispatches to both function listeners and { handleEvent } object listeners.
    EXPECT_EQ(ToString(RunScript(R"(
        const target = new EventTarget();
        const log = [];
        target.addEventListener('test', function(e) {
            log.push('fn:' + (this === target) + ':' + e.type);
        });
        target.addEventListener('test', {
            tag: 'obj',
            handleEvent(e) {
                log.push(this.tag + ':' + e.type);
            },
        });
        target.dispatchEvent(new Event('test'));
        log.join(',')
    )")),
              "fn:true:test,obj:test");
}

TEST_F(PolyfillsTest, DOMException) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript(R"(
        const named = new DOMException('bad state', 'InvalidStateError');
        const unnamed = new DOMException('failed');
        [
            named instanceof DOMException,
            named instanceof Error,
            named.name,
            named.message,
            unnamed.name,
        ].join(',')
    )")),
              "true,true,InvalidStateError,bad state,Error");
}

TEST_F(PolyfillsTest, EventCancellation) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._target = new EventTarget();
        globalThis._target.addEventListener('err', (e) => { e.preventDefault(); });
        globalThis._target.addEventListener('ok', () => {});
    )");

    // A cancelable event is cancelled when preventDefault() is called.
    napi_value res = RunScript(R"(
        const cancelable = new Event('err', { cancelable: true });
        [globalThis._target.dispatchEvent(cancelable), cancelable.defaultPrevented].join(',')
    )");
    EXPECT_EQ(ToString(res), "false,true");

    // An event that is not cancelable ignores preventDefault().
    res = RunScript(R"(
        const plain = new Event('err');
        [globalThis._target.dispatchEvent(plain), plain.defaultPrevented].join(',')
    )");
    EXPECT_EQ(ToString(res), "true,false");

    // A cancelable event where preventDefault() is not called remains uncancelled.
    res = RunScript(R"(
        const uncancelled = new Event('ok', { cancelable: true });
        [globalThis._target.dispatchEvent(uncancelled), uncancelled.defaultPrevented].join(',')
    )");
    EXPECT_EQ(ToString(res), "true,false");
}

TEST_F(PolyfillsTest, EventListenerOnce) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    napi_value res = RunScript(R"(
        const target = new EventTarget();
        let once = 0;
        let always = 0;
        target.addEventListener('x', () => { once++; }, { once: true });
        target.addEventListener('x', () => { always++; });
        target.dispatchEvent(new Event('x'));
        target.dispatchEvent(new Event('x'));
        [once, always].join(',')
    )");
    EXPECT_EQ(ToString(res), "1,2");
}

TEST_F(PolyfillsTest, EventTargetDeduplicatesByTypeAndCapture) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    napi_value res = RunScript(R"(
        const target = new EventTarget();
        const log = [];
        const fn = () => { log.push('fn'); };
        const other = () => { log.push('other'); };
        target.addEventListener('x', fn);
        target.addEventListener('x', other);
        target.addEventListener('x', fn);
        target.addEventListener('x', fn, false);
        target.addEventListener('x', fn, { capture: false });
        target.addEventListener('x', fn, true);
        target.addEventListener('x', fn, { capture: true });
        target.dispatchEvent(new Event('x'));
        const afterBoth = log.join(',');

        log.length = 0;
        target.removeEventListener('x', fn, false);
        target.dispatchEvent(new Event('x'));
        const afterRemoveBubble = log.join(',');

        log.length = 0;
        target.removeEventListener('x', fn, { capture: true });
        target.dispatchEvent(new Event('x'));
        const afterRemoveCapture = log.join(',');

        [afterBoth, afterRemoveBubble, afterRemoveCapture].join(' | ')
    )");
    EXPECT_EQ(ToString(res), "fn,other,fn | other,fn | other");
}

TEST_F(PolyfillsTest, CustomEvent) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    napi_value res = RunScript(R"(
        const target = new EventTarget();
        let seen = null;
        target.addEventListener('bar', (e) => { seen = e; }, { once: true });
        target.dispatchEvent(new CustomEvent('bar'));
        [seen instanceof CustomEvent, seen instanceof Event, seen.type].join(',')
    )");
    EXPECT_EQ(ToString(res), "true,true,bar");
}

TEST_F(PolyfillsTest, MessageEvent) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    napi_value res = RunScript(R"(
        const withData = new MessageEvent('import', { data: { url: 'a.spec.js' } });
        const withoutData = new MessageEvent('finish');
        [
            withData instanceof MessageEvent,
            withData instanceof Event,
            withData.type,
            withData.data.url,
            withoutData.data === undefined,
        ].join(',')
    )");
    EXPECT_EQ(ToString(res), "true,true,import,a.spec.js,true");
}

TEST_F(PolyfillsTest, ProcessVersions) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    napi_value res = RunScript(
        "String(typeof process.versions === 'object' && "
        "typeof process.versions.node === 'string' && process.versions.node.length > 0)");
    EXPECT_EQ(ToString(res), "true");
}

TEST_F(PolyfillsTest, TextEncoder) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    // Non-ASCII input covers all of the UTF-8 sequence lengths: two bytes for e-acute, three for
    // the arrow and four for the surrogate pair.
    napi_value res = RunScript(R"(
        const bytes = new TextEncoder().encode('h\u00e9llo \u2192 \ud83c\udf0d');
        Array.from(bytes).join(' ')
    )");
    EXPECT_EQ(ToString(res), "104 195 169 108 108 111 32 226 134 146 32 240 159 140 141");

    // Undefined input encodes to an empty Uint8Array, and an unpaired surrogate is replaced with
    // U+FFFD (EF BF BD) rather than throwing.
    res = RunScript(R"(
        [new TextEncoder().encode().length,
         Array.from(new TextEncoder().encode('\ud800')).join(' ')].join(',')
    )");
    EXPECT_EQ(ToString(res), "0,239 191 189");
}

TEST_F(PolyfillsTest, RequireBuiltins) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    napi_value res = RunScript(R"(
        globalThis._webgpu_module = { marker: 'wgpu' };
        [
            require('fs') === globalThis._fs_polyfill,
            require('node:fs') === globalThis._fs_polyfill,
            require('path') === globalThis._path_polyfill,
            require('node:path') === globalThis._path_polyfill,
            require('process') === globalThis.process,
            require('node:process') === globalThis.process,
            require('perf_hooks').performance === globalThis.performance,
            require('node:perf_hooks').performance === globalThis.performance,
            require('./dawn.node').marker,
            require('/any/dir/dawn.node').marker,
        ].join(',')
    )");
    EXPECT_EQ(ToString(res), "true,true,true,true,true,true,true,true,wgpu,wgpu");
}

TEST_F(PolyfillsTest, RequireModules) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    // `sub/leaf.cjs` records the `__dirname` and `__filename` arguments passed to its module
    // wrapper function so we can verify relative resolution from `sub/main.js`. Backslashes are
    // normalized to '/' so the suffix check holds on Windows too.
    dir.WriteFile("sub/leaf.cjs", R"(
        exports.dir = __dirname.replace(/\\/g, '/');
        exports.file = __filename.replace(/\\/g, '/');
    )");
    // `sub/main.js` increments a global counter each time its body executes and re-exports `leaf`.
    std::string main_mod = dir.WriteFile("sub/main.js", R"(
        globalThis.loadCount = (globalThis.loadCount || 0) + 1;
        module.exports = require('./leaf.cjs');
    )");

    // Require `sub/main.js` twice: the first call executes `main.js` and `leaf.cjs`, and the second
    // call must return the cached `exports` object without executing `main.js` a second time.
    RunScript("globalThis.first = require('" + main_mod + "'); globalThis.second = require('" +
              main_mod + "');");

    EXPECT_TRUE(ToBool(RunScript("globalThis.first.dir.endsWith('/sub')")));
    EXPECT_TRUE(ToBool(RunScript("globalThis.first.file.endsWith('/sub/leaf.cjs')")));
    EXPECT_TRUE(ToBool(RunScript("globalThis.first === globalThis.second")));
    EXPECT_EQ(ToUint32(RunScript("globalThis.loadCount")), 1u);
}

// `LoadModule` inserts the module into `module_cache` before running its body so a circular
// `require()` receives the in-progress `exports` object instead of recursing infinitely.
TEST_F(PolyfillsTest, RequireCircularDependency) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    // 1. `cycle_a.js` sets `exports.stage = 'a-init'`, then pauses to require `cycle_b.js`.
    // 2. `cycle_b.js` requires `cycle_a.js` while `cycle_a.js` is still running, so `cycle_b.js`
    //    observes the in-progress `a.stage` value ('a-init').
    // 3. `cycle_a.js` resumes and overwrites `exports.stage = 'a-done'`.
    std::string cycle_a = dir.WriteFile("cycle_a.js", R"(
        exports.stage = 'a-init';
        const b = require('./cycle_b.js');
        exports.seenByB = b.fromA;
        exports.stage = 'a-done';
    )");
    dir.WriteFile("cycle_b.js", R"(
        const a = require('./cycle_a.js');
        exports.fromA = a.stage;
    )");

    RunScript("globalThis.cycle = require('" + cycle_a + "');");
    EXPECT_EQ(ToString(RunScript("globalThis.cycle.seenByB")), "a-init");
    EXPECT_EQ(ToString(RunScript("globalThis.cycle.stage")), "a-done");
}

TEST_F(PolyfillsTest, RequireRejectsInvalidAndBareSpecifiers) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    dir.WriteFile("hello/t.txt", "module.exports = 'should not load';");

    EXPECT_TRUE(Throws("require()"));
    EXPECT_TRUE(Throws("require(42)"));
    EXPECT_TRUE(Throws("require('ansi-colors')"));
    EXPECT_TRUE(Throws("require('hello/t.txt')"));
    EXPECT_TRUE(Throws(R"(require(String.raw`\\server\share\a.js`))"));
    EXPECT_TRUE(Throws("require('" + dir.JsPath() + "/absent.js')"));
}

// `LoadModule` caches a module's `exports` object before compiling and running its body (to
// support circular dependencies). If compilation or execution fails, that entry must be erased from
// `module_cache`; otherwise a second `require()` of the same path would hit the cache and return
// the half-initialized `exports` object without throwing.
TEST_F(PolyfillsTest, RequireDoesNotCacheFailedModules) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string bad_syntax = dir.WriteFile("bad_syntax.js", "const = ;");
    std::string runtime_throw = dir.WriteFile("runtime_throw.js", R"(
        exports.partial = true;
        throw new Error('init failed');
    )");

    // First call fails to compile; second call verifies the failed module was not left in the
    // cache.
    EXPECT_TRUE(Throws("require('" + bad_syntax + "')"));
    EXPECT_TRUE(Throws("require('" + bad_syntax + "')"));

    // First call throws mid-execution after mutating `exports.partial`; second call verifies the
    // partial `exports` object was evicted from the cache and throws again.
    EXPECT_TRUE(Throws("require('" + runtime_throw + "')"));
    EXPECT_TRUE(Throws("require('" + runtime_throw + "')"));
}

// require() compiles modules with v8::ScriptCompiler::CompileFunction() so stack traces preserve
// the source file's 1-based line and column numbers.
TEST_F(PolyfillsTest, RequireStackTraceLineAndColumn) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    TempDir dir;
    std::string thrower = dir.WriteFile("thrower.js", "\n\n  throw new Error('boom');");
    std::string first = dir.WriteFile("first.js", "throw new Error('boom');");

    napi_value res = RunScript(
        "let thrown = 'no throw';"
        "try { require('" +
        thrower +
        "'); } catch (e) { thrown = e.stack.match(/thrower\\.js:[0-9]+:[0-9]+/)[0]; }"
        "thrown");
    EXPECT_EQ(ToString(res), "thrower.js:3:9");

    res = RunScript(
        "let firstThrown = 'no throw';"
        "try { require('" +
        first +
        "'); } catch (e) { firstThrown = e.stack.match(/first\\.js:[0-9]+:[0-9]+/)[0]; }"
        "firstThrown");
    EXPECT_EQ(ToString(res), "first.js:1:7");
}

TEST_F(PolyfillsTest, PerformanceNow) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("typeof performance.now()")), "number");

    double now = ToDouble(RunScript("performance.now()"));
    EXPECT_GE(now, 0.0);
    // now() counts from registration, so a test that has only just started cannot be minutes in.
    // A clock returning, say, milliseconds since the epoch would fail here.
    EXPECT_LT(now, 60000.0);
}

// These only establish that the clock never runs backwards. Sampling in a loop cannot show that
// it runs forwards at all, because performance.now() reports whole and fractional milliseconds
// and a thousand calls can finish inside one of them; PerformanceNowAdvances covers that.
TEST_F(PolyfillsTest, PerformanceNowIsMonotonic) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(ToBool(RunScript(R"((function() {
        let last = performance.now();
        for (let i = 0; i < 1000; ++i) {
            const next = performance.now();
            if (next < last) {
                return false;
            }
            last = next;
        }
        return true;
    })())")));
}

TEST_F(PolyfillsTest, PerformanceNowAdvances) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    double before = ToDouble(RunScript("performance.now()"));
    std::this_thread::sleep_for(kSleepDuration);
    double elapsed_ms = ToDouble(RunScript("performance.now()")) - before;

    // sleep_for() blocks for at least the duration asked of it, so the clock really has moved.
    // Bounding the reading from above as well as below also pins the unit: a clock reporting
    // seconds would read 0.05 here, and one reporting microseconds 50000.
    EXPECT_GE(elapsed_ms, kMinElapsedMs);
    EXPECT_LT(elapsed_ms, kMaxElapsedMs);
}

TEST_F(PolyfillsTest, HrtimeBigintIsMonotonic) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_EQ(ToString(RunScript("typeof process.hrtime.bigint()")), "bigint");

    EXPECT_TRUE(ToBool(RunScript(R"((function() {
        let last = process.hrtime.bigint();
        for (let i = 0; i < 1000; ++i) {
            const next = process.hrtime.bigint();
            if (next < last) {
                return false;
            }
            last = next;
        }
        return true;
    })())")));
}

TEST_F(PolyfillsTest, HrtimeBigintAdvances) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript("globalThis.hrtimeStart = process.hrtime.bigint();");
    std::this_thread::sleep_for(kSleepDuration);

    // The difference is taken in BigInt and only then converted, so no precision is lost before
    // the division. As above, the upper bound is what pins the unit to nanoseconds.
    double elapsed_ms =
        ToDouble(RunScript("Number(process.hrtime.bigint() - globalThis.hrtimeStart) / 1e6"));
    EXPECT_GE(elapsed_ms, kMinElapsedMs);
    EXPECT_LT(elapsed_ms, kMaxElapsedMs);
}

TEST_F(PolyfillsTest, SetImmediateQueuesTheCallbackOnTheLoop) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._immediateRan = false;
        setImmediate(() => {
            globalThis._immediateRan = true;
        });
    )");

    EXPECT_FALSE(ToBool(RunScript("globalThis._immediateRan")));

    loop().RunOneIteration();

    EXPECT_TRUE(ToBool(RunScript("globalThis._immediateRan")));
}

// Arguments after the callback are forwarded to it, as Node and the web platform do.
TEST_F(PolyfillsTest, SetImmediateForwardsExtraArgumentsToTheCallback) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._immediateArgs = null;
        setImmediate((a, b) => {
            globalThis._immediateArgs = [a, b];
        }, 'x', 42);
    )");

    loop().RunOneIteration();

    EXPECT_EQ(ToString(RunScript("globalThis._immediateArgs.join(',')")), "x,42");
}

TEST_F(PolyfillsTest, SetTimeoutQueuesTheCallbackAndClearTimeoutWithdrawsIt) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._clearedRan = false;
        globalThis._timeoutRan = false;
        const handle = setTimeout(() => {
            globalThis._clearedRan = true;
        }, 0);
        clearTimeout(handle);
        setTimeout(() => {
            globalThis._timeoutRan = true;
        }, 0);
    )");

    loop().RunOneIteration();

    EXPECT_FALSE(ToBool(RunScript("globalThis._clearedRan")));
    EXPECT_TRUE(ToBool(RunScript("globalThis._timeoutRan")));
}

TEST_F(PolyfillsTest, QueueMicrotask) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._microtaskRan = false;
        queueMicrotask(() => {
            globalThis._microtaskRan = true;
        });
    )");

    EXPECT_FALSE(ToBool(RunScript("globalThis._microtaskRan")));

    RunMicrotasks();

    EXPECT_TRUE(ToBool(RunScript("globalThis._microtaskRan")));
}

TEST_F(PolyfillsTest, TimerGlobals) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(
        ToBool(RunScript("typeof setImmediate === 'function' && "
                         "typeof setTimeout === 'function' && "
                         "typeof clearTimeout === 'function' && "
                         "typeof queueMicrotask === 'function'")));
}

// Arguments after the delay are forwarded to the callback, as Node and the web platform do.
TEST_F(PolyfillsTest, SetTimeoutForwardsExtraArgumentsToTheCallback) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._timeoutArgs = null;
        setTimeout((a, b) => {
            globalThis._timeoutArgs = [a, b];
        }, 0, 'x', 42);
    )");

    loop().RunOneIteration();

    EXPECT_EQ(ToString(RunScript("globalThis._timeoutArgs.join(',')")), "x,42");
}

// Negative, NaN, non-numeric and missing delays are all treated as zero, matching the web
// platform's clamping rules, so all four of these come due in the very first iteration.
TEST_F(PolyfillsTest, ADelayThatIsNotAPositiveNumberIsTreatedAsZero) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    RunScript(R"(
        globalThis._runs = 0;
        const count = () => { globalThis._runs++; };
        setTimeout(count, -50);
        setTimeout(count, NaN);
        setTimeout(count, 'not a number');
        setTimeout(count);
    )");

    loop().RunOneIteration();

    EXPECT_DOUBLE_EQ(ToDouble(RunScript("globalThis._runs")), 4.0);
}

// The delay reaches the loop as a duration rather than being dropped or rounded to zero. The loop
// reads the clock inside setTimeout(), between `before` and `after`, so `due` is bounded on both
// sides by `before + 10s <= due <= after + 10s` regardless of how long RunScript() takes.
TEST_F(PolyfillsTest, TheDelayIsPassedThroughToTheLoop) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    const auto before = dawn::node::standalone::EventLoop::Clock::now();
    RunScript("setTimeout(() => {}, 10000)");
    const auto after = dawn::node::standalone::EventLoop::Clock::now();

    const std::optional<dawn::node::standalone::EventLoop::TimePoint> due = loop().NextDueTime();
    ASSERT_TRUE(due.has_value());
    EXPECT_GE(*due, before + std::chrono::seconds(10));
    EXPECT_LE(*due, after + std::chrono::seconds(10));
}

TEST_F(PolyfillsTest, TimersRejectCallbacksThatAreNotFunctions) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(Throws("setImmediate()"));
    EXPECT_TRUE(Throws("setImmediate(42)"));
    EXPECT_TRUE(Throws("setTimeout()"));
    EXPECT_TRUE(Throws("setTimeout('globalThis.x = 1', 10)"));
}

// Clearing a handle that was never issued, or one that has already fired, is defined to do nothing
// rather than to fail.
TEST_F(PolyfillsTest, ClearingAnUnknownTimerIsNotAnError) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_FALSE(Throws("clearTimeout()"));
    EXPECT_FALSE(Throws("clearTimeout(undefined)"));
    EXPECT_FALSE(Throws("clearTimeout('not a handle')"));
    EXPECT_FALSE(Throws("clearTimeout(9999)"));

    // Clearing twice, and clearing after the timer has already fired, are both no-ops.
    RunScript(R"(
        globalThis._ran = false;
        globalThis._handle = setTimeout(() => {
            globalThis._ran = true;
        }, 0);
    )");
    loop().RunOneIteration();
    EXPECT_TRUE(ToBool(RunScript("globalThis._ran")));

    EXPECT_FALSE(Throws("clearTimeout(globalThis._handle)"));
    EXPECT_FALSE(Throws("clearTimeout(globalThis._handle)"));
}

// Handles have to be distinct, or clearing one timer would cancel another.
TEST_F(PolyfillsTest, TimerHandlesAreUnique) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(ToBool(RunScript(R"(
        const noop = () => {};
        const handles = [setTimeout(noop, 1), setTimeout(noop, 1), setTimeout(noop, 1)];
        new Set(handles).size === handles.length;
    )")));
}

// Node hands back a Timeout object here. The CTS only ever passes the value back to clearTimeout(),
// so a number is enough.
TEST_F(PolyfillsTest, SetTimeoutReturnsANumericHandle) {
    dawn::node::standalone::RegisterPolyfills(env_, loop());

    EXPECT_TRUE(ToBool(RunScript("typeof setTimeout(() => {}, 0) === 'number'")));
}

}  // namespace

#pragma clang diagnostic pop
