diff --git a/lib/game/behaviors/behaviors.dart b/lib/game/behaviors/behaviors.dart index bb196cec..bca8be14 100644 --- a/lib/game/behaviors/behaviors.dart +++ b/lib/game/behaviors/behaviors.dart @@ -6,4 +6,5 @@ export 'camera_focusing_behavior.dart'; export 'character_selection_behavior.dart'; export 'cow_bumper_noise_behavior.dart'; export 'kicker_noise_behavior.dart'; +export 'rollover_noise_behavior.dart'; export 'scoring_behavior.dart'; diff --git a/lib/game/behaviors/rollover_noise_behavior.dart b/lib/game/behaviors/rollover_noise_behavior.dart new file mode 100644 index 00000000..06b2f77a --- /dev/null +++ b/lib/game/behaviors/rollover_noise_behavior.dart @@ -0,0 +1,13 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class RolloverNoiseBehavior extends ContactBehavior { + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + readProvider().play(PinballAudio.rollover); + } +} diff --git a/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart b/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart index 787fcefc..ed19f495 100644 --- a/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart +++ b/lib/game/components/google_gallery/behaviors/google_word_bonus_behavior.dart @@ -19,6 +19,7 @@ class GoogleWordBonusBehavior extends Component { .add(const BonusActivated(GameBonus.googleWord)); readBloc().onBonusAwarded(); add(BonusBallSpawningBehavior()); + add(GoogleWordAnimatingBehavior()); }, ), ); diff --git a/lib/game/components/google_gallery/google_gallery.dart b/lib/game/components/google_gallery/google_gallery.dart index 0b3d4b10..ec3f9e36 100644 --- a/lib/game/components/google_gallery/google_gallery.dart +++ b/lib/game/components/google_gallery/google_gallery.dart @@ -22,12 +22,14 @@ class GoogleGallery extends Component with ZIndex { side: BoardSide.right, children: [ ScoringContactBehavior(points: Points.fiveThousand), + RolloverNoiseBehavior(), ], ), GoogleRollover( side: BoardSide.left, children: [ ScoringContactBehavior(points: Points.fiveThousand), + RolloverNoiseBehavior(), ], ), GoogleWord(position: Vector2(-4.45, 1.8)), diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index dca26b84..b1f3c98a 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -125,6 +125,7 @@ class PinballGame extends PinballForge2DGame SkillShot( children: [ ScoringContactBehavior(points: Points.oneMillion), + RolloverNoiseBehavior(), ], ), AndroidAcres(), diff --git a/lib/select_character/view/character_selection_page.dart b/lib/select_character/view/character_selection_page.dart index 2355d6cc..5504459f 100644 --- a/lib/select_character/view/character_selection_page.dart +++ b/lib/select_character/view/character_selection_page.dart @@ -132,10 +132,15 @@ class _Character extends StatelessWidget { Widget build(BuildContext context) { return Expanded( child: Opacity( - opacity: isSelected ? 1 : 0.3, + opacity: isSelected ? 1 : 0.4, child: TextButton( onPressed: () => context.read().characterSelected(character), + style: ButtonStyle( + overlayColor: MaterialStateProperty.all( + PinballColors.transparent, + ), + ), child: character.icon.image(fit: BoxFit.contain), ), ), diff --git a/packages/pinball_audio/assets/sfx/rollover.mp3 b/packages/pinball_audio/assets/sfx/rollover.mp3 new file mode 100644 index 00000000..543a3560 Binary files /dev/null and b/packages/pinball_audio/assets/sfx/rollover.mp3 differ diff --git a/packages/pinball_audio/lib/gen/assets.gen.dart b/packages/pinball_audio/lib/gen/assets.gen.dart index c8b66234..0b8fb20b 100644 --- a/packages/pinball_audio/lib/gen/assets.gen.dart +++ b/packages/pinball_audio/lib/gen/assets.gen.dart @@ -26,6 +26,7 @@ class $AssetsSfxGen { String get kickerA => 'assets/sfx/kicker_a.mp3'; String get kickerB => 'assets/sfx/kicker_b.mp3'; String get launcher => 'assets/sfx/launcher.mp3'; + String get rollover => 'assets/sfx/rollover.mp3'; String get sparky => 'assets/sfx/sparky.mp3'; } diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 9682b520..e0e69988 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -33,6 +33,9 @@ enum PinballAudio { /// Kicker. kicker, + /// Rollover. + rollover, + /// Sparky. sparky, @@ -56,7 +59,7 @@ typedef CreateAudioPool = Future Function( }); /// Defines the contract for playing a single audio. -typedef PlaySingleAudio = Future Function(String); +typedef PlaySingleAudio = Future Function(String, {double volume}); /// Defines the contract for looping a single audio. typedef LoopSingleAudio = Future Function(String, {double volume}); @@ -81,18 +84,20 @@ class _SimplePlayAudio extends _Audio { required this.preCacheSingleAudio, required this.playSingleAudio, required this.path, + this.volume, }); final PreCacheSingleAudio preCacheSingleAudio; final PlaySingleAudio playSingleAudio; final String path; + final double? volume; @override Future load() => preCacheSingleAudio(prefixFile(path)); @override void play() { - playSingleAudio(prefixFile(path)); + playSingleAudio(prefixFile(path), volume: volume ?? 1); } } @@ -266,6 +271,12 @@ class PinballAudioPlayer { playSingleAudio: _playSingleAudio, path: Assets.sfx.launcher, ), + PinballAudio.rollover: _SimplePlayAudio( + preCacheSingleAudio: _preCacheSingleAudio, + playSingleAudio: _playSingleAudio, + path: Assets.sfx.rollover, + volume: 0.3, + ), PinballAudio.ioPinballVoiceOver: _SimplePlayAudio( preCacheSingleAudio: _preCacheSingleAudio, playSingleAudio: _playSingleAudio, diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 3e147329..769a880d 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -29,15 +29,15 @@ class _MockConfigureAudioCache extends Mock { } class _MockPlaySingleAudio extends Mock { - Future onCall(String url); + Future onCall(String path, {double volume}); } class _MockLoopSingleAudio extends Mock { - Future onCall(String url, {double volume}); + Future onCall(String path, {double volume}); } abstract class _PreCacheSingleAudio { - Future onCall(String url); + Future onCall(String path); } class _MockPreCacheSingleAudio extends Mock implements _PreCacheSingleAudio {} @@ -74,7 +74,8 @@ void main() { when(() => configureAudioCache.onCall(any())).thenAnswer((_) {}); playSingleAudio = _MockPlaySingleAudio(); - when(() => playSingleAudio.onCall(any())).thenAnswer((_) async {}); + when(() => playSingleAudio.onCall(any(), volume: any(named: 'volume'))) + .thenAnswer((_) async {}); loopSingleAudio = _MockLoopSingleAudio(); when(() => loopSingleAudio.onCall(any(), volume: any(named: 'volume'))) @@ -195,6 +196,10 @@ void main() { () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/sfx/launcher.mp3'), ).called(1); + verify( + () => preCacheSingleAudio + .onCall('packages/pinball_audio/assets/sfx/rollover.mp3'), + ).called(1); verify( () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/sfx/cow_moo.mp3'), @@ -346,8 +351,10 @@ void main() { audioPlayer.play(PinballAudio.google); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.google}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.google}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -358,8 +365,10 @@ void main() { audioPlayer.play(PinballAudio.sparky); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.sparky}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.sparky}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -370,8 +379,10 @@ void main() { audioPlayer.play(PinballAudio.dino); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.dino}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.dino}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -382,8 +393,10 @@ void main() { audioPlayer.play(PinballAudio.android); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.android}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.android}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -394,8 +407,10 @@ void main() { audioPlayer.play(PinballAudio.dash); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.dash}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.dash}', + volume: any(named: 'volume'), + ), ).called(1); }); }); @@ -406,8 +421,24 @@ void main() { audioPlayer.play(PinballAudio.launcher); verify( - () => playSingleAudio - .onCall('packages/pinball_audio/${Assets.sfx.launcher}'), + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.launcher}', + volume: any(named: 'volume'), + ), + ).called(1); + }); + }); + + group('rollover', () { + test('plays the correct file', () async { + await Future.wait(audioPlayer.load()); + audioPlayer.play(PinballAudio.rollover); + + verify( + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.rollover}', + volume: .3, + ), ).called(1); }); }); @@ -420,6 +451,7 @@ void main() { verify( () => playSingleAudio.onCall( 'packages/pinball_audio/${Assets.sfx.ioPinballVoiceOver}', + volume: any(named: 'volume'), ), ).called(1); }); @@ -433,6 +465,7 @@ void main() { verify( () => playSingleAudio.onCall( 'packages/pinball_audio/${Assets.sfx.gameOverVoiceOver}', + volume: any(named: 'volume'), ), ).called(1); }); diff --git a/packages/pinball_components/lib/src/components/google_word/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/google_word/behaviors/behaviors.dart new file mode 100644 index 00000000..02dab3a8 --- /dev/null +++ b/packages/pinball_components/lib/src/components/google_word/behaviors/behaviors.dart @@ -0,0 +1 @@ +export 'google_word_animating_behavior.dart'; diff --git a/packages/pinball_components/lib/src/components/google_word/behaviors/google_word_animating_behavior.dart b/packages/pinball_components/lib/src/components/google_word/behaviors/google_word_animating_behavior.dart new file mode 100644 index 00000000..c16d4a2e --- /dev/null +++ b/packages/pinball_components/lib/src/components/google_word/behaviors/google_word_animating_behavior.dart @@ -0,0 +1,24 @@ +import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:pinball_components/pinball_components.dart'; + +class GoogleWordAnimatingBehavior extends TimerComponent + with FlameBlocReader { + GoogleWordAnimatingBehavior() : super(period: 0.35, repeat: true); + + final _maxBlinks = 7; + int _blinks = 0; + + @override + void onTick() { + super.onTick(); + if (_blinks != _maxBlinks * 2) { + bloc.switched(); + _blinks++; + } else { + timer.stop(); + bloc.onAnimationFinished(); + shouldRemove = true; + } + } +} diff --git a/packages/pinball_components/lib/src/components/google_word/cubit/google_word_cubit.dart b/packages/pinball_components/lib/src/components/google_word/cubit/google_word_cubit.dart index 197771d6..8a8b976d 100644 --- a/packages/pinball_components/lib/src/components/google_word/cubit/google_word_cubit.dart +++ b/packages/pinball_components/lib/src/components/google_word/cubit/google_word_cubit.dart @@ -23,7 +23,52 @@ class GoogleWordCubit extends Cubit { } } + void switched() { + switch (state.letterSpriteStates[0]!) { + case GoogleLetterSpriteState.lit: + emit( + GoogleWordState( + letterSpriteStates: { + for (int i = 0; i < _lettersInGoogle; i++) + if (i.isEven) + i: GoogleLetterSpriteState.dimmed + else + i: GoogleLetterSpriteState.lit + }, + ), + ); + break; + case GoogleLetterSpriteState.dimmed: + emit( + GoogleWordState( + letterSpriteStates: { + for (int i = 0; i < _lettersInGoogle; i++) + if (i.isEven) + i: GoogleLetterSpriteState.lit + else + i: GoogleLetterSpriteState.dimmed + }, + ), + ); + break; + } + } + void onBonusAwarded() { + emit( + GoogleWordState( + letterSpriteStates: { + for (int i = 0; i < _lettersInGoogle; i++) + if (i.isEven) + i: GoogleLetterSpriteState.lit + else + i: GoogleLetterSpriteState.dimmed + }, + ), + ); + } + + void onAnimationFinished() { emit(GoogleWordState.initial()); _lastLitLetter = 0; } diff --git a/packages/pinball_components/lib/src/components/google_word/google_word.dart b/packages/pinball_components/lib/src/components/google_word/google_word.dart index 72126d2c..f9c93e2c 100644 --- a/packages/pinball_components/lib/src/components/google_word/google_word.dart +++ b/packages/pinball_components/lib/src/components/google_word/google_word.dart @@ -1,6 +1,7 @@ import 'package:flame/components.dart'; import 'package:pinball_components/pinball_components.dart'; +export 'behaviors/behaviors.dart'; export 'cubit/google_word_cubit.dart'; /// {@template google_word} diff --git a/packages/pinball_components/test/src/components/google_word/behaviors/google_word_animating_behavior_test.dart b/packages/pinball_components/test/src/components/google_word/behaviors/google_word_animating_behavior_test.dart new file mode 100644 index 00000000..7224aeed --- /dev/null +++ b/packages/pinball_components/test/src/components/google_word/behaviors/google_word_animating_behavior_test.dart @@ -0,0 +1,64 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball_components/pinball_components.dart'; + +class _TestGame extends Forge2DGame { + Future pump( + GoogleWordAnimatingBehavior child, { + required GoogleWordCubit bloc, + }) async { + await ensureAdd( + FlameBlocProvider.value( + value: bloc, + children: [child], + ), + ); + } +} + +class _MockGoogleWordCubit extends Mock implements GoogleWordCubit {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(_TestGame.new); + + group('GoogleWordAnimatingBehavior', () { + flameTester.testGameWidget( + 'calls switched after timer period reached', + setUp: (game, tester) async { + final behavior = GoogleWordAnimatingBehavior(); + final bloc = _MockGoogleWordCubit(); + await game.pump(behavior, bloc: bloc); + game.update(behavior.timer.limit); + + verify(bloc.switched).called(1); + }, + ); + + flameTester.testGameWidget( + 'calls onAnimationFinished and removes itself ' + 'after all blinks complete', + setUp: (game, tester) async { + final behavior = GoogleWordAnimatingBehavior(); + final bloc = _MockGoogleWordCubit(); + + await game.pump(behavior, bloc: bloc); + for (var i = 0; i <= 14; i++) { + game.update(behavior.timer.limit); + } + await game.ready(); + + verify(bloc.onAnimationFinished).called(1); + expect( + game.descendants().whereType().isEmpty, + isTrue, + ); + }, + ); + }); +} diff --git a/packages/pinball_components/test/src/components/google_word/cubit/google_word_cubit_test.dart b/packages/pinball_components/test/src/components/google_word/cubit/google_word_cubit_test.dart index 08acfae8..b5000387 100644 --- a/packages/pinball_components/test/src/components/google_word/cubit/google_word_cubit_test.dart +++ b/packages/pinball_components/test/src/components/google_word/cubit/google_word_cubit_test.dart @@ -6,6 +6,21 @@ void main() { group( 'GoogleWordCubit', () { + final litEvens = { + for (int i = 0; i < 6; i++) + if (i.isEven) + i: GoogleLetterSpriteState.lit + else + i: GoogleLetterSpriteState.dimmed + }; + final litOdds = { + for (int i = 0; i < 6; i++) + if (i.isOdd) + i: GoogleLetterSpriteState.lit + else + i: GoogleLetterSpriteState.dimmed + }; + blocTest( 'onRolloverContacted emits first letter lit', build: GoogleWordCubit.new, @@ -25,9 +40,31 @@ void main() { ); blocTest( - 'onBonusAwarded emits initial state', + 'switched emits all even letters lit when first letter is dimmed', + build: GoogleWordCubit.new, + act: (bloc) => bloc.switched(), + expect: () => [GoogleWordState(letterSpriteStates: litEvens)], + ); + + blocTest( + 'switched emits all odd letters lit when first letter is lit', + build: GoogleWordCubit.new, + seed: () => GoogleWordState(letterSpriteStates: litEvens), + act: (bloc) => bloc.switched(), + expect: () => [GoogleWordState(letterSpriteStates: litOdds)], + ); + + blocTest( + 'onBonusAwarded emits all even letters lit', build: GoogleWordCubit.new, act: (bloc) => bloc.onBonusAwarded(), + expect: () => [GoogleWordState(letterSpriteStates: litEvens)], + ); + + blocTest( + 'onAnimationFinished emits initial state', + build: GoogleWordCubit.new, + act: (bloc) => bloc.onAnimationFinished(), expect: () => [GoogleWordState.initial()], ); }, diff --git a/packages/pinball_theme/assets/images/android/background.jpg b/packages/pinball_theme/assets/images/android/background.jpg index afe2e3c6..f7326a48 100644 Binary files a/packages/pinball_theme/assets/images/android/background.jpg and b/packages/pinball_theme/assets/images/android/background.jpg differ diff --git a/packages/pinball_theme/assets/images/dash/background.jpg b/packages/pinball_theme/assets/images/dash/background.jpg index 0b70a795..c9e9223d 100644 Binary files a/packages/pinball_theme/assets/images/dash/background.jpg and b/packages/pinball_theme/assets/images/dash/background.jpg differ diff --git a/packages/pinball_theme/assets/images/dino/background.jpg b/packages/pinball_theme/assets/images/dino/background.jpg index 35deff95..8c24a4c8 100644 Binary files a/packages/pinball_theme/assets/images/dino/background.jpg and b/packages/pinball_theme/assets/images/dino/background.jpg differ diff --git a/packages/pinball_theme/assets/images/sparky/background.jpg b/packages/pinball_theme/assets/images/sparky/background.jpg index 9c4fdfc6..aa0ac9a4 100644 Binary files a/packages/pinball_theme/assets/images/sparky/background.jpg and b/packages/pinball_theme/assets/images/sparky/background.jpg differ diff --git a/packages/pinball_ui/lib/src/widgets/pinball_button.dart b/packages/pinball_ui/lib/src/widgets/pinball_button.dart index dd4685c1..ee9b5c54 100644 --- a/packages/pinball_ui/lib/src/widgets/pinball_button.dart +++ b/packages/pinball_ui/lib/src/widgets/pinball_button.dart @@ -30,7 +30,7 @@ class PinballButton extends StatelessWidget { ), ), child: Center( - child: InkWell( + child: GestureDetector( onTap: onTap, child: Padding( padding: const EdgeInsets.symmetric( diff --git a/packages/pinball_ui/lib/src/widgets/pinball_dpad_button.dart b/packages/pinball_ui/lib/src/widgets/pinball_dpad_button.dart index a0c3e653..c122f5b3 100644 --- a/packages/pinball_ui/lib/src/widgets/pinball_dpad_button.dart +++ b/packages/pinball_ui/lib/src/widgets/pinball_dpad_button.dart @@ -53,7 +53,7 @@ class PinballDpadButton extends StatelessWidget { Widget build(BuildContext context) { return Material( color: PinballColors.transparent, - child: InkWell( + child: GestureDetector( onTap: onTap, child: Image.asset( direction.toAsset(), diff --git a/test/game/behaviors/rollover_noise_behavior_test.dart b/test/game/behaviors/rollover_noise_behavior_test.dart new file mode 100644 index 00000000..a196c8b6 --- /dev/null +++ b/test/game/behaviors/rollover_noise_behavior_test.dart @@ -0,0 +1,58 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball/game/behaviors/behaviors.dart'; +import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +class _TestGame extends Forge2DGame { + Future pump( + _TestBodyComponent child, { + required PinballAudioPlayer audioPlayer, + }) { + return ensureAdd( + FlameProvider.value( + audioPlayer, + children: [child], + ), + ); + } +} + +class _TestBodyComponent extends BodyComponent { + @override + Body createBody() => world.createBody(BodyDef()); +} + +class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} + +class _MockContact extends Mock implements Contact {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('RolloverNoiseBehavior', () { + late PinballAudioPlayer audioPlayer; + final flameTester = FlameTester(_TestGame.new); + + setUp(() { + audioPlayer = _MockPinballAudioPlayer(); + }); + flameTester.testGameWidget( + 'plays rollover sound on contact', + setUp: (game, _) async { + final behavior = RolloverNoiseBehavior(); + final parent = _TestBodyComponent(); + await game.pump(parent, audioPlayer: audioPlayer); + await parent.ensureAdd(behavior); + behavior.beginContact(Object(), _MockContact()); + }, + verify: (_, __) async { + verify(() => audioPlayer.play(PinballAudio.rollover)).called(1); + }, + ); + }); +} diff --git a/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart b/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart index 4b3ec2bd..acabe4c7 100644 --- a/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart +++ b/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart @@ -119,8 +119,8 @@ void main() { ); flameTester.testGameWidget( - 'adds BonusBallSpawningBehavior to the game when all letters ' - 'in google word are activated', + 'adds BonusBallSpawningBehavior and GoogleWordAnimatingBehavior ' + 'to the game when all letters in google word are activated', setUp: (game, tester) async { final behavior = GoogleWordBonusBehavior(); final parent = GoogleGallery.test(); @@ -161,6 +161,10 @@ void main() { game.descendants().whereType().length, equals(1), ); + expect( + game.descendants().whereType().length, + equals(1), + ); }, ); }); diff --git a/test/game/components/google_gallery/google_gallery_test.dart b/test/game/components/google_gallery/google_gallery_test.dart index 9551285f..719be2dc 100644 --- a/test/game/components/google_gallery/google_gallery_test.dart +++ b/test/game/components/google_gallery/google_gallery_test.dart @@ -97,6 +97,20 @@ void main() { }, ); + flameTester.test( + 'RolloverNoiseBehavior to GoogleRollovers', + (game) async { + await game.pump(GoogleGallery()); + + game.descendants().whereType().forEach( + (rollover) => expect( + rollover.firstChild(), + isNotNull, + ), + ); + }, + ); + flameTester.test('a GoogleWordBonusBehavior', (game) async { final component = GoogleGallery(); await game.pump(component);