71 lines
2.2 KiB
Solidity
71 lines
2.2 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity 0.8.36;
|
|
|
|
import {Test} from "forge-std/Test.sol";
|
|
import {Math} from "../src/libraries/Math.sol";
|
|
import {FluxLibrary} from "../src/libraries/FluxLibrary.sol";
|
|
|
|
contract LibHarness {
|
|
function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256) {
|
|
return FluxLibrary.quote(amountA, reserveA, reserveB);
|
|
}
|
|
|
|
function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) external pure returns (uint256) {
|
|
return FluxLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
|
|
}
|
|
}
|
|
|
|
contract MathTest is Test {
|
|
LibHarness private harness;
|
|
|
|
function setUp() public {
|
|
harness = new LibHarness();
|
|
}
|
|
|
|
function testSqrtSmallValues() public pure {
|
|
assertEq(Math.sqrt(0), 0);
|
|
assertEq(Math.sqrt(1), 1);
|
|
assertEq(Math.sqrt(2), 1);
|
|
assertEq(Math.sqrt(3), 1);
|
|
assertEq(Math.sqrt(4), 2);
|
|
assertEq(Math.sqrt(15), 3);
|
|
assertEq(Math.sqrt(16), 4);
|
|
assertEq(Math.sqrt(99), 9);
|
|
assertEq(Math.sqrt(100), 10);
|
|
}
|
|
|
|
function testSqrtLargeValue() public pure {
|
|
assertEq(Math.sqrt(100e18 * 400e18), 2e20);
|
|
assertEq(Math.sqrt(type(uint256).max), 340282366920938463463374607431768211455);
|
|
}
|
|
|
|
function testMin() public pure {
|
|
assertEq(Math.min(3, 7), 3);
|
|
assertEq(Math.min(7, 3), 3);
|
|
assertEq(Math.min(5, 5), 5);
|
|
}
|
|
|
|
function testQuote() public pure {
|
|
assertEq(FluxLibrary.quote(10e18, 100e18, 400e18), 40e18);
|
|
assertEq(FluxLibrary.quote(50e18, 100e18, 400e18), 200e18);
|
|
}
|
|
|
|
function testGetAmountOut() public pure {
|
|
assertEq(FluxLibrary.getAmountOut(10e18, 100e18, 400e18), 36264435755205965263);
|
|
}
|
|
|
|
function testGetAmountIn() public pure {
|
|
assertEq(FluxLibrary.getAmountIn(50e18, 100e18, 400e18), 14328700386874910446);
|
|
}
|
|
|
|
function testQuoteRevertsOnZeroLiquidity() public {
|
|
vm.expectRevert(bytes("FluxLibrary: INSUFFICIENT_LIQUIDITY"));
|
|
harness.quote(10e18, 0, 400e18);
|
|
}
|
|
|
|
function testGetAmountOutRevertsOnZeroInput() public {
|
|
vm.expectRevert(bytes("FluxLibrary: INSUFFICIENT_INPUT_AMOUNT"));
|
|
harness.getAmountOut(0, 100e18, 400e18);
|
|
}
|
|
}
|