Add tests for getPartialAmountCeil
This commit is contained in:
parent
5d70df771b
commit
3dad6ee55e
@ -79,6 +79,23 @@ contract TestExchangeInternals is
|
|||||||
return getPartialAmount(numerator, denominator, target);
|
return getPartialAmount(numerator, denominator, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @dev Calculates partial value given a numerator and denominator.
|
||||||
|
/// @param numerator Numerator.
|
||||||
|
/// @param denominator Denominator.
|
||||||
|
/// @param target Value to calculate partial of.
|
||||||
|
/// @return Partial value of target.
|
||||||
|
function publicGetPartialAmountCeil(
|
||||||
|
uint256 numerator,
|
||||||
|
uint256 denominator,
|
||||||
|
uint256 target
|
||||||
|
)
|
||||||
|
public
|
||||||
|
pure
|
||||||
|
returns (uint256 partialAmount)
|
||||||
|
{
|
||||||
|
return getPartialAmountCeil(numerator, denominator, target);
|
||||||
|
}
|
||||||
|
|
||||||
/// @dev Checks if rounding error > 0.1%.
|
/// @dev Checks if rounding error > 0.1%.
|
||||||
/// @param numerator Numerator.
|
/// @param numerator Numerator.
|
||||||
/// @param denominator Denominator.
|
/// @param denominator Denominator.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { BlockchainLifecycle } from '@0xproject/dev-utils';
|
import { BlockchainLifecycle } from '@0xproject/dev-utils';
|
||||||
import { Order, RevertReason, SignedOrder } from '@0xproject/types';
|
import { Order, RevertReason, SignedOrder } from '@0xproject/types';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
|
import * as chai from 'chai';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
import { TestExchangeInternalsContract } from '../../generated_contract_wrappers/test_exchange_internals';
|
import { TestExchangeInternalsContract } from '../../generated_contract_wrappers/test_exchange_internals';
|
||||||
@ -16,6 +17,8 @@ import { FillResults } from '../utils/types';
|
|||||||
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
|
import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
|
||||||
|
|
||||||
chaiSetup.configure();
|
chaiSetup.configure();
|
||||||
|
const expect = chai.expect;
|
||||||
|
|
||||||
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
|
||||||
|
|
||||||
const MAX_UINT256 = new BigNumber(2).pow(256).minus(1);
|
const MAX_UINT256 = new BigNumber(2).pow(256).minus(1);
|
||||||
@ -213,6 +216,43 @@ describe('Exchange core internal functions', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe.only('getPartialAmountCeil', async () => {
|
||||||
|
async function referenceGetPartialAmountCeilAsync(
|
||||||
|
numerator: BigNumber,
|
||||||
|
denominator: BigNumber,
|
||||||
|
target: BigNumber,
|
||||||
|
) {
|
||||||
|
if (denominator.eq(0)) {
|
||||||
|
throw new Error('revert DIVISION_BY_ZERO');
|
||||||
|
}
|
||||||
|
const product = numerator.mul(target);
|
||||||
|
const offset = product.add(denominator.sub(1));
|
||||||
|
if (offset.greaterThan(MAX_UINT256)) {
|
||||||
|
throw overflowErrorForCall;
|
||||||
|
}
|
||||||
|
const result = offset.dividedToIntegerBy(denominator);
|
||||||
|
if (product.mod(denominator).eq(0)) {
|
||||||
|
expect(result.mul(denominator)).to.be.bignumber.eq(product);
|
||||||
|
} else {
|
||||||
|
expect(result.mul(denominator)).to.be.bignumber.gt(product);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
async function testGetPartialAmountCeilAsync(
|
||||||
|
numerator: BigNumber,
|
||||||
|
denominator: BigNumber,
|
||||||
|
target: BigNumber,
|
||||||
|
): Promise<BigNumber> {
|
||||||
|
return testExchange.publicGetPartialAmountCeil.callAsync(numerator, denominator, target);
|
||||||
|
}
|
||||||
|
await testCombinatoriallyWithReferenceFuncAsync(
|
||||||
|
'getPartialAmountCeil',
|
||||||
|
referenceGetPartialAmountCeilAsync,
|
||||||
|
testGetPartialAmountCeilAsync,
|
||||||
|
[uint256Values, uint256Values, uint256Values],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
describe('isRoundingError', async () => {
|
describe('isRoundingError', async () => {
|
||||||
async function referenceIsRoundingErrorAsync(
|
async function referenceIsRoundingErrorAsync(
|
||||||
numerator: BigNumber,
|
numerator: BigNumber,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user