feat(extend): custom asymmetric matchers
This commit is contained in:
parent
33890eb6c5
commit
eaedd43a2f
9
packages/playwright/types/test.d.ts
vendored
9
packages/playwright/types/test.d.ts
vendored
|
|
@ -6571,6 +6571,11 @@ type PollMatchers<R, T, ExtendedMatchers> = {
|
|||
not: PollMatchers<R, T, ExtendedMatchers>;
|
||||
} & BaseMatchers<R, T> & ToUserMatcherObject<ExtendedMatchers, T>;
|
||||
|
||||
type ExtendedAsymmetricMatchers<M = {}> = {
|
||||
[K in keyof M]: M[K] extends (this: ExpectMatcherState, received: any, ...args: infer P) => any ? (...args: P) => AsymmetricMatcher
|
||||
: never
|
||||
}
|
||||
|
||||
export type Expect<ExtendedMatchers = {}> = {
|
||||
<T = unknown>(actual: T, messageOrOptions?: string | { message?: string }): MakeMatchers<void, T, ExtendedMatchers>;
|
||||
soft: <T = unknown>(actual: T, messageOrOptions?: string | { message?: string }) => MakeMatchers<void, T, ExtendedMatchers>;
|
||||
|
|
@ -6582,8 +6587,8 @@ export type Expect<ExtendedMatchers = {}> = {
|
|||
soft?: boolean,
|
||||
}) => Expect<ExtendedMatchers>;
|
||||
getState(): unknown;
|
||||
not: Omit<AsymmetricMatchers, 'any' | 'anything'>;
|
||||
} & AsymmetricMatchers;
|
||||
not: Omit<AsymmetricMatchers & ExtendedAsymmetricMatchers<ExtendedMatchers>, 'any' | 'anything'>;
|
||||
} & AsymmetricMatchers & ExtendedAsymmetricMatchers<ExtendedMatchers>;
|
||||
|
||||
// --- BEGINGLOBAL ---
|
||||
declare global {
|
||||
|
|
|
|||
|
|
@ -875,12 +875,21 @@ test('should support mergeExpects (TSC)', async ({ runTSC }) => {
|
|||
const expect1 = baseExpect.extend({
|
||||
async toBeAGoodPage(page: Page, x: number) {
|
||||
return { pass: true, message: () => '' };
|
||||
},
|
||||
matchFoo(received: unknown, expected: string) {
|
||||
return { pass: true, message: () => '' };
|
||||
},
|
||||
toBeFoo(received: unknown) {
|
||||
return { pass: true, message: () => '' };
|
||||
}
|
||||
});
|
||||
|
||||
const expect2 = baseExpect.extend({
|
||||
async toBeABadPage(page: Page, y: string) {
|
||||
return { pass: true, message: () => '' };
|
||||
},
|
||||
matchBar(received: unknown, expected: string) {
|
||||
return { pass: true, message: () => '' };
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -889,12 +898,19 @@ test('should support mergeExpects (TSC)', async ({ runTSC }) => {
|
|||
test('custom matchers', async ({ page }) => {
|
||||
await expect(page).toBeAGoodPage(123);
|
||||
await expect(page).toBeABadPage('123');
|
||||
await expect('foo').toEqual(expect.matchFoo('123'));
|
||||
await expect('bar').not.toEqual(expect.not.matchBar('123'));
|
||||
await expect({ name: 'Foo' }).toMatchObject({ name: expect.toBeFoo() });
|
||||
// @ts-expect-error
|
||||
await expect(page).toBeAMediocrePage();
|
||||
// @ts-expect-error
|
||||
await expect(page).toBeABadPage(123);
|
||||
// @ts-expect-error
|
||||
await expect(page).toBeAGoodPage('123');
|
||||
// @ts-expect-error
|
||||
expect('foo').toEqual(expect.matchFoo(123));
|
||||
// @ts-expect-error
|
||||
expect('bar').not.toEqual(expect.not.matchBar(123));
|
||||
});
|
||||
`
|
||||
});
|
||||
|
|
@ -910,12 +926,21 @@ test('should support mergeExpects', async ({ runInlineTest }) => {
|
|||
const expect1 = baseExpect.extend({
|
||||
async toBeAGoodPage(page: Page, x: number) {
|
||||
return { pass: true, message: () => '' };
|
||||
},
|
||||
matchFoo(received: unknown, expected: string) {
|
||||
return { pass: true, message: () => '' };
|
||||
},
|
||||
toBeFoo(received: unknown) {
|
||||
return { pass: true, message: () => '' };
|
||||
}
|
||||
});
|
||||
|
||||
const expect2 = baseExpect.extend({
|
||||
async toBeABadPage(page: Page, y: string) {
|
||||
return { pass: true, message: () => '' };
|
||||
},
|
||||
matchBar(received: unknown, expected: string) {
|
||||
return { pass: true, message: () => '' };
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -924,6 +949,9 @@ test('should support mergeExpects', async ({ runInlineTest }) => {
|
|||
test('custom matchers', async ({ page }) => {
|
||||
await expect(page).toBeAGoodPage(123);
|
||||
await expect(page).toBeABadPage('123');
|
||||
await expect('foo').toEqual(expect.matchFoo('123'));
|
||||
await expect('bar').not.toEqual(expect.not.matchBar('123'));
|
||||
await expect({ name: 'Foo' }).toMatchObject({ name: expect.toBeFoo() });
|
||||
});
|
||||
`
|
||||
}, { workers: 1 });
|
||||
|
|
|
|||
9
utils/generate_types/overrides-test.d.ts
vendored
9
utils/generate_types/overrides-test.d.ts
vendored
|
|
@ -411,6 +411,11 @@ type PollMatchers<R, T, ExtendedMatchers> = {
|
|||
not: PollMatchers<R, T, ExtendedMatchers>;
|
||||
} & BaseMatchers<R, T> & ToUserMatcherObject<ExtendedMatchers, T>;
|
||||
|
||||
type ExtendedAsymmetricMatchers<M = {}> = {
|
||||
[K in keyof M]: M[K] extends (this: ExpectMatcherState, received: any, ...args: infer P) => any ? (...args: P) => AsymmetricMatcher
|
||||
: never
|
||||
}
|
||||
|
||||
export type Expect<ExtendedMatchers = {}> = {
|
||||
<T = unknown>(actual: T, messageOrOptions?: string | { message?: string }): MakeMatchers<void, T, ExtendedMatchers>;
|
||||
soft: <T = unknown>(actual: T, messageOrOptions?: string | { message?: string }) => MakeMatchers<void, T, ExtendedMatchers>;
|
||||
|
|
@ -422,8 +427,8 @@ export type Expect<ExtendedMatchers = {}> = {
|
|||
soft?: boolean,
|
||||
}) => Expect<ExtendedMatchers>;
|
||||
getState(): unknown;
|
||||
not: Omit<AsymmetricMatchers, 'any' | 'anything'>;
|
||||
} & AsymmetricMatchers;
|
||||
not: Omit<AsymmetricMatchers & ExtendedAsymmetricMatchers<ExtendedMatchers>, 'any' | 'anything'>;
|
||||
} & AsymmetricMatchers & ExtendedAsymmetricMatchers<ExtendedMatchers>;
|
||||
|
||||
// --- BEGINGLOBAL ---
|
||||
declare global {
|
||||
|
|
|
|||
Loading…
Reference in a new issue