From 7ed7d65a2d5f039271880df7fc20434a35e33eae Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Mon, 9 Jan 2023 13:08:38 +0200 Subject: [PATCH 1/2] fix(types): fix jest AsymmetricMatcher type --- examples/typescript/all/test/add.test.ts | 10 ++ types/index.d.ts | 144 +++++++++++------------ 2 files changed, 82 insertions(+), 72 deletions(-) diff --git a/examples/typescript/all/test/add.test.ts b/examples/typescript/all/test/add.test.ts index 2cc6f11a..9316c04a 100644 --- a/examples/typescript/all/test/add.test.ts +++ b/examples/typescript/all/test/add.test.ts @@ -25,4 +25,14 @@ describe('add', () => { test('adding two odd numbers gives an even number', () => { expect(add(1, 3)).toBeEven(); }); + + test('array equal another array regardless of the order', () => { + expect([1, 3]).toIncludeSameMembers([3, 1]); + }); + + test('array property equal another array regardless of the order', () => { + expect({ array: [1, 3] }).toEqual({ + array: expect.toIncludeSameMembers([3, 1]), + }); + }); }); diff --git a/types/index.d.ts b/types/index.d.ts index e2e68121..235d899b 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,13 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -interface CustomMatchers { +interface CustomMatchers { /** * Note: Currently unimplemented * Passing assertion * * @param {String} message */ - pass(message: string): void; + pass(message: string): R; /** * Note: Currently unimplemented @@ -15,128 +15,128 @@ interface CustomMatchers { * * @param {String} message */ - fail(message: string): void; + fail(message: string): R; /** * Use .toBeEmpty when checking if a String '', Array [] or Object {} is empty. */ - toBeEmpty(): void; + toBeEmpty(): R; /** * Use .toBeOneOf when checking if a value is a member of a given Array. * @param {Array.<*>} members */ - toBeOneOf(members: readonly E[]): void; + toBeOneOf(members: readonly E[]): R; /** * Use `.toBeNil` when checking a value is `null` or `undefined`. */ - toBeNil(): void; + toBeNil(): R; /** * Use `.toSatisfy` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean`. * @param {Function} predicate */ - toSatisfy(predicate: (x: E) => boolean): void; + toSatisfy(predicate: (x: E) => boolean): R; /** * Use `.toBeArray` when checking if a value is an `Array`. */ - toBeArray(): void; + toBeArray(): R; /** * Use `.toBeArrayOfSize` when checking if a value is an `Array` of size x. * @param {Number} x */ - toBeArrayOfSize(x: number): void; + toBeArrayOfSize(x: number): R; /** * Use `.toBeAfter` when checking if a date occurs after `date`. * @param {Date} date */ - toBeAfter(date: Date): void; + toBeAfter(date: Date): R; /** * Use `.toBeBefore` when checking if a date occurs before `date`. * @param {Date} date */ - toBeBefore(date: Date): void; + toBeBefore(date: Date): R; /** * Use `.toIncludeAllMembers` when checking if an `Array` contains all of the same members of a given set. * @param {Array.<*>} members */ - toIncludeAllMembers(members: readonly E[]): void; + toIncludeAllMembers(members: readonly E[]): R; /** * Use `.toIncludeAnyMembers` when checking if an `Array` contains any of the members of a given set. * @param {Array.<*>} members */ - toIncludeAnyMembers(members: readonly E[]): void; + toIncludeAnyMembers(members: readonly E[]): R; /** * Use `.toIncludeSameMembers` when checking if two arrays contain equal values, in any order. * @param {Array.<*>} members */ - toIncludeSameMembers(members: readonly E[]): void; + toIncludeSameMembers(members: readonly E[]): R; /** * Use `.toPartiallyContain` when checking if any array value matches the partial member. * @param {*} member */ - toPartiallyContain(member: E): void; + toPartiallyContain(member: E): R; /** * Use `.toSatisfyAll` when you want to use a custom matcher by supplying a predicate function that returns a `Boolean` for all values in an array. * @param {Function} predicate */ - toSatisfyAll(predicate: (x: E) => boolean): void; + toSatisfyAll(predicate: (x: E) => boolean): R; /** * Use `.toSatisfyAny` when you want to use a custom matcher by supplying a predicate function that returns `true` for any matching value in an array. * @param {Function} predicate */ - toSatisfyAny(predicate: (x: any) => boolean): void; + toSatisfyAny(predicate: (x: any) => boolean): R; /** * Use `.toBeBoolean` when checking if a value is a `Boolean`. */ - toBeBoolean(): void; + toBeBoolean(): R; /** * Use `.toBeTrue` when checking a value is equal (===) to `true`. */ - toBeTrue(): void; + toBeTrue(): R; /** * Use `.toBeFalse` when checking a value is equal (===) to `false`. */ - toBeFalse(): void; + toBeFalse(): R; /** * Use `.toBeDate` when checking if a value is a `Date`. */ - toBeDate(): void; + toBeDate(): R; /** * Use `.toBeValidDate` when checking if a value is a `valid Date`. */ - toBeValidDate(): void; + toBeValidDate(): R; /** * Use `.toBeFunction` when checking if a value is a `Function`. */ - toBeFunction(): void; + toBeFunction(): R; /** * Use `.toBeDateString` when checking if a value is a valid date string. */ - toBeDateString(): void; + toBeDateString(): R; /** * Use `.toBeHexadecimal` when checking if a value is a valid HTML hex color. */ - toBeHexadecimal(): void; + toBeHexadecimal(): R; /** * Use `.toHaveBeenCalledBefore` when checking if a `Mock` was called before another `Mock`. @@ -146,7 +146,7 @@ interface CustomMatchers { * @param {Mock} mock * @param {boolean} [failIfNoSecondInvocation=true] */ - toHaveBeenCalledBefore(mock: jest.MockInstance, failIfNoSecondInvocation: boolean): void; + toHaveBeenCalledBefore(mock: jest.MockInstance, failIfNoSecondInvocation: boolean): R; /** * Use `.toHaveBeenCalledAfter` when checking if a `Mock` was called after another `Mock`. @@ -156,52 +156,52 @@ interface CustomMatchers { * @param {Mock} mock * @param {boolean} [failIfNoFirstInvocation=true] */ - toHaveBeenCalledAfter(mock: jest.MockInstance, failIfNoFirstInvocation: boolean): void; + toHaveBeenCalledAfter(mock: jest.MockInstance, failIfNoFirstInvocation: boolean): R; /** * Use `.toHaveBeenCalledOnce` to check if a `Mock` was called exactly one time. */ - toHaveBeenCalledOnce(): void; + toHaveBeenCalledOnce(): R; /** * Use `.toHaveBeenCalledOnceWith` to check if a `Mock` was called exactly one time with the expected value. */ - toHaveBeenCalledOnceWith(): void; + toHaveBeenCalledOnceWith(): R; /** * Use `.toBeNumber` when checking if a value is a `Number`. */ - toBeNumber(): void; + toBeNumber(): R; /** * Use `.toBeNaN` when checking a value is `NaN`. */ - toBeNaN(): void; + toBeNaN(): R; /** * Use `.toBeFinite` when checking if a value is a `Number`, not `NaN` or `Infinity`. */ - toBeFinite(): void; + toBeFinite(): R; /** * Use `.toBePositive` when checking if a value is a positive `Number`. */ - toBePositive(): void; + toBePositive(): R; /** * Use `.toBeNegative` when checking if a value is a negative `Number`. */ - toBeNegative(): void; + toBeNegative(): R; /** * Use `.toBeEven` when checking if a value is an even `Number`. */ - toBeEven(): void; + toBeEven(): R; /** * Use `.toBeOdd` when checking if a value is an odd `Number`. */ - toBeOdd(): void; + toBeOdd(): R; /** * Use `.toBeWithin` when checking if a number is in between the given bounds of: start (inclusive) and end (exclusive). @@ -209,7 +209,7 @@ interface CustomMatchers { * @param {Number} start * @param {Number} end */ - toBeWithin(start: number, end: number): void; + toBeWithin(start: number, end: number): R; /** * Use `.toBeInRange` when checking if an array has elements in range min (inclusive) and max (inclusive). @@ -217,154 +217,154 @@ interface CustomMatchers { * @param min * @param max */ - toBeInRange(min: number, max: number): void; + toBeInRange(min: number, max: number): R; /** * Use `.toBeObject` when checking if a value is an `Object`. */ - toBeObject(): void; + toBeObject(): R; /** * Use `.toContainKey` when checking if an object contains the provided key. * * @param {String} key */ - toContainKey(key: string): void; + toContainKey(key: string): R; /** * Use `.toContainKeys` when checking if an object has all of the provided keys. * * @param {Array.} keys */ - toContainKeys(keys: readonly (keyof E | string)[]): void; + toContainKeys(keys: readonly (keyof E | string)[]): R; /** * Use `.toContainAllKeys` when checking if an object only contains all of the provided keys. * * @param {Array.} keys */ - toContainAllKeys(keys: readonly (keyof E | string)[]): void; + toContainAllKeys(keys: readonly (keyof E | string)[]): R; /** * Use `.toContainAnyKeys` when checking if an object contains at least one of the provided keys. * * @param {Array.} keys */ - toContainAnyKeys(keys: readonly (keyof E | string)[]): void; + toContainAnyKeys(keys: readonly (keyof E | string)[]): R; /** * Use `.toContainValue` when checking if an object contains the provided value. * * @param {*} value */ - toContainValue(value: E): void; + toContainValue(value: E): R; /** * Use `.toContainValues` when checking if an object contains all of the provided values. * * @param {Array.<*>} values */ - toContainValues(values: readonly E[]): void; + toContainValues(values: readonly E[]): R; /** * Use `.toContainAllValues` when checking if an object only contains all of the provided values. * * @param {Array.<*>} values */ - toContainAllValues(values: readonly E[]): void; + toContainAllValues(values: readonly E[]): R; /** * Use `.toContainAnyValues` when checking if an object contains at least one of the provided values. * * @param {Array.<*>} values */ - toContainAnyValues(values: readonly E[]): void; + toContainAnyValues(values: readonly E[]): R; /** * Use `.toContainEntry` when checking if an object contains the provided entry. * * @param {Array.<[keyof E, E[keyof E]>} entry */ - toContainEntry(entry: readonly [keyof E, E[keyof E]]): void; + toContainEntry(entry: readonly [keyof E, E[keyof E]]): R; /** * Use `.toContainEntries` when checking if an object contains all of the provided entries. * * @param {Array.>} entries */ - toContainEntries(entries: readonly (readonly [keyof E, E[keyof E]])[]): void; + toContainEntries(entries: readonly (readonly [keyof E, E[keyof E]])[]): R; /** * Use `.toContainAllEntries` when checking if an object only contains all of the provided entries. * * @param {Array.>} entries */ - toContainAllEntries(entries: readonly (readonly [keyof E, E[keyof E]])[]): void; + toContainAllEntries(entries: readonly (readonly [keyof E, E[keyof E]])[]): R; /** * Use `.toContainAnyEntries` when checking if an object contains at least one of the provided entries. * * @param {Array.>} entries */ - toContainAnyEntries(entries: readonly (readonly [keyof E, E[keyof E]])[]): void; + toContainAnyEntries(entries: readonly (readonly [keyof E, E[keyof E]])[]): R; /** * Use `.toBeExtensible` when checking if an object is extensible. */ - toBeExtensible(): void; + toBeExtensible(): R; /** * Use `.toBeFrozen` when checking if an object is frozen. */ - toBeFrozen(): void; + toBeFrozen(): R; /** * Use `.toBeSealed` when checking if an object is sealed. */ - toBeSealed(): void; + toBeSealed(): R; /** * Use `.toResolve` when checking if a promise resolves. */ - toResolve(): void; + toResolve(): R; /** * Use `.toReject` when checking if a promise rejects. */ - toReject(): void; + toReject(): R; /** * Use `.toBeString` when checking if a value is a `String`. */ - toBeString(): void; + toBeString(): R; /** * Use `.toEqualCaseInsensitive` when checking if a string is equal (===) to another ignoring the casing of both strings. * * @param {String} string */ - toEqualCaseInsensitive(string: string): void; + toEqualCaseInsensitive(string: string): R; /** * Use `.toStartWith` when checking if a `String` starts with a given `String` prefix. * * @param {String} prefix */ - toStartWith(prefix: string): void; + toStartWith(prefix: string): R; /** * Use `.toEndWith` when checking if a `String` ends with a given `String` suffix. * * @param {String} suffix */ - toEndWith(suffix: string): void; + toEndWith(suffix: string): R; /** * Use `.toInclude` when checking if a `String` includes the given `String` substring. * * @param {String} substring */ - toInclude(substring: string): void; + toInclude(substring: string): R; /** * Use `.toIncludeRepeated` when checking if a `String` includes the given `String` substring the correct number of times. @@ -372,14 +372,14 @@ interface CustomMatchers { * @param {String} substring * @param {Number} times */ - toIncludeRepeated(substring: string, times: number): void; + toIncludeRepeated(substring: string, times: number): R; /** * Use `.toIncludeMultiple` when checking if a `String` includes all of the given substrings. * * @param {Array.} substring */ - toIncludeMultiple(substring: readonly string[]): void; + toIncludeMultiple(substring: readonly string[]): R; /** * Use `.toThrowWithMessage` when checking if a callback function throws an error of a given type with a given error message. @@ -387,43 +387,43 @@ interface CustomMatchers { * @param {Function} type * @param {String | RegExp} message */ - toThrowWithMessage(type: (...args: any[]) => any, message: string | RegExp): void; + toThrowWithMessage(type: (...args: any[]) => any, message: string | RegExp): R; /** * Use `.toBeEmptyObject` when checking if a value is an empty `Object`. */ - toBeEmptyObject(): void; + toBeEmptyObject(): R; /** * Use `.toBeSymbol` when checking if a value is a `Symbol`. */ - toBeSymbol(): void; + toBeSymbol(): R; /** * Use `.toBeBetween` when checking if a date occurs between `startDate` and `endDate`. * @param {Date} startDate * @param {Date} endDate */ - toBeBetween(startDate: Date, endDate: Date): void; + toBeBetween(startDate: Date, endDate: Date): R; /** * Use `.toBeBeforeOrEqualTo` when checking if a date equals to or occurs before `date`. * @param {Date} date */ - toBeBeforeOrEqualTo(date: Date): void; + toBeBeforeOrEqualTo(date: Date): R; /** * Use `.toBeAfterOrEqualTo` when checking if a date equals to or occurs after `date`. * @param {Date} date */ - toBeAfterOrEqualTo(date: Date): void; + toBeAfterOrEqualTo(date: Date): R; /** * Use `.toEqualIgnoringWhitespace` when checking if a `String` is equal (===) to given `String` ignoring white-space. * * @param {String} string */ - toEqualIgnoringWhitespace(string: string): void; + toEqualIgnoringWhitespace(string: string): R; } declare namespace jest { @@ -873,7 +873,7 @@ declare namespace jest { // noinspection JSUnusedGlobalSymbols // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface Expect extends CustomMatchers {} + interface Expect extends CustomMatchers {} // noinspection JSUnusedGlobalSymbols // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -882,5 +882,5 @@ declare namespace jest { declare namespace Vi { // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface AsymmetricMatchersContaining extends CustomMatchers {} + interface AsymmetricMatchersContaining extends CustomMatchers {} } From cb871f5d7018c65a3e90e7b3650cd4264d219e3c Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Mon, 9 Jan 2023 13:48:52 +0200 Subject: [PATCH 2/2] fix(types): replace with any --- types/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/types/index.d.ts b/types/index.d.ts index 235d899b..8fbafed5 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -873,7 +873,7 @@ declare namespace jest { // noinspection JSUnusedGlobalSymbols // eslint-disable-next-line @typescript-eslint/no-empty-interface - interface Expect extends CustomMatchers {} + interface Expect extends CustomMatchers {} // noinspection JSUnusedGlobalSymbols // eslint-disable-next-line @typescript-eslint/no-empty-interface