diff --git a/apps/hyperdrive-trading/src/appconfig/chains/supportedChains.ts b/apps/hyperdrive-trading/src/appconfig/chains/supportedChains.ts index f0b26fd76..75a68531e 100644 --- a/apps/hyperdrive-trading/src/appconfig/chains/supportedChains.ts +++ b/apps/hyperdrive-trading/src/appconfig/chains/supportedChains.ts @@ -1,3 +1,3 @@ export const supportedChainIds = [42069, 31337] as const; -export type SupportedChainId = (typeof supportedChainIds)[number]; +export type SupportedChainId = typeof supportedChainIds[number]; diff --git a/package.json b/package.json index 1da49cb25..e222ce74b 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "dev": "turbo run dev --parallel --filter=./apps/*", "lint": "turbo run lint", "lint:packages": "turbo run lint --filter=./packages/*", + "test": "turbo run test --filter=./packages/*", + "test:run": "turbo run test:run --filter=./packages/*", "format": "turbo run format", "format:check": "turbo run format:check", "postinstall": "husky install" diff --git a/packages/contract-stub/package.json b/packages/contract-stub/package.json index 969dbcb8c..b04d12b08 100644 --- a/packages/contract-stub/package.json +++ b/packages/contract-stub/package.json @@ -14,8 +14,6 @@ "scripts": { "watch": "parcel watch", "build": "parcel build", - "test": "vitest run", - "test:watch": "vitest", "build:typechain": "typechain --target=ethers-v5 src/abis/* --out-dir src/types" }, "dependencies": { diff --git a/packages/contract-stub/src/stubContract.test.ts b/packages/contract-stub/src/stubContract.test.ts deleted file mode 100644 index afa344f07..000000000 --- a/packages/contract-stub/src/stubContract.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { BigNumber, ethers, Wallet } from "ethers"; -import { stubContract } from "./stubContract"; -import { MockProvider } from "@wagmi/connectors/mock"; -import { stub } from "sinon"; -import { ERC20, ERC20__factory } from "src/types"; -import { test, expect } from "vitest"; -import { ApprovalEvent } from "src/types/ERC20"; - -test("Stubs callStatic methods correctly", async () => { - const stubbedContract = setupMockERC20(); - // should throw an error if stub's resolve value was never set - expect(() => stubbedContract.callStatic.decimals()).toThrow(); - - stubbedContract.callStatic.decimals.resolves(18); - const decimals = await stubbedContract.callStatic.decimals(); - expect(decimals).toEqual(18); -}); - -test("Stubs functions methods correctly", async () => { - const stubbedContract = setupMockERC20(); - - // should throw an error if stub's resolve value was never set - expect(() => stubbedContract.functions.decimals()).toThrow(); - - stubbedContract.functions.decimals.resolves([18]); - const decimals = await stubbedContract.functions.decimals(); - expect(decimals).toEqual([18]); -}); - -test("Stubs estimateGas methods correctly", async () => { - const stubbedContract = setupMockERC20(); - - // should throw an error if stub's resolve value was never set - expect(() => - stubbedContract.estimateGas.approve(ethers.constants.AddressZero, 100), - ).toThrow(); - - stubbedContract.estimateGas.approve.resolves(BigNumber.from(555)); - const gasToBurn100Tokens = await stubbedContract.estimateGas.approve( - ethers.constants.AddressZero, - 100, - ); - expect(gasToBurn100Tokens).toEqual(BigNumber.from(555)); -}); - -test("Stubs queryFilter correctly", async () => { - const stubbedContract = setupMockERC20(); - - const filter = stubbedContract.filters.Approval(); - - // should throw an error if stub's resolve value was never set - expect(() => stubbedContract.queryFilter(filter)).toThrow(); - - const getBlockStub = stub().resolves(12345678); - - stubbedContract.queryFilter.resolves([ - { - args: [], - getBlock: getBlockStub, - }, - ] as unknown as ApprovalEvent[]); - const approvalEvents = await stubbedContract.queryFilter(filter); - expect(approvalEvents).toEqual([ - { - args: [], - getBlock: getBlockStub, - }, - ]); -}); - -function setupMockERC20() { - const mockProvider = new MockProvider({ - chainId: 1, - signer: new Wallet( - "d1b0c40a9943d53459302ccf9003ef9666b9235dfc3220ea1f0422a886615511", - ), - }); - - return stubContract( - ERC20__factory.connect(ethers.constants.AddressZero, mockProvider), - ); -} diff --git a/packages/hyperdrive/package.json b/packages/hyperdrive/package.json index c9204aa9b..1f709f3e7 100644 --- a/packages/hyperdrive/package.json +++ b/packages/hyperdrive/package.json @@ -14,7 +14,9 @@ }, "scripts": { "watch": "parcel watch", - "build": "tsc --noEmit && parcel build --no-cache" + "build": "tsc --noEmit && parcel build --no-cache", + "test": "vitest", + "test:run": "vitest run" }, "devDependencies": { "@hyperdrive/eslint-config": "*", diff --git a/packages/hyperdrive/src/test/multiplyBigInt.test.ts b/packages/hyperdrive/src/test/multiplyBigInt.test.ts new file mode 100644 index 000000000..1dab0b27c --- /dev/null +++ b/packages/hyperdrive/src/test/multiplyBigInt.test.ts @@ -0,0 +1,29 @@ +import { multiplyBigInt } from "src/base/multiplyBigInt"; +import { expect, test } from "vitest"; + +test("multiplyBigInt: simple multiplication", async () => { + const result = multiplyBigInt([500n, 50n], 2); + expect(result).toEqual(250n); +}); + +test("multiplyBigInt: when values array is empty", async () => { + const result = multiplyBigInt([], 2); + expect(result).toEqual(0n); +}); + +test("multiplyBigInt: single value input", async () => { + const result = multiplyBigInt([10n], 2); + expect(result).toEqual(10n); +}); + +test("multiplyBigInt: multiplying with zero", async () => { + const result = multiplyBigInt([500n, 0n], 2); + expect(result).toEqual(0n); +}); + +test("multiplyBigInt: multiplying multiple bigint values", async () => { + // Test case: multiplying three values + // Let's say our values are [2000n, 300n, 50n] and for 2 decimals, this translates to 20.00 * 3.00 * 0.50 = 30.00 + const result = multiplyBigInt([2000n, 300n, 50n], 2); + expect(result).toEqual(3000n); +}); diff --git a/packages/hyperdrive/vite.config.ts b/packages/hyperdrive/vite.config.ts new file mode 100644 index 000000000..ca090075b --- /dev/null +++ b/packages/hyperdrive/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; +import type { UserConfig as VitestUserConfigInterface } from "vitest/config"; + +const vitestConfig: VitestUserConfigInterface = { + test: { + // https://vitest.dev/config + }, +}; + +export default defineConfig({ + test: vitestConfig.test, +}); diff --git a/turbo.json b/turbo.json index ad085f1a8..988757ef5 100644 --- a/turbo.json +++ b/turbo.json @@ -16,6 +16,14 @@ "cache": false }, "format": { "outputs": [] }, - "format:check": { "outputs": [] } + "format:check": { "outputs": [] }, + "test": { + "dependsOn": ["build"], + "inputs": ["test/**/*.ts", "test/**/*.tsx"] + }, + "test:run": { + "dependsOn": ["build"], + "inputs": ["test/**/*.ts", "test/**/*.tsx"] + } } }