mirror of
https://github.com/denoland/deno.git
synced 2024-11-23 15:16:54 -05:00
parent
41829f3e2b
commit
8d474a7911
1 changed files with 97 additions and 92 deletions
189
testing/mod.ts
189
testing/mod.ts
|
@ -2,123 +2,128 @@
|
||||||
|
|
||||||
// Do not add imports in this file in order to be compatible with Node.
|
// Do not add imports in this file in order to be compatible with Node.
|
||||||
|
|
||||||
export function assertEqual(actual: unknown, expected: unknown, msg?: string) {
|
|
||||||
if (!equal(actual, expected)) {
|
|
||||||
let actualString: string;
|
|
||||||
let expectedString: string;
|
|
||||||
try {
|
|
||||||
actualString = String(actual);
|
|
||||||
} catch (e) {
|
|
||||||
actualString = "[Cannot display]";
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
expectedString = String(expected);
|
|
||||||
} catch (e) {
|
|
||||||
expectedString = "[Cannot display]";
|
|
||||||
}
|
|
||||||
console.error(
|
|
||||||
"assertEqual failed. actual =",
|
|
||||||
actualString,
|
|
||||||
"expected =",
|
|
||||||
expectedString
|
|
||||||
);
|
|
||||||
if (!msg) {
|
|
||||||
msg = `actual: ${actualString} expected: ${expectedString}`;
|
|
||||||
}
|
|
||||||
throw new Error(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Constructor {
|
interface Constructor {
|
||||||
new (...args: any[]): any;
|
new (...args: any[]): any;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Assert {
|
const assertions = {
|
||||||
/** Make an assertion, if not true, then throw. */
|
/** Make an assertion, if not `true`, then throw. */
|
||||||
(expr: boolean, msg?: string): void;
|
assert(expr: boolean, msg = ""): void {
|
||||||
|
if (!expr) {
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/** Make an assertion that `actual` and `expected` are equal, deeply. If not
|
/** Make an assertion that `actual` and `expected` are equal, deeply. If not
|
||||||
* deeply equal, then throw.
|
* deeply equal, then throw.
|
||||||
*/
|
*/
|
||||||
equal(actual: unknown, expected: unknown, msg?: string): void;
|
equal(actual: unknown, expected: unknown, msg?: string): void {
|
||||||
|
if (!equal(actual, expected)) {
|
||||||
|
let actualString: string;
|
||||||
|
let expectedString: string;
|
||||||
|
try {
|
||||||
|
actualString = String(actual);
|
||||||
|
} catch (e) {
|
||||||
|
actualString = "[Cannot display]";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
expectedString = String(expected);
|
||||||
|
} catch (e) {
|
||||||
|
expectedString = "[Cannot display]";
|
||||||
|
}
|
||||||
|
console.error(
|
||||||
|
"assertEqual failed. actual =",
|
||||||
|
actualString,
|
||||||
|
"expected =",
|
||||||
|
expectedString
|
||||||
|
);
|
||||||
|
if (!msg) {
|
||||||
|
msg = `actual: ${actualString} expected: ${expectedString}`;
|
||||||
|
}
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/** Make an assertion that `actual` and `expected` are strictly equal. If
|
/** Make an assertion that `actual` and `expected` are strictly equal. If
|
||||||
* not then throw.
|
* not then throw.
|
||||||
*/
|
*/
|
||||||
strictEqual(actual: unknown, expected: unknown, msg?: string): void;
|
strictEqual(actual: unknown, expected: unknown, msg = ""): void {
|
||||||
|
if (actual !== expected) {
|
||||||
|
let actualString: string;
|
||||||
|
let expectedString: string;
|
||||||
|
try {
|
||||||
|
actualString = String(actual);
|
||||||
|
} catch (e) {
|
||||||
|
actualString = "[Cannot display]";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
expectedString = String(expected);
|
||||||
|
} catch (e) {
|
||||||
|
expectedString = "[Cannot display]";
|
||||||
|
}
|
||||||
|
console.error(
|
||||||
|
"strictEqual failed. actual =",
|
||||||
|
actualString,
|
||||||
|
"expected =",
|
||||||
|
expectedString
|
||||||
|
);
|
||||||
|
if (!msg) {
|
||||||
|
msg = `actual: ${actualString} expected: ${expectedString}`;
|
||||||
|
}
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/** Executes a function, expecting it to throw. If it does not, then it
|
/** Executes a function, expecting it to throw. If it does not, then it
|
||||||
* throws. An error class and a string that should be included in the
|
* throws. An error class and a string that should be included in the
|
||||||
* error message can also be asserted.
|
* error message can also be asserted.
|
||||||
*/
|
*/
|
||||||
throws(fn: () => void, errorClass?: Constructor, msgIncludes?: string): void;
|
throws(
|
||||||
}
|
fn: () => void,
|
||||||
|
ErrorClass?: Constructor,
|
||||||
export const assert = function assert(expr: boolean, msg = "") {
|
msgIncludes = "",
|
||||||
if (!expr) {
|
msg = ""
|
||||||
throw new Error(msg);
|
): void {
|
||||||
}
|
let doesThrow = false;
|
||||||
} as Assert;
|
|
||||||
|
|
||||||
assert.equal = assertEqual;
|
|
||||||
assert.strictEqual = function strictEqual(actual, expected, msg = "") {
|
|
||||||
if (actual !== expected) {
|
|
||||||
let actualString: string;
|
|
||||||
let expectedString: string;
|
|
||||||
try {
|
try {
|
||||||
actualString = String(actual);
|
fn();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
actualString = "[Cannot display]";
|
if (ErrorClass && !(Object.getPrototypeOf(e) === ErrorClass.prototype)) {
|
||||||
}
|
msg = `Expected error to be instance of "${ErrorClass.name}"${
|
||||||
try {
|
msg ? `: ${msg}` : "."
|
||||||
expectedString = String(expected);
|
}`;
|
||||||
} catch (e) {
|
|
||||||
expectedString = "[Cannot display]";
|
|
||||||
}
|
|
||||||
console.error(
|
|
||||||
"strictEqual failed. actual =",
|
|
||||||
actualString,
|
|
||||||
"expected =",
|
|
||||||
expectedString
|
|
||||||
);
|
|
||||||
if (!msg) {
|
|
||||||
msg = `actual: ${actualString} expected: ${expectedString}`;
|
|
||||||
}
|
|
||||||
throw new Error(msg);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
assert.throws = function throws(
|
|
||||||
fn,
|
|
||||||
ErrorClass: Constructor,
|
|
||||||
msgIncludes = "",
|
|
||||||
msg = ""
|
|
||||||
) {
|
|
||||||
let doesThrow = false;
|
|
||||||
try {
|
|
||||||
fn();
|
|
||||||
} catch (e) {
|
|
||||||
if (ErrorClass && !(Object.getPrototypeOf(e) === ErrorClass.prototype)) {
|
|
||||||
msg = `Expected error to be instance of "${ErrorClass.name}"${
|
|
||||||
msg ? `: ${msg}` : "."
|
|
||||||
}`;
|
|
||||||
throw new Error(msg);
|
|
||||||
}
|
|
||||||
if (msgIncludes) {
|
|
||||||
if (!e.message.includes(msgIncludes)) {
|
|
||||||
msg = `Expected error message to include "${msgIncludes}", but got "${
|
|
||||||
e.message
|
|
||||||
}"${msg ? `: ${msg}` : "."}`;
|
|
||||||
throw new Error(msg);
|
throw new Error(msg);
|
||||||
}
|
}
|
||||||
|
if (msgIncludes) {
|
||||||
|
if (!e.message.includes(msgIncludes)) {
|
||||||
|
msg = `Expected error message to include "${msgIncludes}", but got "${
|
||||||
|
e.message
|
||||||
|
}"${msg ? `: ${msg}` : "."}`;
|
||||||
|
throw new Error(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
doesThrow = true;
|
||||||
|
}
|
||||||
|
if (!doesThrow) {
|
||||||
|
msg = `Expected function to throw${msg ? `: ${msg}` : "."}`;
|
||||||
|
throw new Error(msg);
|
||||||
}
|
}
|
||||||
doesThrow = true;
|
|
||||||
}
|
|
||||||
if (!doesThrow) {
|
|
||||||
msg = `Expected function to throw${msg ? `: ${msg}` : "."}`;
|
|
||||||
throw new Error(msg);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type Assert = typeof assertions.assert & typeof assertions;
|
||||||
|
|
||||||
|
// Decorate assertions.assert with all the assertions
|
||||||
|
Object.assign(assertions.assert, assertions);
|
||||||
|
|
||||||
|
export const assert = assertions.assert as Assert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An alias to assert.equal
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
export const assertEqual = assert.equal;
|
||||||
|
|
||||||
export function equal(c: unknown, d: unknown): boolean {
|
export function equal(c: unknown, d: unknown): boolean {
|
||||||
const seen = new Map();
|
const seen = new Map();
|
||||||
return (function compare(a: unknown, b: unknown) {
|
return (function compare(a: unknown, b: unknown) {
|
||||||
|
|
Loading…
Reference in a new issue