main_test.go
Обзор
Файл main_test.go содержит набор модульных тестов для проверки корректности обработки различных игровых действий в системе. Основная цель — протестировать функции обработки игровых событий (action events), связанных с действиями игрока в игре, такими как расход маны, получение маны, создание предметов, PvP-бои и торговля на рынке. Это файл тестов, который использует фреймворк Go testing и библиотеку stretchr/testify для утверждений.
Тестируются методы структуры GameNode, которые, судя по названию, отвечают за логику обработки игровых событий. Тесты проверяют как корректную работу с валидными параметрами, так и обработку ошибок при некорректных данных.
Описание структуры и функций
Структура GameNode
В данном файле структура GameNode не определена, однако она используется для вызова методов:
getActionTypeName(actionType uint8) stringisValidActionType(actionType uint8) boolprocessSpendManaAction(ctx context.Context, event game.GameActionEvent) errorprocessEarnManaAction(ctx context.Context, event game.GameActionEvent) errorprocessCraftItemAction(ctx context.Context, event game.GameActionEvent) errorprocessPvPBattleAction(ctx context.Context, event game.GameActionEvent) errorprocessMarketplaceTradeAction(ctx context.Context, event game.GameActionEvent) error
Это методы, которые, по всей видимости, реализуют логику обработки различных игровых действий.
Функции тестирования
Все функции имеют стандартный формат тестов в Go: func TestXxx(t *testing.T)
TestGetActionTypeName(t *testing.T)
Назначение: Проверка функции
getActionTypeName, которая по числовому коду действия возвращает строковое имя действия.Параметры: нет (тестовая функция)
Возвращаемое значение: нет, используется
assert.Equalдля проверки соответствия результата ожидаемому.Пример использования:
gn := &GameNode{} name := gn.getActionTypeName(ActionTypeSpendMana) // "SPEND_MANA"Тестовые кейсы: проверяются известные типы действий (SPEND_MANA, EARN_MANA, LEVEL_UP и т.д.) и неизвестный код (99), который должен возвращать "UNKNOWN(99)".
TestIsValidActionType(t *testing.T)
Назначение: Проверка функции
isValidActionType, которая определяет, является ли числовой код действия валидным.Параметры: нет
Возвращаемое значение: нет, проверяется булево значение.
Пример использования:
gn := &GameNode{} valid := gn.isValidActionType(ActionTypePvPBattle) // trueТестовые кейсы: проверка известных валидных кодов и нескольких невалидных (6, 255).
TestProcessSpendManaAction(t *testing.T)
Назначение: Проверка обработки действия "расход маны".
Параметры: нет
Тестовые кейсы:
Корректный расход маны (100)
Попытка расхода нулевой маны (0) — ошибка
Отрицательное число маны (-50) — ошибка
Пример создания события:
actionEvent := game.GameActionEvent{ ActionID: [32]byte{1,2,3}, Action: contracts.GameManagerGameAction{ Player: common.HexToAddress("0x1234..."), ActionType: ActionTypeSpendMana, ManaAmount: big.NewInt(100), // ... }, } err := gn.processSpendManaAction(ctx, actionEvent)
TestProcessEarnManaAction(t *testing.T)
Назначение: Тестирование обработки действия "получение маны".
Тестовые кейсы: получение маны с параметрами и без, а также ошибка при нулевой сумме.
Особенности:
ActionParamsмогут содержать дополнительную информацию (например, "quest_reward").
TestProcessCraftItemAction(t *testing.T)
Назначение: Тестирование обработки крафта предмета.
Тестовые кейсы:
Правильный крафт с параметрами (например, рецепт)
Отсутствие параметров — ошибка
Нулевая стоимость маны — ошибка
TestProcessPvPBattleAction(t *testing.T)
Назначение: Тестирование обработки PvP-боя.
Тестовые кейсы:
Корректный бой с параметрами (адрес оппонента)
Отсутствие параметров — ошибка
Нулевая сумма маны — ошибка
TestProcessMarketplaceTradeAction(t *testing.T)
Назначение: Тестирование действий торговли на рынке.
Тестовые кейсы:
Корректная торговля с параметрами (ID предмета)
Отсутствие параметров — ошибка
Нулевая сумма сделки — ошибка
Важные детали реализации
Для всех тестов используется экземпляр
GameNode(вероятно, реализующий игровую логику).Все действия описываются структурой
game.GameActionEvent, которая содержит полеActionтипаcontracts.GameManagerGameAction.Используется стандартный контекст
context.Background()для передачи контекста в функции.Для проверки результатов используется пакет
github.com/stretchr/testify/assert, который облегчает написание утверждений.Тесты проверяют корректность обработки как валидных, так и ошибочных сценариев, что говорит о продуманной валидации данных.
Взаимодействие с другими частями системы
В тестах импортируются пакеты:
sum/internal/contracts— вероятно, содержит определения контрактов и структур данных для взаимодействия с игровой логикой.sum/internal/game— содержит игровые структуры и события.github.com/ethereum/go-ethereum/common— используется для работы с Ethereum-адресами, что указывает на взаимодействие с блокчейном.
GameNode— ключевой компонент, реализующий логику обработки игровых действий.Тестируемые методы, скорее всего, вызываются в основном игровом сервисе для обработки поступающих событий из блокчейна или игровой логики.
Диаграмма структуры файла
Файл содержит набор тестовых функций, которые вызывают методы GameNode. Визуально это можно представить как поток тестов, каждый из которых проверяет отдельный метод обработки действия.
flowchart TD
A[TestGetActionTypeName] --> B[getActionTypeName]
C[TestIsValidActionType] --> D[isValidActionType]
E[TestProcessSpendManaAction] --> F[processSpendManaAction]
G[TestProcessEarnManaAction] --> H[processEarnManaAction]
I[TestProcessCraftItemAction] --> J[processCraftItemAction]
K[TestProcessPvPBattleAction] --> L[processPvPBattleAction]
M[TestProcessMarketplaceTradeAction] --> N[processMarketplaceTradeAction]
style A fill:#f9f,stroke:#333,stroke-width:1px
style C fill:#f9f,stroke:#333,stroke-width:1px
style E fill:#bbf,stroke:#333,stroke-width:1px
style G fill:#bbf,stroke:#333,stroke-width:1px
style I fill:#bbf,stroke:#333,stroke-width:1px
style K fill:#bbf,stroke:#333,stroke-width:1px
style M fill:#bbf,stroke:#333,stroke-width:1px
classDef testFunc fill:#bbf,stroke:#333,stroke-width:1px,color:#000,font-weight:bold
classDef method fill:#f96,color:#000,font-style:italic
class A,C,E,G,I,K,M testFunc
class B,D,F,H,J,L,N method
Итог
Файл main_test.go является критически важным для обеспечения качества и корректности игровых операций в системе. Он покрывает ключевые сценарии обработки игровых действий, проверяя как корректные, так и некорректные случаи, что позволяет избежать ошибок при взаимодействии игроков с игрой и блокчейном.
Тесты интегрируются с внутренними игровыми контрактами и событиями, обеспечивая стабильность и предсказуемость работы игрового ядра.