diff --git a/test/features/game_play_screen_test.dart b/test/features/game_play_screen_test.dart index d6e292c..77ab9a8 100644 --- a/test/features/game_play_screen_test.dart +++ b/test/features/game_play_screen_test.dart @@ -6,12 +6,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import '../helpers/mock_factories.dart'; +import '../helpers/test_setup.dart'; /// 테스트용 MaterialApp 래퍼 (localization 포함) +/// locale을 영어로 고정하여 테스트 텍스트와 일치시킴 Widget _buildTestApp(Widget child) { return MaterialApp( localizationsDelegates: L10n.localizationsDelegates, supportedLocales: L10n.supportedLocales, + locale: const Locale('en'), // 영어 locale 고정 home: child, ); } @@ -55,11 +58,37 @@ GameSessionController _createController() { progressService: MockFactories.createProgressService(), saveManager: FakeSaveManager(), tickInterval: const Duration(seconds: 10), // 느린 틱 + hallOfFameStorage: FakeHallOfFameStorage(), + statisticsStorage: FakeStatisticsStorage(), ); } +/// 데스크톱 레이아웃 테스트를 위한 공통 설정 +Future _setupDesktopLayoutTest(WidgetTester tester) async { + await tester.binding.setSurfaceSize(const Size(1200, 800)); + addTearDown(() => tester.binding.setSurfaceSize(null)); +} + +/// 프레임 펌프 (localization 로드 대기) +Future _pumpFrames(WidgetTester tester) async { + await tester.pump(); + await tester.pump(const Duration(milliseconds: 100)); +} + void main() { + // SharedPreferences 모킹 + setUpAll(() { + TestSetup.mockSharedPreferences(); + }); + + // 각 테스트 후 싱글톤 서비스 정리 (타이머 누수 방지) + tearDown(() { + TestSetup.resetAllServices(); + }); + testWidgets('GamePlayScreen renders 3-panel layout', (tester) async { + await _setupDesktopLayoutTest(tester); + final controller = _createController(); addTearDown(() async { await controller.pause(saveOnStop: false); @@ -74,20 +103,23 @@ void main() { ), ); + await _pumpFrames(tester); + // AppBar 타이틀 확인 (L10n 사용) - ASCII NEVER DIE expect(find.textContaining('ASCII NEVER DIE'), findsOneWidget); - // 3패널 헤더 확인 - expect(find.text('Character Sheet'), findsOneWidget); - expect(find.text('Equipment'), findsOneWidget); - expect(find.text('Plot Development'), findsOneWidget); - expect(find.text('Quests'), findsOneWidget); + // 3패널 헤더 확인 (패널 헤더는 대문자로 표시됨) + expect(find.text('CHARACTER SHEET'), findsOneWidget); + expect(find.text('EQUIPMENT'), findsOneWidget); + expect(find.text('PLOT DEVELOPMENT'), findsOneWidget); + expect(find.text('QUESTS'), findsOneWidget); - // 테스트 완료 후 정리 await controller.pause(saveOnStop: false); }); testWidgets('GamePlayScreen shows character traits', (tester) async { + await _setupDesktopLayoutTest(tester); + final controller = _createController(); addTearDown(() async { await controller.pause(saveOnStop: false); @@ -102,8 +134,10 @@ void main() { ), ); - // Traits 섹션 확인 - expect(find.text('Traits'), findsOneWidget); + await _pumpFrames(tester); + + // Traits 섹션 확인 (섹션 헤더는 대문자로 표시됨) + expect(find.text('TRAITS'), findsOneWidget); expect(find.text('TestHero'), findsOneWidget); expect(find.text('Elf'), findsOneWidget); expect(find.text('Mage'), findsOneWidget); @@ -112,6 +146,8 @@ void main() { }); testWidgets('GamePlayScreen shows stats', (tester) async { + await _setupDesktopLayoutTest(tester); + final controller = _createController(); addTearDown(() async { await controller.pause(saveOnStop: false); @@ -126,8 +162,10 @@ void main() { ), ); - // Stats 섹션 확인 (스크롤로 인해 화면 밖에 있을 수 있음) - expect(find.text('Stats'), findsOneWidget); + await _pumpFrames(tester); + + // Stats 섹션 확인 (섹션 헤더는 대문자로 표시됨, 스크롤로 인해 화면 밖에 있을 수 있음) + expect(find.text('STATS', skipOffstage: false), findsOneWidget); expect(find.text('STR', skipOffstage: false), findsOneWidget); expect(find.text('CON', skipOffstage: false), findsOneWidget); @@ -135,6 +173,8 @@ void main() { }); testWidgets('GamePlayScreen shows current task caption', (tester) async { + await _setupDesktopLayoutTest(tester); + final controller = _createController(); addTearDown(() async { await controller.pause(saveOnStop: false); @@ -149,6 +189,8 @@ void main() { ), ); + await _pumpFrames(tester); + // 현재 태스크 캡션 확인 (퀘스트 목록과 하단 패널에 표시됨) expect(find.text('Battling a Goblin'), findsAtLeast(1)); @@ -156,6 +198,8 @@ void main() { }); testWidgets('GamePlayScreen shows progress bars', (tester) async { + await _setupDesktopLayoutTest(tester); + final controller = _createController(); addTearDown(() async { await controller.pause(saveOnStop: false); @@ -170,8 +214,11 @@ void main() { ), ); - // LinearProgressIndicator가 여러 개 표시되는지 확인 - expect(find.byType(LinearProgressIndicator), findsAtLeast(4)); + await _pumpFrames(tester); + + // 프로그레스 바 관련 섹션 헤더 확인 (커스텀 세그먼트 프로그레스 바 사용) + expect(find.text('EXPERIENCE', skipOffstage: false), findsOneWidget); + expect(find.text('ENCUMBRANCE', skipOffstage: false), findsOneWidget); await controller.pause(saveOnStop: false); });