| import 'package:flutter/material.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| import 'package:lib.widgets/modular.dart'; |
| import 'package:topaz.examples.tictactoe.bin.tictactoe.game_board_mod._tictactoe_game_board_mod_dart_library/src/model/tictactoe_model.dart'; // ignore: implementation_imports |
| import 'package:topaz.examples.tictactoe.bin.tictactoe.game_board_mod._tictactoe_game_board_mod_dart_library/src/widget/square.dart'; // ignore: implementation_imports |
| import 'package:topaz.examples.tictactoe.bin.tictactoe.game_board_mod._tictactoe_game_board_mod_dart_library/src/widget/tictactoe_board.dart'; // ignore: implementation_imports |
| |
| void main() { |
| testWidgets('x in middle', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(1, 1); |
| |
| expect(gameTester.getSquareValue(1, 1), 'X'); |
| expect(gameTester.getSquareValue(0, 1), ' '); |
| }); |
| |
| testWidgets('x and o played', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(1, 0); |
| |
| expect(gameTester.getSquareValue(1, 1), 'X'); |
| expect(gameTester.getSquareValue(1, 0), 'O'); |
| expect(gameTester.getSquareValue(0, 1), ' '); |
| }); |
| |
| testWidgets('square played twice', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(1, 1); |
| |
| expect(gameTester.getSquareValue(1, 1), 'X'); |
| }); |
| |
| testWidgets('x wins', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(0, 0); |
| await gameTester.tapSquare(0, 2); |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(2, 0); |
| await gameTester.tapSquare(2, 2); |
| |
| gameTester.checkForGameResult('X wins'); |
| }); |
| |
| testWidgets('o wins', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(1, 2); |
| await gameTester.tapSquare(0, 0); |
| await gameTester.tapSquare(0, 2); |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(2, 0); |
| await gameTester.tapSquare(2, 2); |
| |
| gameTester.checkForGameResult('O wins'); |
| }); |
| |
| testWidgets('cats game', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(0, 2); |
| await gameTester.tapSquare(0, 1); |
| await gameTester.tapSquare(2, 1); |
| await gameTester.tapSquare(1, 2); |
| await gameTester.tapSquare(1, 0); |
| await gameTester.tapSquare(0, 0); |
| await gameTester.tapSquare(2, 2); |
| await gameTester.tapSquare(2, 0); |
| |
| gameTester.checkForGameResult('Cats'); |
| }); |
| |
| testWidgets("can't play after game done", (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(0, 0); |
| await gameTester.tapSquare(0, 2); |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(2, 0); |
| await gameTester.tapSquare(2, 2); |
| await gameTester.tapSquare(2, 1); |
| |
| expect(gameTester.getSquareValue(2, 1), ' '); |
| }); |
| |
| testWidgets('x wins then o wins', (WidgetTester tester) async { |
| GameTester gameTester = await GameTester.startGame(tester); |
| |
| await gameTester.tapSquare(0, 0); |
| await gameTester.tapSquare(0, 2); |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(2, 0); |
| await gameTester.tapSquare(2, 2); |
| |
| gameTester.checkForGameResult('X wins'); |
| |
| await gameTester.tapOnPlayAgain(); |
| |
| await gameTester.tapSquare(0, 2); |
| await gameTester.tapSquare(0, 0); |
| await gameTester.tapSquare(2, 0); |
| await gameTester.tapSquare(1, 1); |
| await gameTester.tapSquare(0, 1); |
| await gameTester.tapSquare(2, 2); |
| |
| gameTester.checkForGameResult('O wins'); |
| }); |
| } |
| |
| class GameTester { |
| WidgetTester widgetTester; |
| Widget gameBoard; |
| |
| GameTester._(this.widgetTester, this.gameBoard); |
| |
| static Future<GameTester> startGame(WidgetTester widgetTester) async { |
| TicTacToeModel tacToeModel = new TicTacToeModel(); |
| Widget testWidget = new MaterialApp( |
| home: new Material( |
| child: new ScopedModel<TicTacToeModel>( |
| model: tacToeModel, |
| child: new TicTacToeBoard(), |
| ), |
| ), |
| ); |
| await widgetTester.pumpWidget(testWidget); |
| return new GameTester._(widgetTester, testWidget); |
| } |
| |
| Future<Null> tapOnPlayAgain() async { |
| await widgetTester.tap(find.text('Tap to play again')); |
| await widgetTester.pumpWidget(gameBoard); |
| return null; |
| } |
| |
| Future<Null> tapSquare(int row, int column) async { |
| await widgetTester.tap(find.descendant( |
| of: new SquareFinder(row, column), |
| matching: find.byType(GestureDetector))); |
| await widgetTester.pumpWidget(gameBoard); |
| return null; |
| } |
| |
| String getSquareValue(int row, int column) { |
| Text text = find |
| .descendant( |
| of: new SquareFinder(row, column), matching: find.byType(Text)) |
| .evaluate() |
| .first |
| .widget; |
| return text.data; |
| } |
| |
| void checkForGameResult(String result) { |
| expect(find.text(result), findsOneWidget); |
| } |
| } |
| |
| class SquareFinder extends MatchFinder { |
| int row; |
| int column; |
| |
| SquareFinder(this.row, this.column); |
| |
| @override |
| String get description => 'Find square for row $row and column $column'; |
| |
| @override |
| bool matches(Element candidate) { |
| Widget widget = candidate.widget; |
| if (!(widget is Square)) { |
| return false; |
| } |
| Square square = widget; |
| return square.row == row && square.column == column; |
| } |
| } |