Skip to content

Commit

Permalink
added test for queue and complied project
Browse files Browse the repository at this point in the history
  • Loading branch information
enderNakamoto committed Dec 17, 2024
1 parent a613806 commit efc23cb
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 120 deletions.
8 changes: 4 additions & 4 deletions src/CarbonQueue.sol
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ contract CarbonQueue is Ownable {
controller = _controller;
}

function _enqueueCredit(address holder) internal onlyController returns (uint256) {
function _enqueueCredit(address holder) external onlyController returns (uint256) {
uint256 creditIndex = nextMintIndex;
credits[nextMintIndex] = Credit({
holder: holder,
Expand All @@ -50,7 +50,7 @@ contract CarbonQueue is Ownable {
return creditIndex;
}

function _dequeueCredit() internal onlyController returns (address) {
function _dequeueCredit() external onlyController returns (address) {
require(nextMintIndex > nextBurnIndex, "No credits available");
require(credits[nextBurnIndex].isValid, "Invalid credit");

Expand All @@ -61,11 +61,11 @@ contract CarbonQueue is Ownable {
return holder;
}

function _getAvailableCredits() internal view returns (uint256) {
function _getAvailableCredits() external view returns (uint256) {
return nextMintIndex - nextBurnIndex;
}

function _getCreditDetails(uint256 index) internal view returns (
function _getCreditDetails(uint256 index) external view returns (
address holder,
uint256 timestamp,
bool isValid
Expand Down
9 changes: 4 additions & 5 deletions src/Controller.sol
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./CarbonQueue.sol";
import "./RewardsVault.sol";

contract Controller is ReentrancyGuard, Ownable {
contract Controller is Ownable (msg.sender) {
struct VehicleInfo {
string vin;
uint256 lastProcessedOdometer;
Expand Down Expand Up @@ -83,7 +82,7 @@ contract Controller is ReentrancyGuard, Ownable {
emit VehicleRegistered(owner, vin);
}

function processOdometerReading(address driver, uint256 currentOdometer) external onlyOwner nonReentrant {
function processOdometerReading(address driver, uint256 currentOdometer) external onlyOwner {
string memory vin = addressToVin[driver];
require(bytes(vin).length > 0, "No registered vehicle");

Expand All @@ -108,7 +107,7 @@ contract Controller is ReentrancyGuard, Ownable {
vehicleInfo.lastProcessedTimestamp = block.timestamp;
}

function burnCredit(uint256 amount) external nonReentrant {
function burnCredit(uint256 amount) external {
require(amount > 0, "Amount must be greater than 0");
require(carbonQueue._getAvailableCredits() >= amount, "Not enough credits");

Expand All @@ -127,7 +126,7 @@ contract Controller is ReentrancyGuard, Ownable {
creditBalance[msg.sender] += amount;
}

function withdrawRewards() external nonReentrant {
function withdrawRewards() external {
uint256 amount = rewardsVault._withdrawRewards(msg.sender);
require(amount > 0, "No rewards to withdraw");
emit RewardWithdrawn(msg.sender, amount);
Expand Down
6 changes: 3 additions & 3 deletions src/RewardsVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ contract RewardsVault is Ownable {
controller = _controller;
}

function _addReward(address holder, uint256 amount) internal onlyController {
function _addReward(address holder, uint256 amount) external onlyController {
pendingRewards[holder] += amount;
}

function _withdrawRewards(address holder) internal onlyController returns (uint256) {
function _withdrawRewards(address holder) external onlyController returns (uint256) {
uint256 amount = pendingRewards[holder];
if (amount > 0) {
pendingRewards[holder] = 0;
Expand All @@ -35,7 +35,7 @@ contract RewardsVault is Ownable {
return amount;
}

function _getPendingRewards(address holder) internal view returns (uint256) {
function _getPendingRewards(address holder) external view returns (uint256) {
return pendingRewards[holder];
}
}
108 changes: 0 additions & 108 deletions test/CarbonCreditsTest.sol

This file was deleted.

178 changes: 178 additions & 0 deletions test/CarbonQueueTest.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Test.sol";
import "../src/CarbonQueue.sol";

contract CarbonQueueTest is Test {
CarbonQueue public queue;
address public controller;
address public user1;
address public user2;

function setUp() public {
controller = makeAddr("controller");
user1 = makeAddr("user1");
user2 = makeAddr("user2");

queue = new CarbonQueue(controller);
}

function test_Deployment() public {
// Test controller access
vm.prank(user1);
vm.expectRevert("Only controller");
queue._enqueueCredit(user1);

// Controller should succeed
vm.prank(controller);
queue._enqueueCredit(user1);
}

function test_DeploymentWithZeroAddress() public {
vm.expectRevert("Invalid controller");
new CarbonQueue(address(0));
}

function test_EnqueueCredit() public {
vm.startPrank(controller);

queue._enqueueCredit(user1);
(address holder, uint256 timestamp, bool isValid) = queue._getCreditDetails(0);

assertEq(holder, user1);
assertTrue(isValid);
assertGt(timestamp, 0);

vm.stopPrank();
}

function test_GetAvailableCredits() public {
vm.startPrank(controller);

assertEq(queue._getAvailableCredits(), 0);

queue._enqueueCredit(user1);
assertEq(queue._getAvailableCredits(), 1);

queue._enqueueCredit(user2);
assertEq(queue._getAvailableCredits(), 2);

vm.stopPrank();
}

function test_DequeueFIFO() public {
vm.startPrank(controller);

queue._enqueueCredit(user1);
queue._enqueueCredit(user2);

address firstHolder = queue._dequeueCredit();
assertEq(firstHolder, user1);

address secondHolder = queue._dequeueCredit();
assertEq(secondHolder, user2);

vm.stopPrank();
}

function test_DequeueInvalidatesCredit() public {
vm.startPrank(controller);

queue._enqueueCredit(user1);
queue._dequeueCredit();

(,, bool isValid) = queue._getCreditDetails(0);
assertFalse(isValid);

vm.stopPrank();
}

function test_DequeueEmptyQueue() public {
vm.prank(controller);
vm.expectRevert("No credits available");
queue._dequeueCredit();
}

function test_QueueStateAfterMultipleOperations() public {
vm.startPrank(controller);

// Enqueue multiple credits
queue._enqueueCredit(user1);
queue._enqueueCredit(user2);
queue._enqueueCredit(user1);

// Dequeue some
queue._dequeueCredit();
queue._dequeueCredit();

assertEq(queue._getAvailableCredits(), 1);

// Add more
queue._enqueueCredit(user2);
assertEq(queue._getAvailableCredits(), 2);

vm.stopPrank();
}

function test_NonControllerCannotEnqueue() public {
vm.prank(user1);
vm.expectRevert("Only controller");
queue._enqueueCredit(user1);
}

function test_NonControllerCannotDequeue() public {
vm.prank(controller);
queue._enqueueCredit(user1);

vm.prank(user1);
vm.expectRevert("Only controller");
queue._dequeueCredit();
}

function test_ManyCreditsNoOverflow() public {
vm.startPrank(controller);

// Add 100 credits
for(uint256 i = 0; i < 100; i++) {
queue._enqueueCredit(user1);
}
assertEq(queue._getAvailableCredits(), 100);

// Remove 50
for(uint256 i = 0; i < 50; i++) {
queue._dequeueCredit();
}
assertEq(queue._getAvailableCredits(), 50);

vm.stopPrank();
}

function test_TimestampAccuracy() public {
vm.prank(controller);
queue._enqueueCredit(user1);

(,uint256 timestamp,) = queue._getCreditDetails(0);
assertGt(timestamp, 0);
assertEq(timestamp, block.timestamp);
}

function testFuzz_EnqueueDequeue(address[] calldata holders) public {
vm.assume(holders.length > 0);
vm.startPrank(controller);

// Enqueue all holders
for(uint256 i = 0; i < holders.length; i++) {
vm.assume(holders[i] != address(0));
queue._enqueueCredit(holders[i]);
}

// Verify FIFO order by dequeuing
for(uint256 i = 0; i < holders.length; i++) {
address dequeuedHolder = queue._dequeueCredit();
assertEq(dequeuedHolder, holders[i]);
}

vm.stopPrank();
}
}

0 comments on commit efc23cb

Please sign in to comment.