// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import {Test} from "forge-std/Test.sol"; import {EventRegistry} from "../src/EventRegistry.sol"; contract EventRegistryTest is Test { EventRegistry reg; address owner = makeAddr("owner"); address alice = makeAddr("alice"); address bob = makeAddr("bob"); function setUp() public { vm.warp(1_790_000_000); reg = new EventRegistry(owner); } function _params() internal view returns (EventRegistry.ListingParams memory) { return EventRegistry.ListingParams({ title: "Super Bowl LXI", description: "The NFL championship, first ever on Valentine's Day.", category: "sports", location: "SoFi Stadium, Inglewood", url: "https://www.nfl.com/super-bowl", imageURI: "", startsAt: uint64(block.timestamp + 30 days), endsAt: uint64(block.timestamp + 30 days + 4 hours), latE6: 33_953_500, lngE6: -118_339_200 }); } function test_list_storesListing() public { vm.prank(alice); uint256 id = reg.list(_params()); assertEq(id, 0); assertEq(reg.listingCount(), 1); EventRegistry.Listing memory l = reg.getListing(0); assertEq(l.lister, alice); assertEq(l.title, "Super Bowl LXI"); assertEq(l.location, "SoFi Stadium, Inglewood"); assertEq(l.listedAt, block.timestamp); assertEq(l.startsAt, block.timestamp + 30 days); assertEq(l.latE6, 33_953_500); assertFalse(l.cancelled); assertFalse(l.hidden); } function test_list_emits() public { EventRegistry.ListingParams memory p = _params(); vm.expectEmit(true, true, false, true); emit EventRegistry.Listed(0, alice, p.startsAt, p.title); vm.prank(alice); reg.list(p); } function test_list_validatesText() public { EventRegistry.ListingParams memory p = _params(); p.title = ""; vm.expectRevert(EventRegistry.BadTitle.selector); reg.list(p); p = _params(); p.title = string(new bytes(81)); vm.expectRevert(EventRegistry.BadTitle.selector); reg.list(p); p = _params(); p.category = ""; vm.expectRevert(EventRegistry.BadCategory.selector); reg.list(p); p = _params(); p.description = string(new bytes(281)); vm.expectRevert(EventRegistry.TooLong.selector); reg.list(p); p = _params(); p.url = string(new bytes(257)); vm.expectRevert(EventRegistry.TooLong.selector); reg.list(p); } function test_list_validatesTime() public { EventRegistry.ListingParams memory p = _params(); p.startsAt = uint64(block.timestamp); vm.expectRevert(EventRegistry.BadTime.selector); reg.list(p); p = _params(); p.startsAt = uint64(block.timestamp + 731 days); p.endsAt = 0; vm.expectRevert(EventRegistry.BadTime.selector); reg.list(p); p = _params(); p.endsAt = p.startsAt - 1; vm.expectRevert(EventRegistry.BadTime.selector); reg.list(p); // An unknown end time is fine. p = _params(); p.endsAt = 0; reg.list(p); } function test_list_validatesCoordinates() public { EventRegistry.ListingParams memory p = _params(); p.latE6 = 90_000_001; vm.expectRevert(EventRegistry.BadCoordinates.selector); reg.list(p); p = _params(); p.lngE6 = -180_000_001; vm.expectRevert(EventRegistry.BadCoordinates.selector); reg.list(p); } function test_cancel_onlyLister() public { vm.prank(alice); reg.list(_params()); vm.prank(bob); vm.expectRevert(EventRegistry.NotLister.selector); reg.cancel(0); vm.prank(alice); reg.cancel(0); assertTrue(reg.getListing(0).cancelled); } function test_setHidden_onlyOwner() public { vm.prank(alice); reg.list(_params()); vm.prank(alice); vm.expectRevert(EventRegistry.NotOwner.selector); reg.setHidden(0, true); vm.prank(owner); reg.setHidden(0, true); assertTrue(reg.getListing(0).hidden); vm.prank(owner); reg.setHidden(0, false); assertFalse(reg.getListing(0).hidden); } function test_unknownListing() public { vm.expectRevert(EventRegistry.UnknownListing.selector); reg.getListing(0); vm.expectRevert(EventRegistry.UnknownListing.selector); reg.cancel(3); } function test_transferOwnership() public { vm.prank(owner); reg.transferOwnership(bob); assertEq(reg.owner(), bob); vm.prank(owner); vm.expectRevert(EventRegistry.NotOwner.selector); reg.setHidden(0, true); vm.prank(bob); vm.expectRevert(EventRegistry.ZeroAddress.selector); reg.transferOwnership(address(0)); } function test_getListings_pages() public { for (uint256 i = 0; i < 5; i++) { vm.prank(alice); reg.list(_params()); } assertEq(reg.getListings(0, 2).length, 2); assertEq(reg.getListings(3, 10).length, 2); assertEq(reg.getListings(3, 10)[1].id, 4); assertEq(reg.getListings(5, 10).length, 0); } }