diff options
Diffstat (limited to 'testing/asserts.ts')
-rw-r--r-- | testing/asserts.ts | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/testing/asserts.ts b/testing/asserts.ts index 904a4a966..56480c95b 100644 --- a/testing/asserts.ts +++ b/testing/asserts.ts @@ -1,5 +1,9 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. -import { assertEquals as prettyAssertEqual } from "./pretty.ts"; +import { red, green, white, gray, bold } from "../colors/mod.ts"; +import diff, { DiffType, DiffResult } from "./diff.ts"; +import { format } from "./format.ts"; + +const CAN_NOT_DISPLAY = "[Cannot display]"; interface Constructor { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -13,6 +17,56 @@ export class AssertionError extends Error { } } +function createStr(v: unknown): string { + try { + return format(v); + } catch (e) { + return red(CAN_NOT_DISPLAY); + } +} + +function createColor(diffType: DiffType): (s: string) => string { + switch (diffType) { + case DiffType.added: + return (s: string): string => green(bold(s)); + case DiffType.removed: + return (s: string): string => red(bold(s)); + default: + return white; + } +} + +function createSign(diffType: DiffType): string { + switch (diffType) { + case DiffType.added: + return "+ "; + case DiffType.removed: + return "- "; + default: + return " "; + } +} + +function buildMessage(diffResult: ReadonlyArray<DiffResult<string>>): string[] { + const messages: string[] = []; + messages.push(""); + messages.push(""); + messages.push( + ` ${gray(bold("[Diff]"))} ${red(bold("Left"))} / ${green(bold("Right"))}` + ); + messages.push(""); + messages.push(""); + diffResult.forEach( + (result: DiffResult<string>): void => { + const c = createColor(result.type); + messages.push(c(`${createSign(result.type)}${result.value}`)); + } + ); + messages.push(""); + + return messages; +} + export function equal(c: unknown, d: unknown): boolean { const seen = new Map(); return (function compare(a: unknown, b: unknown): boolean { @@ -77,7 +131,25 @@ export function assertEquals( expected: unknown, msg?: string ): void { - prettyAssertEqual(actual, expected, msg); + if (equal(actual, expected)) { + return; + } + let message = ""; + const actualString = createStr(actual); + const expectedString = createStr(expected); + try { + const diffResult = diff( + actualString.split("\n"), + expectedString.split("\n") + ); + message = buildMessage(diffResult).join("\n"); + } catch (e) { + message = `\n${red(CAN_NOT_DISPLAY)} + \n\n`; + } + if (msg) { + message = msg; + } + throw new AssertionError(message); } /** |