engine_test.go
Обзор файла
Файл engine_test.go содержит комплексный набор модульных тестов и бенчмарков для игрового движка, реализованного в пакете game. Цель тестов — проверить корректность основных функций игрового движка, таких как обработка игровых действий (трат маны, получение маны, повышение уровня, крафт предметов, PvP-бои, торговля на рынке), валидация состояний игроков, расчет прогрессии, а также производительность ключевых операций.
Тесты используют фреймворк testing Go и библиотеку testify для удобной проверки условий. В тестах моделируются различные сценарии — успешные операции, ошибки, граничные условия и специфические игровые механики.
Основные компоненты и функции в файле
В этом файле нет объявлений классов или структур, но тесно тестируются методы и функции игрового движка, в частности метод ValidateAction игрового движка и связанные вспомогательные функции.
Тесты создания и инициализации движка
TestNewGameEngine
Проверяет, что при создании нового экземпляра игрового движка (
NewGameEngine) его базовые правила (rules) инициализируются корректно с ожидаемыми значениями (например, стоимость повышения уровня, базовая стоимость крафта, плата за PvP).TestNewGameEngineWithRules
Проверяет создание игрового движка с пользовательскими правилами.
TestUpdateRules
Проверяет, что правила игрового движка можно обновить динамически и они корректно сохраняются.
Тесты обработки игровых действий
Используется структура contracts.GameManagerGameAction, описывающая игровое действие с параметрами:
Player: адрес игрока.ActionType: тип действия (0 - трата маны, 1 - получение маны, 2 - повышение уровня, 3 - крафт, 4 - PvP бой, 5 - торговля на рынке).ManaAmount: количество маны, связанное с действием.ActionParams: дополнительные параметры (например, параметры боя или крафта).Другие поля —
Nonce,CreatedAt(используются для торговли).
Для каждого типа действия написаны отдельные тесты, проверяющие успешные и ошибочные сценарии.
TestProcessSpendMana
Проверяет списание маны игрока с валидацией баланса и ограничения максимального количества маны.
TestProcessEarnMana
Проверяет получение маны с ограничением максимального количества.
TestProcessLevelUp
Проверяет повышение уровня игрока с расчетом стоимости в зависимости от текущего уровня.
TestProcessCraftItem
Проверяет крафт предметов с учетом базовой стоимости и пользовательских параметров крафта.
TestProcessPvPBattle
Проверяет проведение PvP боев с валидацией параметров боя, списанием платы за вход, изменением рейтинга и статистики побед/поражений.
TestProcessMarketplaceTrade
Проверяет торговлю на рынке, включая покупку и продажу с учетом комиссии и проверки наличия достаточного количества предметов и маны.
TestValidateActionUnknownType
Проверяет поведение при неизвестном типе действия.
Тесты пакетной обработки
TestBatchValidateActions
Проверяет пакетную валидацию и применение нескольких действий от разных игроков с обновлением состояний.
TestBatchValidateActionsWithNewPlayer
Проверяет добавление нового игрока с дефолтным состоянием при пакетной обработке.
TestBatchValidateActionsFailure
Проверяет откат пакетной обработки при ошибках.
Тесты игровых механик и вспомогательных функций
TestDetermineBattleResult
Проверяет детерминированность результата боя при одинаковых входных данных.
TestCalculateRatingChange
Проверяет изменение рейтинга игрока после боя с учетом исхода и текущего рейтинга.
TestGetPlayerStats
Проверяет получение агрегированных статистик игрока (уровень, рейтинг, винрейт, общее количество боев и предметов).
TestValidatePlayerState
Проверяет корректность состояния игрока (например, отсутствие отрицательных значений или превышения лимитов).
TestCalculateExperienceForLevel
Проверяет расчет необходимого опыта для достижения уровней.
TestCanLevelUp
Проверяет возможность повышения уровня на основе текущего опыта.
TestEstimateActionCost
Оценивает стоимость различных игровых действий.
Тесты параметров PvP боев:
TestParsePvPBattleParams,TestValidatePvPBattle,TestCalculateBattleResult,TestCalculateWinProbability,TestCalculateELORatingChange,TestCalculateWinReward.Тесты системы крафта:
TestProcessCraftItem_Success,TestParseCraftingParams,TestValidateCrafting,TestCalculateCraftingCost,TestCalculateCraftingResult,TestCalculateCraftingSuccessRate,TestCalculateItemQuality,TestCalculateCraftingExperience.Тесты прогрессии персонажа:
TestGameEngine_ValidateAction_LevelUp,TestGameEngine_ValidateAction_LevelUp_InsufficientExperience,TestGameEngine_ValidateAction_LevelUp_InsufficientMana,TestGameEngine_ValidateAction_LevelUp_MaxLevel,TestGameEngine_CalculateExperienceForLevel,TestGameEngine_CanLevelUp,TestGameEngine_GetLevelProgressInfo,TestGameEngine_CalculateStatProgression,TestGameEngine_CalculateExperienceGain,TestGameEngine_EstimateActionCost_LevelUp,TestGameEngine_ParseLevelUpParams,TestGameEngine_ValidateLevelUp.Тесты торговли на рынке:
TestProcessMarketplaceTrade_BuySuccess,TestProcessMarketplaceTrade_SellSuccess,TestProcessMarketplaceTrade_InsufficientLevel,TestProcessMarketplaceTrade_InsufficientMana,TestProcessMarketplaceTrade_InsufficientItemsToSell,TestParseMarketplaceTradeParams,TestValidateMarketplaceTrade,TestCalculateMarketplaceTradeCost,TestCalculateTradeSuccessProbability,TestGetBaseItemValue,TestCalculateTradingExperience.
Бенчмарки производительности
BenchmarkValidateSpendMana
BenchmarkBatchValidateActions
BenchmarkProcessPvPBattle
BenchmarkCalculateBattleResult
BenchmarkValidateCraftItem
Важные детали реализации и алгоритмы
Все игровые операции валидируются с учетом баланса маны, уровней игрока, опыта, текущего состояния и ограничений правил игры (
GameRules).Для PvP боев используется сложный парсинг параметров битвы из байтового массива, проверка временных меток, рейтингов, типа боя и генерация детерминированного результата боя.
Крафт предметов включает расчет стоимости с учетом скидок в зависимости от уровня, вероятность успеха и качества предмета, а также начисление опыта.
Торговля на рынке учитывает комиссии, проверяет наличие предметов у игрока и ограничивает частоту сделок.
Для повышения уровня проверяется наличие достаточного опыта, стоимости в мане и правильность параметров.
Используются большие целые числа (
big.Int) для точного представления значений маны и опыта.В тестах применяется генерация валидных параметров (например, битвы, крафта, торговли) в виде байтовых массивов.
Взаимодействия с другими частями системы
Импортируется пакет
contractsс типомGameManagerGameAction, который описывает игровые действия, вероятно, общий тип для контракта или игровой логики.Используются Ethereum-адреса из
go-ethereum/commonдля идентификации игроков.Криптографические функции из
go-ethereum/cryptoиспользуются для хеширования и генерации детерминированных значений.Тесты взаимодействуют с игровым движком, реализованным в том же пакете
game, вызывая методыNewGameEngine,ValidateAction,BatchValidateActionsи другие.Валидация и расчет игровых механик основаны на текущем состоянии игрока (
PlayerState), которое, вероятно, хранится в основной системе игрового сервера.
Пример использования (на базе теста)
func ExampleValidateSpendMana() {
engine := NewGameEngine()
ctx := context.Background()
playerAddress := common.HexToAddress("0x123...")
state := PlayerState{
Player: playerAddress,
ManaBalance: big.NewInt(1000),
// остальные поля...
}
action := contracts.GameManagerGameAction{
Player: playerAddress,
ActionType: 0, // SPEND_MANA
ManaAmount: big.NewInt(100),
}
result := engine.ValidateAction(ctx, action, state)
if result.Success {
fmt.Println("Успешно потрачена мана. Новый баланс:", result.NewState.ManaBalance)
} else {
fmt.Println("Ошибка:", result.Error)
}
}
Mermaid диаграмма — Структура тестируемых функций
Файл представляет собой набор тестов, поэтому логично отобразить поток вызовов метода ValidateAction и связанных процессов обработки различных типов действий.
flowchart TD
A[Start: Test запускается] --> B[Создание GameEngine]
B --> C[Вызов ValidateAction]
C --> D{ActionType}
D -->|0: SPEND_MANA| E[Проверка баланса, списание маны]
D -->|1: EARN_MANA| F[Добавление маны, проверка лимитов]
D -->|2: LEVEL_UP| G[Проверка опыта, списание маны, повышение уровня]
D -->|3: CRAFT_ITEM| H[Парсинг параметров, расчет стоимости и результата]
D -->|4: PVP_BATTLE| I[Парсинг параметров, проверка, расчет результата боя]
D -->|5: MARKETPLACE_TRADE| J[Парсинг параметров, проверка, расчет комиссии и результата]
D -->|default| K[Ошибка: неизвестный тип действия]
E --> L[Возврат результата]
F --> L
G --> L
H --> L
I --> L
J --> L
K --> L
Итог
Файл engine_test.go — это тщательно разработанный и подробный набор тестов, покрывающий большинство аспектов игрового движка: валидацию действий, обработку игровых механик, проверку состояний игроков и производительность. Он служит основой для гарантии качества и устойчивости игрового сервиса, обеспечивая стабильную и предсказуемую работу игровых функций.