pragma solidity ^0.8.0 ;
import { Test } from "lib/forge-std/src/Test.sol";
import { console } from "lib/forge-std/src/console.sol";
import { RockPaperScissors } from "src/RockPaperScissors.sol";
import { WinningToken } from "src/WinningToken.sol";
contract Tests is Test {
struct Smart_Contracts {
RockPaperScissors RockPaperScissors;
WinningToken WinningToken;
}
Smart_Contracts SC;
struct User {
address A;
uint256 PK;
}
struct Users {
User Owner;
User User_1;
User User_2;
User User_3;
User User_4;
}
Users U;
mapping(address => string) private name;
function test____() public {
( U.Owner.A , U.Owner.PK ) = makeAddrAndKey("Owner");
( U.User_1.A , U.User_1.PK ) = makeAddrAndKey("User 1");
( U.User_2.A , U.User_2.PK ) = makeAddrAndKey("User 2");
( U.User_3.A , U.User_3.PK ) = makeAddrAndKey("User 3");
( U.User_4.A , U.User_4.PK ) = makeAddrAndKey("User 4");
name[ address(0) ] = "Address 0";
name[ U.Owner.A ] = "Owner";
name[ U.User_1.A ] = "User 1";
name[ U.User_2.A ] = "User 2";
name[ U.User_3.A ] = "User 3";
name[ U.User_4.A ] = "User 4";
vm.startPrank(U.Owner.A);
SC.RockPaperScissors = new RockPaperScissors();
SC.WinningToken = WinningToken(SC.RockPaperScissors.winningToken());
vm.stopPrank();
name[ address(SC.RockPaperScissors) ] = "RockPaperScissors";
name[ address(SC.WinningToken) ] = "WinningToken";
AIRDROP____ETH(U.User_1.A, 1 ether);
AIRDROP____ETH(U.User_2.A, 1 ether);
AIRDROP____ETH(U.User_3.A, 1 ether);
vm.startPrank(U.User_1.A);
SC.RockPaperScissors.createGameWithEth{value: 1 ether}(3, 5 minutes);
vm.stopPrank();
{
space();
BALANCE_OF____ETH("User 1", U.User_1.A);
BALANCE_OF____ETH("User 2", U.User_2.A);
BALANCE_OF____ETH("User 3", U.User_3.A);
BALANCE_OF____ETH("RockPaperScissors", address(SC.RockPaperScissors));
space();
(
address playerA,
address playerB,
,,,,,,,,,,,,,
RockPaperScissors.GameState state
) = SC.RockPaperScissors.games(0);
console.log(getName(playerA));
console.log(getName(playerB));
console.log(uint256(state));
space();
}
vm.startPrank(U.User_2.A);
SC.RockPaperScissors.joinGameWithEth{value: 1 ether}(0);
vm.stopPrank();
{
space();
BALANCE_OF____ETH("User 1", U.User_1.A);
BALANCE_OF____ETH("User 2", U.User_2.A);
BALANCE_OF____ETH("User 3", U.User_3.A);
BALANCE_OF____ETH("RockPaperScissors", address(SC.RockPaperScissors));
space();
(
address playerA,
address playerB,
,,,,,,,,,,,,,
RockPaperScissors.GameState state
) = SC.RockPaperScissors.games(0);
console.log(getName(playerA));
console.log(getName(playerB));
console.log(uint256(state));
space();
}
vm.startPrank(U.User_3.A);
SC.RockPaperScissors.joinGameWithEth{value: 1 ether}(0);
vm.stopPrank();
{
space();
BALANCE_OF____ETH("User 1", U.User_1.A);
BALANCE_OF____ETH("User 2", U.User_2.A);
BALANCE_OF____ETH("User 3", U.User_3.A);
BALANCE_OF____ETH("RockPaperScissors", address(SC.RockPaperScissors));
space();
(
address playerA,
address playerB,
,,,,,,,,,,,,,
RockPaperScissors.GameState state
) = SC.RockPaperScissors.games(0);
console.log(getName(playerA));
console.log(getName(playerB));
console.log(uint256(state));
space();
}
vm.startPrank(U.User_1.A);
SC.RockPaperScissors.cancelGame(0);
vm.stopPrank();
{
space();
BALANCE_OF____ETH("User 1", U.User_1.A);
BALANCE_OF____ETH("User 2", U.User_2.A);
BALANCE_OF____ETH("User 3", U.User_3.A);
BALANCE_OF____ETH("RockPaperScissors", address(SC.RockPaperScissors));
space();
(
address playerA,
address playerB,
,,,,,,,,,,,,,
RockPaperScissors.GameState state
) = SC.RockPaperScissors.games(0);
console.log(getName(playerA));
console.log(getName(playerB));
console.log(uint256(state));
space();
}
}
function BALANCE_OF____ETH(
string memory i_Who,
address Who
) private view {
console.log( "" );
console.log( string( abi.encodePacked(
" Balance of ETH for " , " ` " , i_Who , " ` "
) ) );
console.log( "" );
console.log(
formatTokenBalance( address( Who ).balance , 18 )
);
console.log( "" );
}
function AIRDROP____ETH(
address Who,
uint256 Amount
) private {
vm.startPrank( Who );
deal( Who , Amount );
vm.stopPrank();
}
function getName(
address addr
) private view returns (string memory) {
return name[addr];
}
function formatTokenBalance(
uint256 rawAmount,
uint8 decimals
) private pure returns (string memory) {
string memory amountStr = vm.toString(rawAmount);
uint256 amountLength = bytes(amountStr).length;
uint256 integerPartLength;
if (amountLength <= decimals) {
string memory result = "0.";
for (uint256 i = 0; i < decimals - amountLength; i++) {
result = string(abi.encodePacked(result, "0"));
}
result = string(abi.encodePacked(result, amountStr));
return result;
} else {
integerPartLength = amountLength - decimals;
bytes memory amountBytes = bytes(amountStr);
bytes memory integerBytes = new bytes(integerPartLength);
for (uint256 i = 0; i < integerPartLength; i++) {
integerBytes[i] = amountBytes[i];
}
bytes memory fractionalBytes = new bytes(decimals);
for (uint256 i = 0; i < decimals; i++) {
fractionalBytes[i] = amountBytes[integerPartLength + i];
}
return string(abi.encodePacked(
string(integerBytes),
".",
string(fractionalBytes)
));
}
}
function space() private pure {
console.log( "" );
}
}