|
|
|
// SPDX-License-Identifier: UNLICENSED
|
|
|
|
pragma solidity ^0.8.13;
|
|
|
|
|
|
|
|
import "forge-std/Test.sol";
|
|
|
|
import {Main} from "../src/Main.sol";
|
|
|
|
import {Unaboomer} from "../src/Unaboomer.sol";
|
|
|
|
import {Mailbomb} from "../src/Mailbomb.sol";
|
|
|
|
|
|
|
|
contract UnaboomerTest is Test {
|
|
|
|
Main public main;
|
|
|
|
Unaboomer public boomr;
|
|
|
|
Mailbomb public bomb;
|
|
|
|
|
|
|
|
function setUp() public {
|
|
|
|
main = new Main();
|
|
|
|
boomr = new Unaboomer();
|
|
|
|
bomb = new Mailbomb();
|
|
|
|
boomr.setMainContract(address(main));
|
|
|
|
bomb.setMainContract(address(main));
|
|
|
|
main.setUnaboomerContract(address(boomr));
|
|
|
|
main.setMailbombContract(address(bomb));
|
|
|
|
}
|
|
|
|
|
|
|
|
function testBasicMechanics() public {
|
|
|
|
address t1 = address(1);
|
|
|
|
address t2 = address(2);
|
|
|
|
// mint 20 boomers - should have 20 BOOMR and 40 BOMB
|
|
|
|
hoax(t1);
|
|
|
|
main.radicalizeBoomers{value: .2 ether}(20);
|
|
|
|
assertEq(boomr.totalSupply(), 20);
|
|
|
|
assertEq(boomr.balanceOf(t1), 20);
|
|
|
|
assertEq(bomb.bombsAssembled(), 40);
|
|
|
|
assertEq(bomb.balanceOf(t1, 1), 40);
|
|
|
|
// mint 20 more bombs - should have 60 BOMB
|
|
|
|
hoax(t1);
|
|
|
|
main.assembleBombs{value: .2 ether}(20);
|
|
|
|
assertEq(bomb.bombsAssembled(), 60);
|
|
|
|
assertEq(bomb.balanceOf(t1, 1), 60);
|
|
|
|
// mint 20 more boomers as other address - supplies should line up
|
|
|
|
hoax(t2);
|
|
|
|
main.radicalizeBoomers{value: .2 ether}(20);
|
|
|
|
assertEq(boomr.totalSupply(), 40);
|
|
|
|
assertEq(boomr.balanceOf(t2), 20);
|
|
|
|
assertEq(bomb.bombsAssembled(), 100);
|
|
|
|
assertEq(bomb.balanceOf(t2, 1), 40);
|
|
|
|
// sending bombs should change supplies and update kill count
|
|
|
|
hoax(t1);
|
|
|
|
main.sendBombs(40);
|
|
|
|
assertEq(bomb.balanceOf(t1, 1), 20);
|
|
|
|
assertEq(boomr.totalKillCount() > 0, true);
|
|
|
|
console.log(boomr.totalKillCount());
|
|
|
|
}
|
|
|
|
|
|
|
|
function testSendingBombs() public {
|
|
|
|
hoax(address(1));
|
|
|
|
main.radicalizeBoomers{value: .5 ether}(50);
|
|
|
|
hoax(address(2));
|
|
|
|
main.radicalizeBoomers{value: .1 ether}(10);
|
|
|
|
hoax(address(3));
|
|
|
|
main.radicalizeBoomers{value: .03 ether}(3);
|
|
|
|
hoax(address(4));
|
|
|
|
main.radicalizeBoomers{value: .15 ether}(15);
|
|
|
|
hoax(address(4));
|
|
|
|
main.sendBombs(10);
|
|
|
|
hoax(address(3));
|
|
|
|
main.sendBombs(6);
|
|
|
|
hoax(address(2));
|
|
|
|
main.sendBombs(10);
|
|
|
|
hoax(address(1));
|
|
|
|
main.sendBombs(20);
|
|
|
|
uint256 ptr = main.leaderboardPointer();
|
|
|
|
address leader = main.leaderboard(ptr);
|
|
|
|
uint256 killcount = main.killCount(leader);
|
|
|
|
}
|
|
|
|
|
|
|
|
function testSendingBombsAgain() public {
|
|
|
|
hoax(address(1));
|
|
|
|
main.radicalizeBoomers{value: 10 ether}(1000);
|
|
|
|
hoax(address(1));
|
|
|
|
main.sendBombs(10);
|
|
|
|
}
|
|
|
|
|
|
|
|
function testKilling() public {
|
|
|
|
address t = address(1);
|
|
|
|
startHoax(t);
|
|
|
|
main.assembleBombs{value: .1 ether}(10);
|
|
|
|
vm.expectRevert(bytes("not enough supply"));
|
|
|
|
main.sendBombs(10);
|
|
|
|
main.radicalizeBoomers{value: .1 ether}(10);
|
|
|
|
main.sendBombs(10);
|
|
|
|
assertEq(bomb.balanceOf(t, 1), 20);
|
|
|
|
}
|
|
|
|
|
|
|
|
function testFailDirectFunctions() public {
|
|
|
|
address t = address(1);
|
|
|
|
startHoax(t);
|
|
|
|
boomr.radicalize(t, 10);
|
|
|
|
boomr.die(1);
|
|
|
|
bomb.create(t, 10);
|
|
|
|
bomb.explode(t, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
function testURILogic() public {
|
|
|
|
address t = address(1);
|
|
|
|
boomr.setAliveURI('ipfs://alive/');
|
|
|
|
boomr.setDeadURI('ipfs://dead/');
|
|
|
|
startHoax(t);
|
|
|
|
main.radicalizeBoomers{value: .01 ether}(1);
|
|
|
|
assertEq(boomr.tokenURI(0), 'ipfs://alive/0.json');
|
|
|
|
main.sendBombs(1);
|
|
|
|
assertEq(boomr.tokenURI(0), 'ipfs://dead/0.json');
|
|
|
|
}
|
|
|
|
}
|