diff --git a/lib/game/components/google_word/google_word.dart b/lib/game/components/google_word/google_word.dart index 2a424af0..9a9faa9a 100644 --- a/lib/game/components/google_word/google_word.dart +++ b/lib/game/components/google_word/google_word.dart @@ -1,4 +1,5 @@ import 'package:flame/components.dart'; +import 'package:flutter/material.dart'; import 'package:pinball/game/components/google_word/behaviors/behaviors.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -20,4 +21,10 @@ class GoogleWord extends Component { GoogleWordBonusBehavior(), ], ); + + /// Creates a [GoogleWord] without any children. + /// + /// This can be used for testing [GoogleWord]'s behaviors in isolation. + @visibleForTesting + GoogleWord.test(); } diff --git a/test/game/components/google_word/behaviors/google_word_bonus_behavior_test.dart b/test/game/components/google_word/behaviors/google_word_bonus_behavior_test.dart new file mode 100644 index 00000000..deca61ee --- /dev/null +++ b/test/game/components/google_word/behaviors/google_word_bonus_behavior_test.dart @@ -0,0 +1,61 @@ +// ignore_for_file: cascade_invocations + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockingjay/mockingjay.dart'; +import 'package:pinball/game/components/google_word/behaviors/behaviors.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball_components/pinball_components.dart'; + +import '../../../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('GoogleWordBonusBehaviors', () { + late GameBloc gameBloc; + + setUp(() { + gameBloc = MockGameBloc(); + whenListen( + gameBloc, + const Stream.empty(), + initialState: const GameState.initial(), + ); + }); + + final flameBlocTester = FlameBlocTester( + gameBuilder: EmptyPinballTestGame.new, + blocBuilder: () => gameBloc, + ); + + flameBlocTester.testGameWidget( + 'adds GameBonus.googleWord to the game when all letters are activated', + setUp: (game, tester) async { + final behavior = GoogleWordBonusBehavior(); + final parent = GoogleWord.test(); + final letters = [ + GoogleLetter(0), + GoogleLetter(1), + GoogleLetter(2), + GoogleLetter(3), + GoogleLetter(4), + GoogleLetter(5), + ]; + await parent.addAll(letters); + await game.ensureAdd(parent); + await parent.ensureAdd(behavior); + + for (final letter in letters) { + letter.bloc.onBallContacted(); + } + await tester.pump(); + + verify( + () => gameBloc.add(const BonusActivated(GameBonus.googleWord)), + ).called(1); + }, + ); + }); +} diff --git a/test/game/components/google_word/google_word_test.dart b/test/game/components/google_word/google_word_test.dart new file mode 100644 index 00000000..2d7d04e5 --- /dev/null +++ b/test/game/components/google_word/google_word_test.dart @@ -0,0 +1,26 @@ +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball_components/pinball_components.dart'; + +import '../../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(EmptyPinballTestGame.new); + + group('GoogleWord', () { + flameTester.test( + 'loads the letters correctly', + (game) async { + const word = 'Google'; + final googleWord = GoogleWord(position: Vector2.zero()); + await game.ensureAdd(googleWord); + + final letters = googleWord.children.whereType(); + expect(letters.length, equals(word.length)); + }, + ); + }); +} diff --git a/test/game/components/google_word_test.dart b/test/game/components/google_word_test.dart deleted file mode 100644 index fee7bdd0..00000000 --- a/test/game/components/google_word_test.dart +++ /dev/null @@ -1,73 +0,0 @@ -// ignore_for_file: cascade_invocations - -import 'package:bloc_test/bloc_test.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; -import 'package:flame_test/flame_test.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:mockingjay/mockingjay.dart'; -import 'package:pinball/game/game.dart'; -import 'package:pinball_components/pinball_components.dart'; - -import '../../helpers/helpers.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); - - group('GoogleWord', () { - late GameBloc gameBloc; - - setUp(() { - gameBloc = MockGameBloc(); - whenListen( - gameBloc, - const Stream.empty(), - initialState: const GameState.initial(), - ); - }); - - final flameTester = FlameTester(EmptyPinballTestGame.new); - final flameBlocTester = FlameBlocTester( - gameBuilder: EmptyPinballTestGame.new, - blocBuilder: () => gameBloc, - ); - - flameTester.test( - 'loads the letters correctly', - (game) async { - const word = 'Google'; - final googleWord = GoogleWord(position: Vector2.zero()); - await game.ensureAdd(googleWord); - - final letters = googleWord.children.whereType(); - expect(letters.length, equals(word.length)); - }, - ); - - flameBlocTester.testGameWidget( - 'adds GameBonus.googleWord to the game when all letters are activated', - setUp: (game, _) async { - final ball = Ball(baseColor: const Color(0xFFFF0000)); - final googleWord = GoogleWord(position: Vector2.zero()); - await game.ensureAddAll([googleWord, ball]); - - final letters = googleWord.children.whereType(); - expect(letters, isNotEmpty); - for (final letter in letters) { - beginContact(game, letter, ball); - await game.ready(); - - if (letter == letters.last) { - verify( - () => gameBloc.add(const BonusActivated(GameBonus.googleWord)), - ).called(1); - } else { - verifyNever( - () => gameBloc.add(const BonusActivated(GameBonus.googleWord)), - ); - } - } - }, - ); - }); -} diff --git a/test/helpers/mocks.dart b/test/helpers/mocks.dart index da6f5124..0f7f7464 100644 --- a/test/helpers/mocks.dart +++ b/test/helpers/mocks.dart @@ -85,3 +85,5 @@ class MockGameFlowController extends Mock implements GameFlowController {} class MockAlienBumper extends Mock implements AlienBumper {} class MockSparkyBumper extends Mock implements SparkyBumper {} + +class MockFlutterForestCubit extends Mock implements FlutterForestCubit {}