UNPKG

@pmoo/testy

Version:

A minimal testing framework, for educational purposes.

104 lines (85 loc) 2.4 kB
import { I18n } from '../i18n/i18n.js'; import { Formatter } from './formatter.js'; /** * I am a command-line user interface, connected to Node's `console`. * * I deal with all the relevant events and decide what to display to the user. * For that task, I collaborate with a [formatter]{@link Formatter}. */ export class ConsoleUI { #process; #console; #formatter; static successfulExitCode() { return 0; } static failedExitCode() { return 1; } // instance creation constructor(process, console) { this.#process = process; this.#console = console; this.#useLanguage(I18n.defaultLanguage()); } // configuration configureWith(configuration) { this.#useLanguage(configuration.language()); } // Callbacks for runner/suite/test testCallbacks() { return { whenPending: test => this.#formatter.displayPendingResult(test), whenSkipped: test => this.#formatter.displaySkippedResult(test), whenSuccess: test => this.#formatter.displaySuccessResult(test), whenFailed: test => this.#formatter.displayFailureResult(test, 'fail'), whenErrored: test => this.#formatter.displayFailureResult(test, 'error'), }; } suiteCallbacks() { return { onStart: suite => this.#formatter.displaySuiteStart(suite), onFinish: suite => this.#formatter.displaySuiteEnd(suite), }; } testRunnerCallbacks() { return { onFinish: runner => this.#onRunnerFinish(runner), onSuccess: _runner => this.#exitWithCode(ConsoleUI.successfulExitCode()), onFailure: _runner => this.#exitWithCode(ConsoleUI.failedExitCode()), }; } // application events start(configuration, paths) { this.#formatter.startTimer(); this.#formatter.displayInitialInformation(configuration, paths); } exitWithError(...errorMessages) { errorMessages.forEach(errorMessage => this.#formatter.displayError(errorMessage), ); this.#exitWithCode(ConsoleUI.failedExitCode()); } // private #useLanguage(language) { const i18n = new I18n(language); this.#formatter = new Formatter(this.#console, i18n); } #onRunnerFinish(runner) { this.#formatter.displayRunnerEnd(runner); this.#formatter.endTimer(); } #exitWithCode(exitCode) { this.#process.exit(exitCode); } }