import 'package:askiineverdie/l10n/app_localizations.dart'; import 'package:askiineverdie/src/core/model/game_state.dart'; import 'package:askiineverdie/src/features/new_character/new_character_screen.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; /// 테스트용 MaterialApp 래퍼 (localization 포함) Widget _buildTestApp(Widget child) { return MaterialApp( localizationsDelegates: L10n.localizationsDelegates, supportedLocales: L10n.supportedLocales, home: child, ); } void main() { testWidgets('NewCharacterScreen renders main sections', (tester) async { await tester.pumpWidget( _buildTestApp(NewCharacterScreen(onCharacterCreated: (_) {})), ); // 화면 타이틀 확인 (l10n 적용됨) expect(find.text('ASCII-Nara - New Character'), findsOneWidget); // 종족 섹션 확인 expect(find.text('Race'), findsOneWidget); // 직업 섹션 확인 expect(find.text('Class'), findsOneWidget); // 능력치 섹션 확인 expect(find.text('Stats'), findsOneWidget); expect(find.text('STR'), findsOneWidget); expect(find.text('CON'), findsOneWidget); // Sold! 버튼 확인 expect(find.text('Sold!'), findsOneWidget); }); testWidgets('Unroll button exists and can be tapped', (tester) async { await tester.pumpWidget( _buildTestApp(NewCharacterScreen(onCharacterCreated: (_) {})), ); // Unroll 버튼 확인 final unrollButton = find.text('Unroll'); expect(unrollButton, findsOneWidget); // Unroll 버튼 탭 await tester.tap(unrollButton); await tester.pump(); // Total이 표시되는지 확인 expect(find.textContaining('Total'), findsOneWidget); }); testWidgets('Sold button creates character with generated name', ( tester, ) async { GameState? createdState; await tester.pumpWidget( _buildTestApp( NewCharacterScreen( onCharacterCreated: (state) { createdState = state; }, ), ), ); // Sold! 버튼이 보이도록 스크롤 await tester.scrollUntilVisible( find.text('Sold!'), 500.0, scrollable: find.byType(Scrollable).first, ); await tester.pumpAndSettle(); // Sold! 버튼 탭 await tester.tap(find.text('Sold!')); await tester.pumpAndSettle(); // 콜백이 호출되었는지 확인 expect(createdState, isNotNull); expect(createdState!.traits.name.isNotEmpty, isTrue); expect(createdState!.traits.level, 1); expect(createdState!.traits.race.isNotEmpty, isTrue); expect(createdState!.traits.klass.isNotEmpty, isTrue); }); testWidgets('Stats section displays all six stats', (tester) async { await tester.pumpWidget( _buildTestApp(NewCharacterScreen(onCharacterCreated: (_) {})), ); // 능력치 라벨들이 표시되는지 확인 expect(find.text('STR'), findsOneWidget); expect(find.text('CON'), findsOneWidget); expect(find.text('DEX'), findsOneWidget); expect(find.text('INT'), findsOneWidget); expect(find.text('WIS'), findsOneWidget); expect(find.text('CHA'), findsOneWidget); // Total 라벨 확인 expect(find.textContaining('Total'), findsOneWidget); }); testWidgets('Name text field exists', (tester) async { await tester.pumpWidget( _buildTestApp(NewCharacterScreen(onCharacterCreated: (_) {})), ); // TextField 확인 (이름 입력 필드) expect(find.byType(TextField), findsOneWidget); }); }