// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.23; import { Test, console2 } from "forge-std/Test.sol"; import { DappIndexer } from "src/DappIndexer.sol"; contract DappIndexerTest is Test { DappIndexer public dappIdxr; string[] public dappsURI; function setUp() public { dappIdxr = new DappIndexer(address(this), address(this)); dappsURI = vm.envString("dapps", ' '); } function testAddDapp() public { bytes32 CID1; bytes32 CID2; (CID1, CID2) = stringToBytes32Pair(dappsURI[0]); // Add Dapp console2.log("Bytes32 first:"); console2.logBytes32(CID1); console2.log("Bytes32 second:"); console2.logBytes32(CID2); console2.log(Bytes32PairToString(CID1, CID2)); dappIdxr.addDapp(bytes32("Dapp01"), DappIndexer.PackedCID(CID1, CID2)); // retrive Dapp DappIndexer.PackedCID memory dapp1 = dappIdxr.getCID(bytes32("Dapp01")); assertEq(CID1, dapp1.CID1); assertEq(CID2, dapp1.CID2); string memory retrivedDappURI = Bytes32PairToString(dapp1.CID1, dapp1.CID2); assertEq(dappsURI[0], retrivedDappURI); } function Bytes32PairToString(bytes32 part1, bytes32 part2) public pure returns (string memory) { // Concatenate the two bytes32 variables bytes memory concatenatedBytes = abi.encodePacked(part1, part2); // Truncate the concatenated bytes to 59 bytes bytes memory truncatedBytes = new bytes(59); for (uint i = 0; i < 59; i++) { truncatedBytes[i] = concatenatedBytes[i]; } // Convert the truncated bytes to a string string memory str = string(truncatedBytes); return str; } function stringToBytes32Pair(string memory source) public pure returns (bytes32 part1, bytes32 part2) { bytes memory sourceBytes = bytes(source); require(sourceBytes.length == 59, "URI string must equal to 59 bytes"); assembly { // Load the first 32 bytes of the string data part1 := mload(add(sourceBytes, 32)) // Load the second 32 bytes of the string data part2 := mload(add(sourceBytes, 64)) } } }