Skip to content

Commit

Permalink
fix(expect): change context member and fix assertion message
Browse files Browse the repository at this point in the history
  • Loading branch information
TomokiMiyauci committed Dec 20, 2021
1 parent 1e6bac4 commit 599940f
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 43 deletions.
5 changes: 5 additions & 0 deletions _types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ type Minus<N extends number> = ArrayOfLength<N> extends [any, ...infer Rest]
? Rest["length"]
: never;

type PartialByKeys<T, K extends PropertyKey = keyof T> = {
[P in keyof (Omit<T, K> & Partial<Pick<T, keyof T & K>>)]: T[P];
};

export type {
AnyFn,
FirstParameter,
Expand All @@ -67,6 +71,7 @@ export type {
IsTuple,
Minus,
OverwriteOf,
PartialByKeys,
PickByFirstParameter,
PickOf,
Primitive,
Expand Down
38 changes: 27 additions & 11 deletions expect/_utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import type {
PostModifierResult,
PreModifierResult,
} from "../modifier/types.ts";
import type { PartialByKeys } from "../_types.ts";

type Result = {
actual: unknown;
Expand All @@ -20,20 +21,36 @@ type Result = {
expectedHint: string;
};

/** helper for pick field of `name` */
function pickName<T>({ name }: { name: T }): T {
return name;
}

/** assert match result, if fail it throw `AssertionError`
*/
function assert(
result: Result & {
pass: boolean;
matcherName: string;
preModifierNames: PropertyKey[];
postModifierNames: PropertyKey[];
},
context: ExpectContext,
): Result | never {
if (result.pass) {
const { pass, resultActual, ...rest } = mergeContext(context);
const result: Result = {
...rest,
resultActual: resultActual ? resultActual : rest.actual,
actual: context.expectContext.actual,
};

if (pass) {
return result;
}
const failMessage = stringifyResult(result);

const preModifierNames = context.preModifierContexts.map(pickName);
const postModifierNames = context.postModifierContexts.map(pickName);
const matcherName = context.matcherContext.name;
const failMessage = stringifyResult({
...result,
preModifierNames,
postModifierNames,
matcherName,
});

throw new AssertionError(failMessage);
}
Expand All @@ -51,7 +68,6 @@ type PreModifierContext = {
type ExpectContext = {
expectContext: {
actual: Result["actual"];
resultActual: unknown;
matcher: Matcher;
matcherArgs: readonly unknown[];
actualHint: string;
Expand All @@ -64,7 +80,7 @@ type ExpectContext = {
returns: PostModifierResult;
}[];
matcherContext: {
name: string;
name: PropertyKey;
args: Pick<Result, "actual" | "matcherArgs">;
returns: MatchResult;
};
Expand All @@ -85,7 +101,7 @@ function returnReducer(
function mergeContext(
{ expectContext, preModifierContexts, postModifierContexts, matcherContext }:
ExpectContext,
): Result & { pass: boolean } {
): PartialByKeys<Result, "resultActual"> & { pass: boolean } {
return {
...expectContext,
...preModifierContexts.reduce(
Expand Down
36 changes: 22 additions & 14 deletions expect/_utils_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,31 @@ import { assertEquals, assertThrowsAssertionError } from "../dev_deps.ts";
import { assert, mergeContext } from "./_utils.ts";

Deno.test("assert", () => {
const matcher = () => ({ pass: false, expected: "test" });

assertThrowsAssertionError(
() =>
assert({
pass: false,
actual: "test",
actualHint: "Actual:",
expected: "tes",
expectedHint: "Expected:",
matcherArgs: [],
resultActual: "test",
matcherName: "toBe",
postModifierNames: [],
preModifierNames: [],
expectContext: {
actual: "test",
actualHint: "Actual:",
expectedHint: "Expected:",
matcher,
matcherArgs: [],
},
matcherContext: {
name: "toBe",
args: {
actual: "test",
matcherArgs: [],
},
returns: {
"expected": "test",
"pass": false,
},
},
preModifierContexts: [],
postModifierContexts: [],
}),
);
});
Expand All @@ -27,7 +39,6 @@ Deno.test("mergeContext", () => {
mergeContext({
expectContext: {
actual: "test",
resultActual: "test",
actualHint: "Actual:",
expectedHint: "Expected:",
matcher,
Expand All @@ -54,7 +65,6 @@ Deno.test("mergeContext", () => {
expectedHint: "Expected:",
matcherArgs: [],
expected: "test",
resultActual: "test",
pass: false,
},
);
Expand All @@ -63,7 +73,6 @@ Deno.test("mergeContext", () => {
mergeContext({
expectContext: {
actual: Promise.resolve("test"),
resultActual: Promise.resolve("test"),
actualHint: "Actual:",
expectedHint: "Expected:",
matcher,
Expand Down Expand Up @@ -100,7 +109,6 @@ Deno.test("mergeContext", () => {
expectedHint: "Expected:",
matcherArgs: ["test"],
expected: "test",
resultActual: Promise.resolve("test"),
pass: true,
},
);
Expand Down
23 changes: 7 additions & 16 deletions expect/expect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
import { jestMatcherMap } from "../matcher/preset.ts";
import { jestModifierMap } from "../modifier/preset.ts";
import { isPromise } from "../deps.ts";
import { head, last } from "../matcher/utils.ts";
import { last } from "../matcher/utils.ts";
import {
assert,
DEFAULT_ACTUAL_HINT,
DEFAULT_EXPECTED_HINT,
mergeContext,
PreModifierContext,
} from "./_utils.ts";

Expand Down Expand Up @@ -195,7 +194,6 @@ function defineExpect<
const expectContext = {
...preModifierArgs,
actual,
resultActual: actual,
actualHint: DEFAULT_ACTUAL_HINT,
expectedHint: DEFAULT_EXPECTED_HINT,
};
Expand Down Expand Up @@ -281,36 +279,29 @@ function defineExpect<
expected: matchResult.expected,
};
const postModifierContexts = post.reduce(
(acc, [name, fn]) => {
(acc, [key, fn]) => {
const name = String(key);
const args = {
...postModifierArgs,
...last(acc)?.returns,
name: String(name),
name,
};
const returns = fn(args);
return [...acc, { name: String(name), args, returns }];
return [...acc, { name, args, returns }];
},
[] as ExpectContext["postModifierContexts"],
);

const matcherName = String(name);

const result = mergeContext({
return assert({
expectContext,
preModifierContexts,
matcherContext: {
name: matcherName,
name,
args: matcherArgs,
returns: matchResult,
},
postModifierContexts,
});
return assert({
...result,
matcherName,
preModifierNames: pre.map(head),
postModifierNames: post.map(head),
});
};

if (usePromise) {
Expand Down
4 changes: 2 additions & 2 deletions helper/format.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ function stringifyExpect({

type StringifyResultArgs = {
actual: unknown;
matcherName: string;
matcherName: PropertyKey;
matcherArgs: readonly unknown[];

resultActual: unknown;
Expand Down Expand Up @@ -96,7 +96,7 @@ function stringifyResult(
stringifyExpect({
actual: stringify(actual),
matcherArgs: matcherArgs ? printIterable(matcherArgs).join(", ") : "",
matcher: yellow(matcherName),
matcher: yellow(String(matcherName)),
preModifier: preModifierNames.join("."),
postModifier: postModifierNames.join("."),
})
Expand Down

0 comments on commit 599940f

Please sign in to comment.