import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:werwolf/main.dart' as app; import 'package:werwolf/screens/playerregistry.dart'; import 'package:werwolf/screens/settings.dart'; import 'package:werwolf/screens/flippingcards.dart'; import 'package:werwolf/screens/gameboard.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); group('Werwolf Game Integration Tests', () { testWidgets('Complete game flow', (WidgetTester tester) async { app.main(); await tester.pumpAndSettle(); // Ensure we are on the PlayerRegistry screen expect(find.byType(PlayerRegistry), findsOneWidget); // Add players for (int i = 1; i <= 6; i++) { // Find the TextField, enter text, and simulate the 'done' action on the keyboard await tester.tap(find.byType(TextField).first); await tester.enterText(find.byType(TextField).first, 'Player $i'); await tester.testTextInput.receiveAction(TextInputAction.done); // Wait for the UI to settle before proceeding await tester.pumpAndSettle(); // Debug print to check entered text debugPrint('Entered Player $i'); } // Ensure all players are added for (int i = 1; i <= 6; i++) { expect(find.text('Player $i'), findsOneWidget); // Debug print to confirm text presence debugPrint('Confirmed Player $i is present'); } // Navigate to GameSettings screen await tester.tap(find.text('Spiel einstellen')); await tester.pumpAndSettle(); expect(find.byType(GameSettings), findsOneWidget); // Ensure the number of players and wolves are displayed correctly expect(find.text('Anzahl der Spieler 6'), findsOneWidget); expect(find.text('Anzahl der Werwölfe 1'), findsOneWidget); // Toggle a special role await tester.tap(find.byType(Switch).first); await tester.pumpAndSettle(); expect((tester.widget(find.byType(Switch).first) as Switch).value, true); // Navigate to FlipingCard screen await tester.tap(find.text('Spiel starten!')); await tester.pumpAndSettle(); expect(find.byType(FlipingCard), findsOneWidget); // Track player roles Map playerRoles = {}; // Flip through all players for (int i = 1; i <= 5; i++) { await tester.tap(find.text('Klick um deine Rolle zu sehen!')); await tester.pumpAndSettle(); // Debug print to check the UI and role text for (var widget in tester.allWidgets) { if (widget is Text) { debugPrint('Text widget: ${widget.data}'); } } // Assuming the role is displayed somewhere we can read // Adjust the role extraction to how your app displays the role String role = tester .widgetList(find.byType(Text)) .map((e) => e.data!) .firstWhere( (text) => text.contains('Dorfbewohner') || text.contains('Werwolf') || text.contains('Joker'), orElse: () => 'Unknown'); if (role == 'Unknown') { throw StateError('No valid role found for Player $i'); } playerRoles['Player $i'] = role; await tester.tap(find.text('Nächster Spieler')); await tester.pumpAndSettle(); } // Ensure we navigate to the game board await tester.tap(find.text('Spiel anfangen!')); await tester.pumpAndSettle(); expect(find.byType(PlayerGridView), findsOneWidget); // Find a player who is not a Werewolf to kill String playerToKill = playerRoles.entries .firstWhere((entry) => entry.value != 'Werwolf') .key; // Tap to kill a non-Werewolf player await tester.tap(find.text(playerToKill)); await tester.pumpAndSettle(); expect(find.byIcon(Icons.close), findsOneWidget); expect(find.byIcon(Icons.wb_sunny), findsOneWidget); // Skip phase await tester.tap(find.byType(ElevatedButton).first); await tester.pumpAndSettle(); expect(find.byIcon(Icons.nights_stay), findsOneWidget); }); }); }