100 lines
3.8 KiB
Solidity
100 lines
3.8 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity =0.8.20;
|
|
|
|
import {Test} from "forge-std/Test.sol";
|
|
|
|
import "../src/UniswapV2Factory.sol";
|
|
import "../src/UniswapV2Pair.sol";
|
|
import "../src/mock/MockERC20.sol";
|
|
|
|
import "../src/libraries/UniswapV2Library.sol";
|
|
|
|
contract UniswapV2FactoryTest is Test {
|
|
UniswapV2Factory public factory;
|
|
MockERC20 public token0;
|
|
MockERC20 public token1;
|
|
MockERC20 public token2;
|
|
MockERC20 public token3;
|
|
|
|
function setUp() public {
|
|
factory = new UniswapV2Factory(address(0));
|
|
|
|
token0 = new MockERC20("SomeToken0", "ST0", 18);
|
|
token1 = new MockERC20("SomeToken1", "ST1", 18);
|
|
token2 = new MockERC20("SomeToken2", "ST2", 9);
|
|
token3 = new MockERC20("SomeToken3", "ST3", 6);
|
|
}
|
|
|
|
function testCreatePair() public {
|
|
address tokenPair = factory.createPair(address(token0), address(token1));
|
|
(address _token0, address _token1) = UniswapV2Library.sortTokens(
|
|
address(token0),
|
|
address(token1)
|
|
);
|
|
|
|
assertEq(factory.allPairsLength(), 1);
|
|
assertEq(factory.getPair(address(token0), address(token1)), tokenPair);
|
|
assertEq(UniswapV2Pair(tokenPair).token0(), _token0);
|
|
assertEq(UniswapV2Pair(tokenPair).token1(), _token1);
|
|
}
|
|
|
|
function testCreatePairReverse() public {
|
|
address tokenPair = factory.createPair(address(token1), address(token0));
|
|
(address _token0, address _token1) = UniswapV2Library.sortTokens(
|
|
address(token0),
|
|
address(token1)
|
|
);
|
|
|
|
assertEq(factory.allPairsLength(), 1);
|
|
assertEq(factory.getPair(address(token0), address(token1)), tokenPair);
|
|
assertEq(UniswapV2Pair(tokenPair).token0(), _token0);
|
|
assertEq(UniswapV2Pair(tokenPair).token1(), _token1);
|
|
}
|
|
|
|
function testCreatePairMultipleTokens() public {
|
|
address tokenPair0 = factory.createPair(address(token0), address(token1));
|
|
address tokenPair1 = factory.createPair(address(token2), address(token3));
|
|
|
|
(address _token0, address _token1) = UniswapV2Library.sortTokens(address(token0), address(token1));
|
|
(address _token2, address _token3) = UniswapV2Library.sortTokens(address(token2), address(token3));
|
|
|
|
assertEq(factory.allPairsLength(), 2);
|
|
assertEq(factory.getPair(address(token0), address(token1)), tokenPair0);
|
|
assertEq(factory.getPair(address(token2), address(token3)), tokenPair1);
|
|
assertEq(UniswapV2Pair(tokenPair0).token0(), _token0);
|
|
assertEq(UniswapV2Pair(tokenPair0).token1(), _token1);
|
|
assertEq(UniswapV2Pair(tokenPair1).token0(), _token2);
|
|
assertEq(UniswapV2Pair(tokenPair1).token1(), _token3);
|
|
}
|
|
|
|
function testCreatePairChained() public {
|
|
address tokenPair0 = factory.createPair(address(token0), address(token1));
|
|
address tokenPair1 = factory.createPair(address(token1), address(token2));
|
|
address tokenPair2 = factory.createPair(address(token2), address(token3));
|
|
|
|
assertEq(factory.allPairsLength(), 3);
|
|
assertEq(factory.getPair(address(token0), address(token1)), tokenPair0);
|
|
assertEq(factory.getPair(address(token1), address(token2)), tokenPair1);
|
|
assertEq(factory.getPair(address(token2), address(token3)), tokenPair2);
|
|
}
|
|
|
|
function testCreatePairIdenticalTokens() public {
|
|
vm.expectRevert();
|
|
factory.createPair(address(token0), address(token0));
|
|
}
|
|
|
|
function testCreatePairInvalidToken() public {
|
|
vm.expectRevert();
|
|
factory.createPair(address(0), address(token1));
|
|
|
|
vm.expectRevert();
|
|
factory.createPair(address(token0), address(0));
|
|
}
|
|
|
|
function testCreatePairDuplicatePair() public {
|
|
factory.createPair(address(token0), address(token1));
|
|
vm.expectRevert();
|
|
factory.createPair(address(token0), address(token1));
|
|
}
|
|
}
|