import logSymbols from "log-symbols" import chalk from "chalk" import { table } from "table" import type { Solution } from "./Solution.js" import type { Test } from "./Test.js" export interface SolutionTestsResultOptions { tests: Test[] solution: Solution elapsedTimeMilliseconds: number } export interface SolutionTestsResultPrintOptions { shouldPrintBenchmark?: boolean shouldPrintTableResult?: boolean } export class SolutionTestsResult implements SolutionTestsResultOptions { public tests: Test[] = [] public solution: Solution public isSuccess: boolean public elapsedTimeMilliseconds: number public static readonly SUCCESS_MESSAGE = `${chalk.bold.green( "Success:", )} Tests passed! 🎉` constructor(options: SolutionTestsResultOptions) { this.tests = options.tests.sort((a, b) => { return a.testNumber - b.testNumber }) this.solution = options.solution this.isSuccess = this.tests.every((test) => { return test.isSuccess }) this.elapsedTimeMilliseconds = options.elapsedTimeMilliseconds } public print(options: SolutionTestsResultPrintOptions = {}): void { const { shouldPrintBenchmark = false, shouldPrintTableResult = false } = options const name = `${this.solution.challenge.name}/${this.solution.programmingLanguageName}/${this.solution.name}` console.log(`${chalk.bold("Name:")} ${name}\n`) const tableResult = [ [ chalk.bold("N°"), chalk.bold("Input"), chalk.bold("Expected"), chalk.bold("Received"), ], ] let totalFailedTests = 0 let totalCorrectTests = 0 for (const test of this.tests) { const testLabel = `Test n°${test.testNumber}` if (test.isSuccess) { console.log(logSymbols.success, testLabel) totalCorrectTests += 1 } else { console.log(logSymbols.error, testLabel) const expected = test.output.split("\n").join("\n") const received = test.stdout.split("\n").join("\n") tableResult.push([ test.testNumber.toString(), `"${test.input}"`, `"${expected}"`, `"${received}"`, ]) totalFailedTests += 1 } } const isSuccess = totalCorrectTests === this.tests.length console.log() if (!isSuccess && shouldPrintTableResult) { console.log(table(tableResult)) } const testsResult = isSuccess ? chalk.bold.green(`${totalCorrectTests} passed`) : chalk.bold.red(`${totalFailedTests} failed`) console.log( `${chalk.bold("Tests:")} ${testsResult}, ${this.tests.length} total`, ) if (shouldPrintBenchmark) { SolutionTestsResult.printBenchmark(this.elapsedTimeMilliseconds) } if (!isSuccess) { throw new Error("Tests failed, try again!") } console.log("\n------------------------------\n") } public static printBenchmark(elapsedTimeMilliseconds: number): void { const elapsedTime = elapsedTimeMilliseconds / 1000 console.log(`${chalk.bold("Benchmark:")} ${elapsedTime} seconds`) } }