mirror of
https://github.com/denoland/deno.git
synced 2024-12-28 10:09:20 -05:00
75 lines
1.8 KiB
TypeScript
75 lines
1.8 KiB
TypeScript
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
|
|
|
|
import { equal } from "./mod.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]";
|
|
|
|
function createStr(v: unknown): string {
|
|
try {
|
|
return format(v);
|
|
} catch (e) {
|
|
return red(CAN_NOT_DISPLAY);
|
|
}
|
|
}
|
|
|
|
function createColor(diffType: DiffType) {
|
|
switch (diffType) {
|
|
case "added":
|
|
return (s: string) => green(bold(s));
|
|
case "removed":
|
|
return (s: string) => red(bold(s));
|
|
default:
|
|
return white;
|
|
}
|
|
}
|
|
|
|
function createSign(diffType: DiffType) {
|
|
switch (diffType) {
|
|
case "added":
|
|
return "+ ";
|
|
case "removed":
|
|
return "- ";
|
|
default:
|
|
return " ";
|
|
}
|
|
}
|
|
|
|
function buildMessage(diffResult: ReadonlyArray<DiffResult<string>>) {
|
|
const messages = [];
|
|
messages.push("");
|
|
messages.push("");
|
|
messages.push(
|
|
` ${gray(bold("[Diff]"))} ${red(bold("Left"))} / ${green(bold("Right"))}`
|
|
);
|
|
messages.push("");
|
|
messages.push("");
|
|
diffResult.forEach((result: DiffResult<string>) => {
|
|
const c = createColor(result.type);
|
|
messages.push(c(`${createSign(result.type)}${result.value}`));
|
|
});
|
|
messages.push("");
|
|
|
|
return messages;
|
|
}
|
|
|
|
export function assertEqual(actual: unknown, expected: unknown) {
|
|
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`;
|
|
}
|
|
throw new Error(message);
|
|
}
|