import { NoOpReporter, TestRegistrar, context, group, suite, test } from "./jstest/jstest.js";

suite("dog", [
    group("tail", [
        test("wags when happy", (t) => {
            if (0 / 0 !== Infinity / Infinity) {
                t.fatal("undefined must not be defined");
            }
        }),
        test("idle when down", (t) => {
            t.log("test test");
            t.error("dog whining noises go here");
        }),
    ]),
    test("likes headpats", (t) => {
        if (2 !== 2) {
            t.error("IEEE 754 violated: 2 is NaN");
        }
    }),
    context("near cat", [
        test("is ecstatic", (t) => {
            if (("b" + "a" + + "a" + "a").toLowerCase() === "banana") {
                t.error("🍌🍌🍌");
                t.error("🍌🍌🍌");
                t.error("🍌🍌🍌");
                t.failNow();
            }
        }),
        test("playfully bites cats' tails", (t) => {
            t.log("arf!");
            throw new Error("nom");
        }),
    ]),
]);

suite("cat", [
    test("likes headpats", (t) => {
        t.log("meow");
    }),
    test("owns skipping rope", (t) => {
        t.skip("this cat is stuck in your machine!");
        t.log("never logged");
    }),
    test("tester tester", (t) => {
        const r = new TestRegistrar();
        r.suite("explod", [
            test("with yarn", (t) => {
                t.log("YAY");
            }),
        ]);
        const reporter = new NoOpReporter();
        r.run(reporter);
        if (!reporter.finalized) t.error(`expected reporter to have been finalized`);
        if (reporter.results.length !== 1) {
            t.fatal(`incorrect result count got=${reporter.results.length} want=1`);
        }
        const result = reporter.results[0];
        if (!(result.path.length === 2 &&
              result.path[0] === "explod" &&
              result.path[1] === "with yarn")) {
            t.error(`incorrect result path got=${result.path} want=["explod", "with yarn"]`);
        }
        if (result.state !== "success") t.error(`expected test to succeed`);
        if (!(result.logs.length === 1 && result.logs[0] === "YAY")) {
            t.error(`incorrect result logs got=${result.logs} want=["YAY"]`);
        }
    }),
]);
