From a17f9ed0f80bb68a9a052bd34b5a8875447461df Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sat, 12 Feb 2022 21:34:40 +0900 Subject: [PATCH 1/8] test: add test case --- test/core/test/jest-expect.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 7b9379baad02..4388c12dbaa4 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -22,8 +22,11 @@ describe('jest-expect', () => { expect([{ text: 'Hello' }]).toContainEqual({ text: 'Hello' }) expect([{ text: 'Bye' }]).not.toContainEqual({ text: 'Hello' }) expect(1).toBeGreaterThan(0) + expect(BigInt(2)).toBeGreaterThan(0) expect(1).toBeGreaterThanOrEqual(1) expect(1).toBeGreaterThanOrEqual(0) + expect(BigInt(1)).toBeGreaterThan(1) + expect(BigInt(10)).toBeGreaterThanOrEqual(0) expect(0).toBeLessThan(1) expect(1).toBeLessThanOrEqual(1) expect(0).toBeLessThanOrEqual(1) From c5b6f06cb966b3162eacfd7d872eeb09395fddab Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sat, 12 Feb 2022 23:12:29 +0900 Subject: [PATCH 2/8] fix: support bigint --- packages/vitest/src/index.ts | 2 +- .../src/integrations/chai/jest-expect.ts | 29 +++++++++++++++++-- test/core/test/jest-expect.test.ts | 6 ++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/packages/vitest/src/index.ts b/packages/vitest/src/index.ts index b2153a113f05..9bd542b4391b 100644 --- a/packages/vitest/src/index.ts +++ b/packages/vitest/src/index.ts @@ -84,7 +84,7 @@ declare global { toContainEqual(item: E): void toBeTruthy(): void toBeFalsy(): void - toBeGreaterThan(num: number): void + toBeGreaterThan(num: number | bigint): void toBeGreaterThanOrEqual(num: number): void toBeLessThan(num: number): void toBeLessThanOrEqual(num: number): void diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 77a8ea29418a..9a398988bcbe 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -160,8 +160,33 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { obj, ) }) - def('toBeGreaterThan', function(expected: number) { - return this.to.greaterThan(expected) + def('toBeGreaterThan', function(expected: number | bigint) { + const actual = this._obj + if (typeof actual !== 'number' && typeof actual !== 'bigint') { + return this.assert( + false, + `expected "${actual}" to be a number or bigint`, + `expected "${actual}" to be a number or bigint`, + actual, + expected, + ) + } + if (typeof expected !== 'number' && typeof expected !== 'bigint') { + return this.assert( + false, + `expected "${expected}" to be a number or bigint`, + `expected "${expected}" to be a number or bigint`, + actual, + expected, + ) + } + return this.assert( + actual > expected, + `expected ${actual} to be above ${expected}`, + `expected ${actual} not to be above ${expected}`, + actual, + expected, + ) }) def('toBeGreaterThanOrEqual', function(expected: number) { return this.to.greaterThanOrEqual(expected) diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 4388c12dbaa4..ab05f264546e 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -22,11 +22,11 @@ describe('jest-expect', () => { expect([{ text: 'Hello' }]).toContainEqual({ text: 'Hello' }) expect([{ text: 'Bye' }]).not.toContainEqual({ text: 'Hello' }) expect(1).toBeGreaterThan(0) - expect(BigInt(2)).toBeGreaterThan(0) + expect(BigInt(1)).toBeGreaterThan(BigInt(0)) + expect(1).toBeGreaterThan(BigInt(0)) + expect(BigInt(1)).toBeGreaterThan(0) expect(1).toBeGreaterThanOrEqual(1) expect(1).toBeGreaterThanOrEqual(0) - expect(BigInt(1)).toBeGreaterThan(1) - expect(BigInt(10)).toBeGreaterThanOrEqual(0) expect(0).toBeLessThan(1) expect(1).toBeLessThanOrEqual(1) expect(0).toBeLessThanOrEqual(1) From eac30abd188468450dfab10420f233e2278acfd9 Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sat, 12 Feb 2022 23:15:59 +0900 Subject: [PATCH 3/8] test: add test cases --- packages/vitest/src/index.ts | 2 +- test/core/test/jest-expect.test.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/index.ts b/packages/vitest/src/index.ts index 9bd542b4391b..71be2775f4d4 100644 --- a/packages/vitest/src/index.ts +++ b/packages/vitest/src/index.ts @@ -85,7 +85,7 @@ declare global { toBeTruthy(): void toBeFalsy(): void toBeGreaterThan(num: number | bigint): void - toBeGreaterThanOrEqual(num: number): void + toBeGreaterThanOrEqual(num: number | bigint): void toBeLessThan(num: number): void toBeLessThanOrEqual(num: number): void toBeNaN(): void diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index ab05f264546e..34d56cf910af 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -22,11 +22,19 @@ describe('jest-expect', () => { expect([{ text: 'Hello' }]).toContainEqual({ text: 'Hello' }) expect([{ text: 'Bye' }]).not.toContainEqual({ text: 'Hello' }) expect(1).toBeGreaterThan(0) + expect(BigInt(1)).toBeGreaterThan(BigInt(0)) expect(1).toBeGreaterThan(BigInt(0)) expect(BigInt(1)).toBeGreaterThan(0) + expect(1).toBeGreaterThanOrEqual(1) expect(1).toBeGreaterThanOrEqual(0) + + expect(BigInt(1)).toBeGreaterThanOrEqual(BigInt(1)) + expect(BigInt(1)).toBeGreaterThanOrEqual(BigInt(0)) + expect(BigInt(1)).toBeGreaterThanOrEqual(1) + expect(1).toBeGreaterThanOrEqual(BigInt(1)) + expect(0).toBeLessThan(1) expect(1).toBeLessThanOrEqual(1) expect(0).toBeLessThanOrEqual(1) From d38b7e0ba6a9557c45189347f064ebf111789f8a Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sat, 12 Feb 2022 23:26:24 +0900 Subject: [PATCH 4/8] feat: support bigint for to-be-greater-than-or-equal --- .../src/integrations/chai/jest-expect.ts | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 9a398988bcbe..3d7cd7340981 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -189,7 +189,32 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { ) }) def('toBeGreaterThanOrEqual', function(expected: number) { - return this.to.greaterThanOrEqual(expected) + const actual = this._obj + if (typeof actual !== 'number' && typeof actual !== 'bigint') { + return this.assert( + false, + `expected "${actual}" to be a number or bigint`, + `expected "${actual}" to be a number or bigint`, + actual, + expected, + ) + } + if (typeof expected !== 'number' && typeof expected !== 'bigint') { + return this.assert( + false, + `expected "${expected}" to be a number or bigint`, + `expected "${expected}" to be a number or bigint`, + actual, + expected, + ) + } + return this.assert( + actual >= expected, + `expected ${actual} to be above ${expected}`, + `expected ${actual} not to be above ${expected}`, + actual, + expected, + ) }) def('toBeLessThan', function(expected: number) { return this.to.lessThan(expected) From 08f44e010638d1a2307b6d3f6ed808a5878915b4 Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sun, 13 Feb 2022 16:24:15 +0900 Subject: [PATCH 5/8] feat: add assert-types to utils --- packages/vitest/src/utils/base.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/vitest/src/utils/base.ts b/packages/vitest/src/utils/base.ts index e404697d6d2b..83d05ec8305a 100644 --- a/packages/vitest/src/utils/base.ts +++ b/packages/vitest/src/utils/base.ts @@ -99,3 +99,11 @@ export function deepMerge(targe function isMergableObject(item: any): item is Object { return isPlainObject(item) && !Array.isArray(item) } + +export function assertTypes(item: unknown, name: string, types: string[]): void { + const receivedType = typeof item + const pass = types.some((type) => { + return receivedType === typeof type + }) + if (!pass) throw new Error(`"${name}" value must be ${types.join('or')}, received ${receivedType}`) +} From 7dae1925fb3e9502914beb12eb61a7b15b6a3e90 Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sun, 13 Feb 2022 17:54:10 +0900 Subject: [PATCH 6/8] fix: rewrite type check --- .../src/integrations/chai/jest-expect.ts | 41 +++---------------- packages/vitest/src/utils/base.ts | 10 ++--- test/core/test/utils.spec.ts | 20 ++++++++- 3 files changed, 28 insertions(+), 43 deletions(-) diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 3d7cd7340981..8de1f48bfd2e 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -2,6 +2,7 @@ import type { EnhancedSpy } from '../jest-mock' import { isMockFunction } from '../jest-mock' import { addSerializer } from '../snapshot/port/plugins' import type { Constructable } from '../../types' +import { assertTypes } from '../../utils' import type { ChaiPlugin, MatcherState } from './types' import { arrayBufferEquality, iterableEquality, equals as jestEquals, sparseArrayEquality, subsetEquality, typeEquality } from './jest-utils' import type { AsymmetricMatcher } from './jest-asymmetric-matchers' @@ -162,24 +163,8 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { }) def('toBeGreaterThan', function(expected: number | bigint) { const actual = this._obj - if (typeof actual !== 'number' && typeof actual !== 'bigint') { - return this.assert( - false, - `expected "${actual}" to be a number or bigint`, - `expected "${actual}" to be a number or bigint`, - actual, - expected, - ) - } - if (typeof expected !== 'number' && typeof expected !== 'bigint') { - return this.assert( - false, - `expected "${expected}" to be a number or bigint`, - `expected "${expected}" to be a number or bigint`, - actual, - expected, - ) - } + assertTypes(actual, 'actual', ['number', 'bigint']) + assertTypes(expected, 'expected', ['number', 'bigint']) return this.assert( actual > expected, `expected ${actual} to be above ${expected}`, @@ -190,24 +175,8 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { }) def('toBeGreaterThanOrEqual', function(expected: number) { const actual = this._obj - if (typeof actual !== 'number' && typeof actual !== 'bigint') { - return this.assert( - false, - `expected "${actual}" to be a number or bigint`, - `expected "${actual}" to be a number or bigint`, - actual, - expected, - ) - } - if (typeof expected !== 'number' && typeof expected !== 'bigint') { - return this.assert( - false, - `expected "${expected}" to be a number or bigint`, - `expected "${expected}" to be a number or bigint`, - actual, - expected, - ) - } + assertTypes(actual, 'actual', ['number', 'bigint']) + assertTypes(expected, 'expected', ['number', 'bigint']) return this.assert( actual >= expected, `expected ${actual} to be above ${expected}`, diff --git a/packages/vitest/src/utils/base.ts b/packages/vitest/src/utils/base.ts index 83d05ec8305a..ce44a3303098 100644 --- a/packages/vitest/src/utils/base.ts +++ b/packages/vitest/src/utils/base.ts @@ -100,10 +100,8 @@ function isMergableObject(item: any): item is Object { return isPlainObject(item) && !Array.isArray(item) } -export function assertTypes(item: unknown, name: string, types: string[]): void { - const receivedType = typeof item - const pass = types.some((type) => { - return receivedType === typeof type - }) - if (!pass) throw new Error(`"${name}" value must be ${types.join('or')}, received ${receivedType}`) +export function assertTypes(value: unknown, name: string, types: string[]): void { + const receivedType = typeof value + const pass = types.includes(receivedType) + if (!pass) throw new TypeError(`${name} value must be ${types.join(' or ')}, received "${receivedType}"`) } diff --git a/test/core/test/utils.spec.ts b/test/core/test/utils.spec.ts index 4b084e3dd1ff..ac0cb0abcec1 100644 --- a/test/core/test/utils.spec.ts +++ b/test/core/test/utils.spec.ts @@ -1,7 +1,25 @@ import { describe, expect, test } from 'vitest' -import { deepMerge } from '../../../packages/vitest/src/utils' +import { assertTypes, deepMerge } from '../../../packages/vitest/src/utils' import { deepMergeSnapshot } from '../../../packages/vitest/src/integrations/snapshot/port/utils' +describe('assertTypes', () => { + test('the type of value should be number', () => { + const value = 5 + const value_string = '5' + assertTypes(value, 'value', ['number']) + expect(() => assertTypes(value_string, 'value_string', ['number'])).toThrow() + }) + + test('the type of value should be number or BigInt', () => { + const value_number = 5 + const value_bigint = BigInt(5) + const value_string = '5' + assertTypes(value_number, 'value_number', ['number', 'bigint']) + assertTypes(value_bigint, 'value_bigint', ['number', 'bigint']) + expect(() => assertTypes(value_string, 'value_string', ['number', 'bigint'])).toThrow() + }) +}) + describe('deepMerge', () => { test('non plain objects retain their prototype, arrays are not merging, plain objects are merging', () => { class Test { From 301abc2d60b19d3a0db72ed3f0d54f9b64f351e2 Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sun, 13 Feb 2022 20:05:03 +0900 Subject: [PATCH 7/8] feat: support bigint for to-be-less-than --- packages/vitest/src/index.ts | 4 +-- .../src/integrations/chai/jest-expect.ts | 28 +++++++++++++++---- test/core/test/jest-expect.test.ts | 8 ++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/vitest/src/index.ts b/packages/vitest/src/index.ts index 71be2775f4d4..71c19acb9d94 100644 --- a/packages/vitest/src/index.ts +++ b/packages/vitest/src/index.ts @@ -86,8 +86,8 @@ declare global { toBeFalsy(): void toBeGreaterThan(num: number | bigint): void toBeGreaterThanOrEqual(num: number | bigint): void - toBeLessThan(num: number): void - toBeLessThanOrEqual(num: number): void + toBeLessThan(num: number | bigint): void + toBeLessThanOrEqual(num: number | bigint): void toBeNaN(): void toBeUndefined(): void toBeNull(): void diff --git a/packages/vitest/src/integrations/chai/jest-expect.ts b/packages/vitest/src/integrations/chai/jest-expect.ts index 8de1f48bfd2e..ee93b06a3b7d 100644 --- a/packages/vitest/src/integrations/chai/jest-expect.ts +++ b/packages/vitest/src/integrations/chai/jest-expect.ts @@ -173,7 +173,7 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { expected, ) }) - def('toBeGreaterThanOrEqual', function(expected: number) { + def('toBeGreaterThanOrEqual', function(expected: number | bigint) { const actual = this._obj assertTypes(actual, 'actual', ['number', 'bigint']) assertTypes(expected, 'expected', ['number', 'bigint']) @@ -185,11 +185,29 @@ export const JestChaiExpect: ChaiPlugin = (chai, utils) => { expected, ) }) - def('toBeLessThan', function(expected: number) { - return this.to.lessThan(expected) + def('toBeLessThan', function(expected: number | bigint) { + const actual = this._obj + assertTypes(actual, 'actual', ['number', 'bigint']) + assertTypes(expected, 'expected', ['number', 'bigint']) + return this.assert( + actual < expected, + `expected ${actual} to be above ${expected}`, + `expected ${actual} not to be above ${expected}`, + actual, + expected, + ) }) - def('toBeLessThanOrEqual', function(expected: number) { - return this.to.lessThanOrEqual(expected) + def('toBeLessThanOrEqual', function(expected: number | bigint) { + const actual = this._obj + assertTypes(actual, 'actual', ['number', 'bigint']) + assertTypes(expected, 'expected', ['number', 'bigint']) + return this.assert( + actual <= expected, + `expected ${actual} to be above ${expected}`, + `expected ${actual} not to be above ${expected}`, + actual, + expected, + ) }) def('toBeNaN', function() { return this.be.NaN diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 34d56cf910af..39e934511c37 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -36,8 +36,16 @@ describe('jest-expect', () => { expect(1).toBeGreaterThanOrEqual(BigInt(1)) expect(0).toBeLessThan(1) + expect(BigInt(0)).toBeLessThan(BigInt(1)) + expect(BigInt(0)).toBeLessThan(1) + expect(1).toBeLessThanOrEqual(1) expect(0).toBeLessThanOrEqual(1) + expect(BigInt(1)).toBeLessThanOrEqual(BigInt(1)) + expect(BigInt(0)).toBeLessThanOrEqual(BigInt(1)) + expect(BigInt(1)).toBeLessThanOrEqual(1) + expect(1).toBeLessThanOrEqual(BigInt(1)) + expect(() => { throw new Error('this is the error message') }).toThrow('this is the error message') From dd68bf9bf32887fe05f096a0d17285bf1f27c604 Mon Sep 17 00:00:00 2001 From: togami2864 Date: Sun, 13 Feb 2022 20:07:57 +0900 Subject: [PATCH 8/8] chore: update docs --- docs/api/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/api/index.md b/docs/api/index.md index e48de4e57cdb..cbb66213500f 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -460,7 +460,7 @@ TODO ### toBeGreaterThan -- **Type:** `(n: number) => Awaitable` +- **Type:** `(n: number | bigint) => Awaitable` `toBeGreaterThan` asserts if actual value is greater than received one. Equal values will fail the test. @@ -475,7 +475,7 @@ TODO ### toBeGreaterThanOrEqual -- **Type:** `(n: number) => Awaitable` +- **Type:** `(n: number | bigint) => Awaitable` `toBeGreaterThanOrEqual` asserts if actual value is greater than received one or equal to it. @@ -490,7 +490,7 @@ TODO ### toBeLessThan -- **Type:** `(n: number) => Awaitable` +- **Type:** `(n: number | bigint) => Awaitable` `toBeLessThan` asserts if actual value is less than received one. Equal values will fail the test. @@ -505,7 +505,7 @@ TODO ### toBeLessThanOrEqual -- **Type:** `(n: number) => Awaitable` +- **Type:** `(n: number | bigint) => Awaitable` `toBeLessThanOrEqual` asserts if actual value is less than received one or equal to it. @@ -596,7 +596,7 @@ TODO - **Type:** `(received: any) => Awaitable` - `toContainEqual` asserts if an item with a specific structure and values is contained in an array. + `toContainEqual` asserts if an item with a specific structure and values is contained in an array. It works like [`toEqual`](#toequal) inside for each element. ```ts @@ -761,7 +761,7 @@ TODO ```ts import { test, expect } from 'vitest' - + function getFruitStock(type) { if (type === 'pineapples') { throw new DiabetesError('Pineapples is not good for people with diabetes')