"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ordinalOf = void 0;
const expect_1 = require("@vitest/expect");
const chalk_1 = require("chalk");
const vitest_1 = require("vitest");
const jestMatchers_1 = require("./jestMatchers");
function ordinalOf(n) {
    const j = n % 10;
    const k = n % 100;
    if (j === 1 && k !== 11)
        return `${n}st`;
    if (j === 2 && k !== 12)
        return `${n}nd`;
    if (j === 3 && k !== 13)
        return `${n}rd`;
    return `${n}th`;
}
exports.ordinalOf = ordinalOf;
const chalk = new chalk_1.Chalk({ level: 3 });
const baseMatchers = (0, jestMatchers_1.createBaseMatchers)({
    toHaveReceivedCommand: ({ client, cmd, notPrefix }) => `expected ${client} to ${notPrefix}receive ${cmd} at least once`,
    toHaveReceivedCommandTimes: (expectedCalls) => ({ client, cmd, commandCalls, notPrefix }) => [
        `expected ${client} to ${notPrefix}receive ${cmd} ${expectedCalls} times`,
        `but got ${commandCalls.length} times`,
    ].join(', '),
    toHaveReceivedCommandWith: (input) => ({ client, cmd, notPrefix, ctxUtils, commandCalls }) => {
        return [
            `expected ${client} to ${notPrefix}receive ${cmd} with arguments [${ctxUtils.stringify(input, undefined, { printBasicPrototype: false })}]`,
            chalk.gray('Received:'),
            ...commandCalls.map((c, i) => {
                const callAnnotation = chalk.gray(`  ${ordinalOf(i + 1)} call:`);
                // type of input can not be string, so the return value of `diff` will always be defined
                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
                const diff = ctxUtils.diff(input, c.args[0].input, { omitAnnotationLines: true, commonColor: chalk.gray });
                return `${callAnnotation}\n\n${diff}`;
            }).filter((x) => x),
            chalk.gray(`Number of calls: ${commandCalls.length}`),
        ].join('\n\n');
    },
    toHaveReceivedNthCommandWith: (call, input) => ({ cmd, client, data, notPrefix, ctxUtils, commandCalls }) => {
        var _a;
        const beNthCalled = commandCalls.length >= call;
        const summary = `expected ${client} to ${notPrefix}receive ${ordinalOf(call)} ${cmd} with arguments [${ctxUtils.stringify(input, undefined, { printBasicPrototype: false })}]`;
        const msgWhenNotBeCalled = beNthCalled ? '' : `, but ${client} has only received ${cmd} ${commandCalls.length} times`;
        const diff = beNthCalled ? ctxUtils.diff(input, (_a = data.received) === null || _a === void 0 ? void 0 : _a.input, { commonColor: chalk.gray }) : '';
        return [summary + msgWhenNotBeCalled, diff].join('\n\n');
    },
    toHaveReceivedNthSpecificCommandWith: (call, input) => ({ cmd, client, data, notPrefix, ctxUtils, commandCalls }) => {
        var _a;
        const beNthCalled = commandCalls.length >= call;
        const summary = `expected ${client} to ${notPrefix}receive ${ordinalOf(call)} ${cmd} with arguments [${ctxUtils.stringify(input, undefined, { printBasicPrototype: false })}]`;
        const msgWhenNotBeCalled = beNthCalled ? '' : `, but ${client} has only received ${cmd} ${commandCalls.length} times`;
        const diff = beNthCalled ? ctxUtils.diff(input, (_a = data.received) === null || _a === void 0 ? void 0 : _a.input, { commonColor: chalk.gray }) : '';
        return [summary + msgWhenNotBeCalled, diff].join('\n\n');
    },
    toHaveReceivedAnyCommand: ({ client, notPrefix }) => `expected ${client} to ${notPrefix}receive any command at least once`,
}, (sample) => new expect_1.ObjectContaining(sample));
const aliasMatchers = {
    toReceiveCommandTimes: baseMatchers.toHaveReceivedCommandTimes,
    toReceiveCommand: baseMatchers.toHaveReceivedCommand,
    toReceiveCommandWith: baseMatchers.toHaveReceivedCommandWith,
    toReceiveNthCommandWith: baseMatchers.toHaveReceivedNthCommandWith,
    toReceiveNthSpecificCommandWith: baseMatchers.toHaveReceivedNthSpecificCommandWith,
    toReceiveAnyCommand: baseMatchers.toHaveReceivedAnyCommand,
};
vitest_1.expect.extend({
    ...baseMatchers,
    ...aliasMatchers,
});
//# sourceMappingURL=vitest.js.map