#!/usr/bin/env node

// Many editors have terminal emulators built in, so running tests with NodeJS
// provides faster iteration, especially for those acclimated to test-driven
// development.

import "../all_tests.js";
import { StreamReporter, GLOBAL_REGISTRAR } from "./jstest.js";

// TypeScript doesn't like process and Deno as their type definitions aren't
// installed, but doesn't seem to complain if they're accessed through
// globalThis.
const process: any = (globalThis as any).process;
const Deno: any = (globalThis as any).Deno;

function getArgs(): string[] {
    if (process) {
        const [runtime, program, ...args] = process.argv;
        return args;
    }
    if (Deno) return Deno.args;
    return [];
}

function exit(code?: number): never {
    if (Deno) Deno.exit(code);
    if (process) process.exit(code);
    throw `exited with code ${code ?? 0}`;
}

const args = getArgs();
let verbose = false;
if (args.length > 1) {
    console.error("Too many arguments");
    exit(1);
}
if (args.length === 1) {
    if (args[0] === "-v" || args[0] === "--verbose" || args[0] === "-verbose") {
        verbose = true;
    } else if (args[0] !== "--") {
        console.error(`Unknown argument '${args[0]}'`);
        exit(1);
    }
}

let reporter = new StreamReporter({ writeln: console.log }, verbose);
GLOBAL_REGISTRAR.run(reporter);
exit(reporter.succeeded() ? 0 : 1);
