import { blockchainTests, describe, testCombinatoriallyWithReferenceFunc, uint256Values, } from '@0x/contracts-test-utils'; import { BigNumber } from '@0x/utils'; import * as _ from 'lodash'; import { artifacts, ReferenceFunctions, TestLibsContract } from '../src'; const CHAIN_ID = 1337; blockchainTests('LibMath', env => { let libsContract: TestLibsContract; before(async () => { libsContract = await TestLibsContract.deployFrom0xArtifactAsync( artifacts.TestLibs, env.provider, env.txDefaults, new BigNumber(CHAIN_ID), ); }); // Wrap a reference function with identical arguments in a promise. function createAsyncReferenceFunction( ref: (...args: any[]) => T, ): (...args: any[]) => Promise { return async (...args: any[]): Promise => { return ref(...args); }; } function createContractTestFunction( name: string, ): (...args: any[]) => Promise { return async (...args: any[]): Promise => { const method = (libsContract as any)[name] as { callAsync: (...args: any[]) => Promise }; return method.callAsync(...args); }; } describe('getPartialAmountFloor', () => { describe.optional('combinatorial tests', () => { testCombinatoriallyWithReferenceFunc( 'getPartialAmountFloor', createAsyncReferenceFunction(ReferenceFunctions.getPartialAmountFloor), createContractTestFunction('getPartialAmountFloor'), [uint256Values, uint256Values, uint256Values], ); }); }); describe('getPartialAmountCeil', () => { describe.optional('combinatorial tests', () => { testCombinatoriallyWithReferenceFunc( 'getPartialAmountCeil', createAsyncReferenceFunction(ReferenceFunctions.getPartialAmountCeil), createContractTestFunction('getPartialAmountCeil'), [uint256Values, uint256Values, uint256Values], ); }); }); describe('safeGetPartialAmountFloor', () => { describe.optional('combinatorial tests', () => { testCombinatoriallyWithReferenceFunc( 'safeGetPartialAmountFloor', createAsyncReferenceFunction(ReferenceFunctions.safeGetPartialAmountFloor), createContractTestFunction('safeGetPartialAmountFloor'), [uint256Values, uint256Values, uint256Values], ); }); }); describe('safeGetPartialAmountCeil', () => { describe.optional('combinatorial tests', () => { testCombinatoriallyWithReferenceFunc( 'safeGetPartialAmountCeil', createAsyncReferenceFunction(ReferenceFunctions.safeGetPartialAmountCeil), createContractTestFunction('safeGetPartialAmountCeil'), [uint256Values, uint256Values, uint256Values], ); }); }); describe('isRoundingErrorFloor', () => { describe.optional('combinatorial tests', () => { testCombinatoriallyWithReferenceFunc( 'isRoundingErrorFloor', createAsyncReferenceFunction(ReferenceFunctions.isRoundingErrorFloor), createContractTestFunction('isRoundingErrorFloor'), [uint256Values, uint256Values, uint256Values], ); }); }); describe('isRoundingErrorCeil', () => { describe.optional('combinatorial tests', () => { testCombinatoriallyWithReferenceFunc( 'isRoundingErrorCeil', createAsyncReferenceFunction(ReferenceFunctions.isRoundingErrorCeil), createContractTestFunction('isRoundingErrorCeil'), [uint256Values, uint256Values, uint256Values], ); }); }); });