From 21d8febeb04ffa0394c5cfb092a191c9c58a9de8 Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Thu, 8 Jan 2026 20:47:00 +0900 Subject: [PATCH] =?UTF-8?q?test:=20=EC=A7=84=ED=96=89=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=B0=8F=20=EB=A3=A8=ED=94=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=99=95=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/core/engine/progress_loop_test.dart | 50 ++++++++++++++++--- test/core/engine/progress_service_test.dart | 54 +++++++++++++++++---- 2 files changed, 87 insertions(+), 17 deletions(-) diff --git a/test/core/engine/progress_loop_test.dart b/test/core/engine/progress_loop_test.dart index f937383..3bf2699 100644 --- a/test/core/engine/progress_loop_test.dart +++ b/test/core/engine/progress_loop_test.dart @@ -2,11 +2,15 @@ import 'package:asciineverdie/src/core/engine/game_mutations.dart'; import 'package:asciineverdie/src/core/engine/progress_loop.dart'; import 'package:asciineverdie/src/core/engine/progress_service.dart'; import 'package:asciineverdie/src/core/engine/reward_service.dart'; +import 'package:asciineverdie/src/core/model/combat_state.dart'; +import 'package:asciineverdie/src/core/model/combat_stats.dart'; import 'package:asciineverdie/src/core/model/game_state.dart'; +import 'package:asciineverdie/src/core/model/monster_combat_stats.dart'; import 'package:asciineverdie/src/core/model/pq_config.dart'; import 'package:asciineverdie/src/core/storage/save_manager.dart'; import 'package:asciineverdie/src/core/storage/save_repository.dart'; import 'package:asciineverdie/src/core/storage/save_service.dart'; +import 'package:asciineverdie/src/core/util/balance_constants.dart'; import 'package:flutter_test/flutter_test.dart'; class _FakeSaveManager implements SaveManager { @@ -54,6 +58,37 @@ void main() { test('autosaves on level-up and stop when configured', () async { final saveManager = _FakeSaveManager(); + + // 레벨 1에서 레벨업에 필요한 경험치 + final requiredExp = ExpConstants.requiredExp(1); + + // 레벨업에 충분한 경험치를 주는 몬스터 (사망 상태) + final monsterStats = MonsterCombatStats( + name: 'Test Monster', + level: 1, + atk: 10, + def: 5, + hpMax: 50, + hpCurrent: 0, // 몬스터 사망 + criRate: 0.05, + criDamage: 1.5, + evasion: 0.0, + accuracy: 0.8, + attackDelayMs: 1000, + expReward: requiredExp + 100, // 레벨업에 충분한 경험치 + ); + + final combatState = CombatState( + playerStats: CombatStats.empty(), + monsterStats: monsterStats, + playerAttackAccumulatorMs: 0, + monsterAttackAccumulatorMs: 0, + totalDamageDealt: 50, + totalDamageTaken: 0, + turnsElapsed: 1, + isActive: true, + ); + final initial = GameState.withSeed( seed: 123, traits: const Traits( @@ -74,15 +109,16 @@ void main() { hpMax: 9, mpMax: 8, ), - progress: const ProgressState( - task: ProgressBarState(position: 1200, max: 1200), - quest: ProgressBarState(position: 0, max: 10), - plot: ProgressBarState(position: 0, max: 10), - exp: ProgressBarState(position: 3, max: 3), - encumbrance: ProgressBarState(position: 0, max: 0), - currentTask: TaskInfo(caption: 'Battle', type: TaskType.kill), + progress: ProgressState( + task: const ProgressBarState(position: 1200, max: 1200), + quest: const ProgressBarState(position: 0, max: 10), + plot: const ProgressBarState(position: 0, max: 10), + exp: ProgressBarState(position: requiredExp - 50, max: requiredExp), + encumbrance: const ProgressBarState(position: 0, max: 0), + currentTask: const TaskInfo(caption: 'Battle', type: TaskType.kill), plotStageCount: 1, questCount: 0, + currentCombat: combatState, ), ); diff --git a/test/core/engine/progress_service_test.dart b/test/core/engine/progress_service_test.dart index 80745de..1418214 100644 --- a/test/core/engine/progress_service_test.dart +++ b/test/core/engine/progress_service_test.dart @@ -1,9 +1,12 @@ import 'package:asciineverdie/src/core/engine/game_mutations.dart'; import 'package:asciineverdie/src/core/engine/progress_service.dart'; import 'package:asciineverdie/src/core/engine/reward_service.dart'; +import 'package:asciineverdie/src/core/model/combat_state.dart'; +import 'package:asciineverdie/src/core/model/combat_stats.dart'; import 'package:asciineverdie/src/core/model/game_state.dart'; +import 'package:asciineverdie/src/core/model/monster_combat_stats.dart'; import 'package:asciineverdie/src/core/model/pq_config.dart'; -import 'package:asciineverdie/src/core/util/pq_logic.dart' as pq_logic; +import 'package:asciineverdie/src/core/util/balance_constants.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { @@ -62,6 +65,36 @@ void main() { }); test('tick levels up when EXP is full during kill task', () { + // 레벨업에 필요한 경험치 (레벨 1 → 2) + final requiredExp = ExpConstants.requiredExp(1); + + // 몬스터가 requiredExp 이상의 경험치를 주도록 설정 + final monsterStats = MonsterCombatStats( + name: 'Test Monster', + level: 10, + atk: 10, + def: 5, + hpMax: 100, + hpCurrent: 0, // 몬스터 사망 상태 + criRate: 0.05, + criDamage: 1.5, + evasion: 0.0, + accuracy: 0.8, + attackDelayMs: 1000, + expReward: requiredExp + 100, // 레벨업에 충분한 경험치 + ); + + final combatState = CombatState( + playerStats: CombatStats.empty(), + monsterStats: monsterStats, + playerAttackAccumulatorMs: 0, + monsterAttackAccumulatorMs: 0, + totalDamageDealt: 100, + totalDamageTaken: 0, + turnsElapsed: 1, + isActive: true, + ); + final initial = GameState.withSeed( seed: 7, traits: const Traits( @@ -82,15 +115,16 @@ void main() { hpMax: 10, mpMax: 11, ), - progress: const ProgressState( - task: ProgressBarState(position: 1000, max: 1000), - quest: ProgressBarState(position: 0, max: 10), - plot: ProgressBarState(position: 0, max: 10), - exp: ProgressBarState(position: 5, max: 5), - encumbrance: ProgressBarState(position: 0, max: 0), - currentTask: TaskInfo(caption: 'Battle', type: TaskType.kill), + progress: ProgressState( + task: const ProgressBarState(position: 1000, max: 1000), + quest: const ProgressBarState(position: 0, max: 10), + plot: const ProgressBarState(position: 0, max: 10), + exp: ProgressBarState(position: requiredExp - 50, max: requiredExp), + encumbrance: const ProgressBarState(position: 0, max: 0), + currentTask: const TaskInfo(caption: 'Battle', type: TaskType.kill), plotStageCount: 1, questCount: 0, + currentCombat: combatState, ), ); @@ -101,8 +135,8 @@ void main() { expect(result.state.traits.level, 2); expect(result.state.stats.hpMax, greaterThan(initial.stats.hpMax)); expect(result.state.stats.mpMax, greaterThan(initial.stats.mpMax)); - expect(result.state.progress.exp.position, 0); - expect(result.state.progress.exp.max, pq_logic.levelUpTime(2)); + // 새 레벨의 필요 경험치로 초기화됨 + expect(result.state.progress.exp.max, ExpConstants.requiredExp(2)); // 태스크 완료 후 새 태스크가 자동으로 시작됨 expect(result.state.progress.task.position, 0); expect(result.state.progress.task.max, greaterThan(0));