export function describe(name, cb) {
    console.log(`Running ${name}`);

    cb();
}

export async function it(name, cb) {
    console.log(`      Running ${name}`);

    cb();
}

let errorCount = 0;

export function expect(val) {
    return {
        toEqual: comparedVal => {
            const jsonVal = JSON.stringify(val);
            const comparedJsonVal = JSON.stringify(comparedVal);

            if (jsonVal !== comparedJsonVal) {
                console.trace("toEqual check failed.");
                console.error(`expected: ${comparedJsonVal}`);
                console.error(`got:      ${jsonVal}`);

                errorCount++;
            }
        },
        toBeTruthy: () => {
            if (!val) {
                console.trace("toBeTruthy failed.");
                console.error(`expected: truthy value`);
                console.error(`got:      ${val}`);

                errorCount++;
            }
        },
        toBeFalsy: () => {
            if (!!val) {
                console.trace("toBeFalsy failed.");
                console.error(`expected: null, false, undefined, 0 or empty string`);
                console.error(`got:      ${val}`);

                errorCount++;
            }
        },
        toThrow: errorMessage => {
            try {
                val();
            }
            catch (e) {
                if (e.message !== errorMessage) {
                    console.trace("toThrow caught exception, but messages differ");
                    console.error(`expected: ${errorMessage}`);
                    console.error(`got:      ${e.message}`);
                    console.error(`${e.stack}`);

                    errorCount++;
                }

                return;
            }

            console.trace("toThrow did not catch any exception.");
            console.error(`expected: ${errorMessage}`);
            console.error(`got:      [none]`);
            errorCount++;
        }
    }
}

export function execute() {
    console.log("");

    if (errorCount) {
        console.log(`!!!${errorCount} tests failed!!!`);
    }
    else {
        console.log("All tests passed!");
    }
}