GameManager.t.sol
Обзор файла
Файл GameManager.t.sol представляет собой набор автоматизированных тестов на языке Solidity для смарт-контракта GameManager. Этот контракт управляет основной игровой логикой, включая действия игроков, обработку батчей (пакетов действий), прогресс персонажей, PvP-бои, крафтинг и торговлю на маркетплейсе. Тесты написаны с использованием библиотеки Forge Std (forge-std/Test.sol), что обеспечивает удобную среду для имитации транзакций и проверки состояний.
Основная цель файла — проверить корректность работы GameManager в различных сценариях: успешное выполнение игровых действий, обработка ошибок, пауза контракта, проверка параметров, взаимодействие с токеном ManaToken и мок-контрактом SettlementMock. Тесты охватывают весь спектр игровых механик и обеспечивают надежность и безопасность смарт-контракта.
Классы и основные компоненты
В данном файле определён один тестовый контракт:
Контракт GameManagerTest
Наследует:
Test(изforge-std)Назначение: Тестирование контракта
GameManagerс помощью различных сценариев использования.
Переменные состояния:
Переменная | Тип | Описание |
|---|---|---|
|
| Тестируемый контракт |
|
| Контракт токена MANA |
|
| Мок для Settlement, эмуляция внешней логики |
|
| Администратор, владелец прав |
|
| Тестовый игрок 1 |
|
| Тестовый игрок 2 |
|
| Валидатор (не используется явно) |
События (для проверки эмиссии):
GameActionSubmitted(bytes32 indexed actionId, GameManager.GameAction action) — событие при отправке игрового действия.
BatchProcessed(bytes32 indexed batchId, GameManager.BatchResult result) — событие после обработки батча.
PlayerStateUpdated(address indexed player, GameManager.PlayerState newState) — событие при экстренном обновлении состояния игрока.
Основные функции и методы
setUp()
Описание: Функция подготовки тестовой среды. Создаёт адреса, деплоит контракты, назначает роли и выдает первоначальные количества токенов MANA игрокам.
Использование: Вызывается перед каждым тестом автоматически.
Тесты конструктора
test_Constructor()— проверяет корректность инициализации переменных и ролей.test_Constructor_ZeroAddresses()— проверяет выброс ошибок при передаче нулевых адресов в конструктор.
Тесты функции submitGameAction
Параметры:
actionType — тип действия из перечисления
GameManager.ActionType.actionParams— закодированные параметры действия.manaAmount— количество MANA, связанное с действием.
Возвращаемое значение:
bytes32— идентификатор действия.Тесты проверяют:
Успешную отправку действий с расходом и заработком маны.
Обработку ошибок при недостаточном балансе маны.
Проверку правильности параметров.
Поведение при паузе контракта.
Обработка максимального значения типа действия.
Тесты функции processBatch
Параметры:
batchId— идентификатор батча.result— структура GameManager.BatchResult с результатами обработки.epoch— номер эпохи (используется для валидации).proof— данные доказательства (используются для валидации, в тестах — пустые).
Описание: Обрабатывает пакет действий, обновляет состояния игроков и эмитирует событие.
Проверяется:
Успешная обработка.
Защита от повторной обработки.
Поведение при паузе.
Тесты функции getActionStatus
Возвращает статус действия по
actionId: создано, не найдено, истекло.Тесты проверяют корректность реакции на разные статусы.
Тесты функции getPlayerManaBalance и getPlayerState
Возвращают текущее состояние игрока и баланс маны.
Проверяют корректность значений по умолчанию и после обновлений.
Экстренные функции
emergencyUpdatePlayerState(address player, GameManager.PlayerState newState)Позволяет администратору экстренно обновить состояние игрока.
Проверяет недопустимость нулевого адреса и авторизацию.
Функции управления паузой
pause() и unpause() — ставят контракт в паузу и выводят из неё.
Проверяется авторизация и корректность статуса.
Проверка и валидация параметров для различных игровых механик
PvP-бои (
validatePvPBattleParams)Крафтинг (
validateCraftingParams)Торговля на маркетплейсе (
validateMarketplaceTradeParams)Повышение уровня (
validateLevelUpParams)
Расчёт стоимости игровых действий
calculatePvPCost(battleType)calculateCraftingCost(recipeId, quantity, level)calculateLevelUpCost(level)calculateLevelBasedCost(baseCost, playerLevel, actionType)calculateMarketplaceCost(amount, tradeType, level)
Тесты проверяют правильное масштабирование стоимости с учётом уровня игрока и типа действия.
Проверка возможности выполнения действий игроком
canPlayRanked(address player)canCraft(address player, uint256 recipeId, uint256 quantity)canMakeMarketplaceTrade(address player, uint256 amount, uint8 tradeType)canLevelUp(address player)
Получение статистики
PvP-статистика:
getPvPStats(address player)Крафтинг-статистика:
getCraftingStats(address player)Статистика торгов:
getMarketplaceStats(address player)История торгов:
getTradeHistory(address player)Прогресс персонажа:
getProgressionStats(address player)Прогресс уровня:
getLevelProgressInfo(address player)
Вспомогательные функции для генерации параметров действий
Создание параметров PvP-боя, крафта, торговли и повышения уровня.
Используются в тестах для генерации корректных и некорректных параметров.
Важные детали реализации и алгоритмы
Используется проверка ролей доступа и пауза для защиты от несанкционированных действий.
Механизм nonce для уникализации игровых действий.
Валидация параметров с проверкой временных меток, чтобы избежать устаревших действий.
Расчёт стоимости игровых операций с учётом скидок, зависящих от уровня игрока, с верхними лимитами на скидки.
Механизм батчевой обработки результатов с обновлением состояний игроков и предотвращением повторной обработки.
Расчёт статистики и прогресса с использованием формул для опыта и стоимости уровней.
Использование мок-контракта
SettlementMockдля эмуляции внешней проверки батчей.
Взаимодействие с другими частями системы
GameManager— основной контракт, который тестируется.ManaToken— токен MANA, используемый для оплаты действий и вознаграждений.SettlementMock— мок для внешней системы валидации батчей.OpenZeppelin
IAccessControl— интерфейс для проверки ролей и доступа.Forge Std (
Test) — библиотека для тестирования и симуляции.
Тесты демонстрируют интеграцию с токеном, проверку ролей, работу с правами администратора и игрока, а также обработку игровых событий.
Пример использования функции submitGameAction
vm.prank(player1);
bytes32 actionId = gameManager.submitGameAction(
GameManager.ActionType.SPEND_MANA,
abi.encode("some_action_parameters"),
100 * 10**18
);
Mermaid диаграмма структуры контракта GameManagerTest
classDiagram
class GameManagerTest {
+GameManager gameManager
+ManaToken manaToken
+SettlementMock settlement
+address admin
+address player1
+address player2
+address validator
+setUp()
+test_Constructor()
+test_Constructor_ZeroAddresses()
+test_SubmitGameAction_SpendMana()
+test_SubmitGameAction_EarnMana()
+test_SubmitGameAction_InsufficientMana()
+test_ProcessBatch_Success()
+test_ProcessBatch_AlreadyProcessed()
+test_GetActionStatus_Created()
+test_GetPlayerManaBalance()
+test_EmergencyUpdatePlayerState()
+test_Pause()
+test_AllActionTypes()
+testFuzz_SubmitGameAction(uint256)
+testFuzz_ProcessBatch(uint8)
+test_SupportsInterface()
+test_Constants()
+test_SubmitPvPBattle_Success()
+test_ValidatePvPBattleParams_ValidParams()
+test_CalculatePvPCost_Ranked()
+test_GetPvPStats_DefaultPlayer()
+test_CanPlayRanked_InsufficientLevel()
+test_SubmitCraftingAction_Success()
+test_ValidateCraftingParams_ValidParams()
+test_CalculateCraftingCost_Tier1()
+test_GetCraftingStats_DefaultPlayer()
+test_CanCraft_Tier1Recipe()
+test_SubmitMarketplaceTrade_Success()
+test_ValidateMarketplaceTradeParams_ValidParams()
+test_CalculateMarketplaceCost_BuyTrade()
+test_GetMarketplaceStats_DefaultPlayer()
+test_CanMakeMarketplaceTrade_InsufficientLevel()
+test_GetMarketplaceFeeRate_DefaultLevel()
+test_GetTradeHistory_DefaultPlayer()
+test_ValidateMarketplaceTrade_ComprehensiveValidation()
+test_CalculateLevelUpCost_Level1()
+test_CalculateExperienceForLevel_Level1()
+test_CanLevelUp_InsufficientExperience()
+test_GetLevelProgressInfo_CanLevelUp()
+test_SubmitLevelUpAction_Success()
+test_LevelUp_ProcessBatch_Success()
+testFuzz_CalculateLevelUpCost(uint256)
+testFuzz_CalculateExperienceForLevel(uint256)
+testFuzz_CalculateLevelBasedCost_Crafting(uint256,uint256)
+_createValidLevelUpParams(uint256,uint256)
+_createValidCraftingParams(uint256,uint256)
+_createValidBattleParams(address,uint256,uint8)
+_createValidTradeParams(uint256,uint256,uint8,uint256)
}
Заключение
Файл GameManager.t.sol — это полный и глубоко проработанный набор модульных и интеграционных тестов для контрактов игровой системы на Ethereum. Он обеспечивает высокую степень уверенности в корректности реализации ключевых игровых механик, включая манипуляции с токенами, обработку игровых действий, прогресс игроков, PvP-сражения, крафтинг и торговлю. Тесты охватывают как позитивные сценарии, так и негативные кейсы, а также используют фуззинг для проверки на граничных значениях.
Эта тестовая база является важным инструментом для поддержки качества и безопасности игрового смарт-контракта GameManager и его взаимодействия с другими компонентами экосистемы.