Skip to content

Commit fd092dd

Browse files
committed
Merge branch 'docs/posthog' of https://github.com/maxnorm/Compose into docs/posthog
2 parents 90f47b5 + 4f110da commit fd092dd

File tree

6 files changed

+584
-0
lines changed

6 files changed

+584
-0
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//SPDX-License-Identifier: MIT
2+
pragma solidity >=0.8.30;
3+
4+
import {Test} from "forge-std/Test.sol";
5+
import {ERC721BurnFacet} from "../../../../src/token/ERC721/ERC721/ERC721BurnFacet.sol";
6+
import {ERC721BurnFacetHarness} from "./harnesses/ERC721BurnFacetHarness.sol";
7+
8+
contract ERC721BurnFacetTest is Test {
9+
ERC721BurnFacetHarness public harness;
10+
11+
address public alice;
12+
address public bob;
13+
address public charlie;
14+
15+
function setUp() public {
16+
alice = makeAddr("alice");
17+
bob = makeAddr("bob");
18+
charlie = makeAddr("charlie");
19+
20+
harness = new ERC721BurnFacetHarness();
21+
}
22+
23+
// ============================================
24+
// Burn Tests
25+
// ============================================
26+
27+
function test_Burn() public {
28+
uint256 tokenId = 7;
29+
30+
harness.mint(alice, tokenId);
31+
assertEq(harness.ownerOf(tokenId), alice);
32+
33+
vm.prank(alice);
34+
harness.burn(tokenId);
35+
assertEq(harness.ownerOf(tokenId), address(0));
36+
}
37+
38+
function test_BurnFuzz(address to, uint256 tokenId) public {
39+
vm.assume(to != address(0));
40+
vm.assume(tokenId < type(uint256).max);
41+
42+
harness.mint(to, tokenId);
43+
assertEq(harness.ownerOf(tokenId), to);
44+
45+
vm.prank(to);
46+
harness.burn(tokenId);
47+
assertEq(harness.ownerOf(tokenId), address(0));
48+
}
49+
50+
function test_BurnRevertWhenNonExistentToken() public {
51+
uint256 tokenId = 888;
52+
53+
vm.expectRevert(abi.encodeWithSelector(ERC721BurnFacet.ERC721NonexistentToken.selector, tokenId));
54+
harness.burn(tokenId);
55+
}
56+
}
Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity >=0.8.30;
3+
4+
import {Test} from "forge-std/Test.sol";
5+
import {ERC721FacetHarness} from "./harnesses/ERC721FacetHarness.sol";
6+
import {ERC721Facet} from "../../../../../src/token/ERC721/ERC721/ERC721Facet.sol";
7+
8+
contract ERC721FacetTest is Test {
9+
ERC721FacetHarness public harness;
10+
11+
address public alice;
12+
address public bob;
13+
address public charlie;
14+
15+
string constant TOKEN_NAME = "Test Token";
16+
string constant TOKEN_SYMBOL = "TEST";
17+
string constant BASE_URI = "https://example.com/api/nft/";
18+
19+
function setUp() public {
20+
alice = makeAddr("alice");
21+
bob = makeAddr("bob");
22+
charlie = makeAddr("charlie");
23+
24+
harness = new ERC721FacetHarness();
25+
harness.initialize(TOKEN_NAME, TOKEN_SYMBOL, BASE_URI);
26+
}
27+
28+
// ============================================
29+
// Metadata Tests
30+
// ============================================
31+
32+
function test_name() public view {
33+
assertEq(harness.name(), TOKEN_NAME);
34+
}
35+
36+
function test_symbol() public view {
37+
assertEq(harness.symbol(), TOKEN_SYMBOL);
38+
}
39+
40+
function test_baseURI() public view {
41+
assertEq(harness.baseURI(), BASE_URI);
42+
}
43+
44+
// ============================================
45+
// TokenURI Tests
46+
// ============================================
47+
48+
function test_tokenURI() public {
49+
uint256 tokenId = 1;
50+
string memory expectedURI = string(abi.encodePacked(BASE_URI, "1"));
51+
52+
harness.mint(alice, tokenId);
53+
54+
string memory tokenURI = ERC721Facet(address(harness)).tokenURI(tokenId);
55+
assertEq(tokenURI, expectedURI);
56+
}
57+
58+
function test_tokenOwner() public {
59+
uint256 tokenId = 45;
60+
61+
harness.mint(alice, tokenId);
62+
63+
assertEq(harness.ownerOf(tokenId), alice);
64+
}
65+
66+
// ============================================
67+
// Approve Tests
68+
// ============================================
69+
70+
function test_Approve() public {
71+
uint256 tokenId = 4;
72+
73+
harness.mint(alice, tokenId);
74+
75+
vm.prank(alice);
76+
ERC721Facet(address(harness)).approve(bob, tokenId);
77+
78+
address approved = ERC721Facet(address(harness)).getApproved(tokenId);
79+
assertEq(approved, bob);
80+
}
81+
82+
function test_ApproveSelfApproval() public {
83+
uint256 tokenId = 6;
84+
85+
harness.mint(bob, tokenId);
86+
87+
vm.prank(bob);
88+
ERC721Facet(address(harness)).approve(bob, tokenId);
89+
90+
address approved = ERC721Facet(address(harness)).getApproved(tokenId);
91+
assertEq(approved, bob);
92+
}
93+
94+
function test_ApproveClearsOnTransfer() public {
95+
uint256 tokenId = 7;
96+
97+
harness.mint(alice, tokenId);
98+
99+
vm.prank(alice);
100+
ERC721Facet(address(harness)).approve(bob, tokenId);
101+
102+
vm.prank(alice);
103+
ERC721Facet(address(harness)).transferFrom(alice, charlie, tokenId);
104+
105+
address approved = ERC721Facet(address(harness)).getApproved(tokenId);
106+
assertEq(approved, address(0));
107+
}
108+
109+
function test_ApproveFuzz(address owner, address operator, uint256 tokenId) public {
110+
vm.assume(owner != address(0));
111+
vm.assume(operator != address(0));
112+
vm.assume(owner != operator);
113+
vm.assume(tokenId < type(uint256).max);
114+
115+
harness.mint(owner, tokenId);
116+
117+
vm.prank(owner);
118+
ERC721Facet(address(harness)).approve(operator, tokenId);
119+
120+
address approved = ERC721Facet(address(harness)).getApproved(tokenId);
121+
assertEq(approved, operator);
122+
}
123+
124+
function test_getApproved() public {
125+
uint256 tokenId = 4;
126+
127+
harness.mint(alice, tokenId);
128+
129+
vm.prank(alice);
130+
ERC721Facet(address(harness)).approve(bob, tokenId);
131+
132+
address approved = ERC721Facet(address(harness)).getApproved(tokenId);
133+
assertEq(approved, bob);
134+
135+
assertEq(harness.getApproved(tokenId), bob);
136+
}
137+
138+
// ===========================================
139+
// SetApprovalForAll Tests
140+
// ===========================================
141+
142+
function test_SetApprovalForAll() public {
143+
vm.prank(alice);
144+
ERC721Facet(address(harness)).setApprovalForAll(bob, true);
145+
146+
bool isApproved = ERC721Facet(address(harness)).isApprovedForAll(alice, bob);
147+
assertTrue(isApproved);
148+
}
149+
150+
function test_SetApprovalForAllFuzz(address owner, address operator) public {
151+
vm.assume(owner != address(0));
152+
vm.assume(operator != address(0));
153+
vm.assume(owner != operator);
154+
155+
vm.prank(owner);
156+
ERC721Facet(address(harness)).setApprovalForAll(operator, true);
157+
158+
bool isApproved = ERC721Facet(address(harness)).isApprovedForAll(owner, operator);
159+
assertTrue(isApproved);
160+
}
161+
162+
// ============================================
163+
// transferFrom tests
164+
// ============================================
165+
166+
function test_transferFrom() public {
167+
uint256 tokenId = 1;
168+
169+
harness.mint(alice, tokenId);
170+
assertEq(harness.ownerOf(tokenId), alice);
171+
172+
vm.prank(alice);
173+
harness.transferFrom(alice, bob, tokenId);
174+
assertEq(harness.ownerOf(tokenId), bob);
175+
}
176+
177+
function test_transferFromToSelf() public {
178+
uint256 tokenId = 2;
179+
180+
harness.mint(charlie, tokenId);
181+
assertEq(harness.ownerOf(tokenId), charlie);
182+
183+
vm.prank(charlie);
184+
harness.transferFrom(charlie, charlie, tokenId);
185+
assertEq(harness.ownerOf(tokenId), charlie);
186+
}
187+
188+
function test_transferFromFuzz(address from, address to, uint256 tokenId) public {
189+
vm.assume(from != address(0));
190+
vm.assume(to != address(0));
191+
vm.assume(tokenId < type(uint256).max);
192+
193+
harness.mint(from, tokenId);
194+
assertEq(harness.ownerOf(tokenId), from);
195+
196+
vm.prank(from);
197+
harness.transferFrom(from, to, tokenId);
198+
assertEq(harness.ownerOf(tokenId), to);
199+
}
200+
201+
function test_transferFromRevertWhenTransferFromNonExistentToken() public {
202+
uint256 tokenId = 999;
203+
204+
vm.expectRevert(abi.encodeWithSelector(ERC721Facet.ERC721NonexistentToken.selector, tokenId));
205+
harness.transferFrom(alice, bob, tokenId);
206+
}
207+
208+
// ===========================================
209+
// safeTransferFrom Tests
210+
// ===========================================
211+
212+
function test_safeTransferFrom() public {
213+
uint256 tokenId = 1;
214+
215+
harness.mint(alice, tokenId);
216+
assertEq(harness.ownerOf(tokenId), alice);
217+
218+
vm.prank(alice);
219+
harness.safeTransferFrom(alice, bob, tokenId);
220+
assertEq(harness.ownerOf(tokenId), bob);
221+
}
222+
223+
function test_safeTransferFromToSelf() public {
224+
uint256 tokenId = 2;
225+
226+
harness.mint(charlie, tokenId);
227+
assertEq(harness.ownerOf(tokenId), charlie);
228+
229+
vm.prank(charlie);
230+
harness.safeTransferFrom(charlie, charlie, tokenId);
231+
assertEq(harness.ownerOf(tokenId), charlie);
232+
}
233+
234+
// ====================================
235+
// balanceOf Tests
236+
// ====================================
237+
238+
function test_BalanceOf() public {
239+
uint256 tokenId1 = 32;
240+
uint256 tokenId2 = 45;
241+
242+
harness.mint(alice, tokenId1);
243+
harness.mint(alice, tokenId2);
244+
245+
assertEq(harness.balanceOf(alice), 2);
246+
}
247+
}

0 commit comments

Comments
 (0)