Skip to the editor

ShuOracleConverter.t.sol

ShuOracleConverter.t.sol

// Source:  github.com/DjedAlliance/Djed-Solidity
// File:    src/test/ShuOracleConverter.t.sol, lines 10-95
// Commit:  68bb89e (pinned)
// Link:    https://github.com/DjedAlliance/Djed-Solidity/blob/68bb89ec832c1d587cb68b716e7d42398ef4b54b/src/test/ShuOracleConverter.t.sol#L10-L95

contract OracleConverterTest is Test, Utilities {
    MockShuOracle public oracle;
    ShuOracleConverter public oracleConverter;

    function setUp() public {
        oracle = new MockShuOracle(ORACLE_EXCHANGE_RATE);
        oracleConverter = new ShuOracleConverter(address(oracle));
        uint256 initialPrice = oracle.readData();

        assertEq(
            uint256(oracleConverter.previousHour()),
            uint8((block.timestamp / (1 hours)) % 24)
        );

        (uint256 priceMax, ) = oracleConverter.readMaxPrice();
        assertEq(priceMax, initialPrice);

        (uint256 priceMin, ) = oracleConverter.readMinPrice();
        assertEq(priceMin, initialPrice);
    }

    function test_updateOracleValues_noTimeElapsed() public {
        uint256 initialPrice = oracle.readData();
        oracle.increasePrice();

        oracleConverter.updateOracleValues();
        uint256 newPrice = oracle.readData();

        (uint256 maxPrice, ) = oracleConverter.readMaxPrice();
        (uint256 minPrice, ) = oracleConverter.readMinPrice();

        assertEq(maxPrice, newPrice);
        assertEq(minPrice, initialPrice);
    }

    function test_updateOracleValues_multipleHours() public {
        oracle.increasePrice();
        oracle.increasePrice();
        skip(3600 * 5); // Skip 5 hours

        uint256 firstUpdatePrice = oracle.readData();
        oracleConverter.updateOracleValues(); // First update after 5 hours

        oracle.decreasePrice();
        oracle.decreasePrice();
        oracle.decreasePrice();
        skip(3600 * 21); // Skip another 21 hours

        uint256 secondUpdatePrice = oracle.readData();
        oracleConverter.updateOracleValues(); // Second update after 21 hours

        (uint256 maxPrice, ) = oracleConverter.readMaxPrice();
        (uint256 minPrice, ) = oracleConverter.readMinPrice();

        assertEq(maxPrice, firstUpdatePrice);
        assertEq(minPrice, secondUpdatePrice);
    }

    function test_updateOracleValues_daysPassed() public {
        oracle.increasePrice();
        skip(3600 * 24 * 2); // Skip 2 days

        uint256 firstUpdatePrice = oracle.readData();
        oracleConverter.updateOracleValues(); // First update after 2 days

        uint8 liveHour = uint8((block.timestamp / (1 hours)) % 24);
        for (uint8 i = 0; i < 24; i++) {
            assertEq(
                oracleConverter.movingPrice(i),
                i == liveHour ? firstUpdatePrice : ORACLE_EXCHANGE_RATE
            ); // skipped hours carry the previous bucket forward
        }
        oracle.decreasePrice();
        oracle.decreasePrice();
        skip(3600 * 12); // Skip 12 hours

        uint256 secondUpdatePrice = oracle.readData();
        oracleConverter.updateOracleValues(); // Second update after 12 hours

        (uint256 maxPrice, ) = oracleConverter.readMaxPrice();
        (uint256 minPrice, ) = oracleConverter.readMinPrice();

        assertEq(maxPrice, firstUpdatePrice);
        assertEq(minPrice, secondUpdatePrice);
    }
}