From 5bc02eb5709289acde9501775c13a475738704c2 Mon Sep 17 00:00:00 2001 From: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Date: Sun, 8 May 2022 20:03:49 -0500 Subject: [PATCH] fix: disable backgrounds on mobile (#411) * fix: disable backgrounds on mobile * refactor: inject platform helper * refactor: make platformHelper public * fix: suggestion --- lib/app/view/app.dart | 5 ++ .../character_selection_behavior.dart | 16 ++-- lib/game/components/backbox/backbox.dart | 10 +-- lib/game/game_assets.dart | 14 +-- lib/game/pinball_game.dart | 9 +- lib/game/view/pinball_game_page.dart | 4 + .../widgets/how_to_play_dialog.dart | 9 +- lib/main.dart | 3 + test/app/view/app_test.dart | 9 ++ .../character_selection_behavior_test.dart | 86 +++++++++++++++---- .../game/components/backbox/backbox_test.dart | 82 +++++++++++++----- .../game_bloc_status_listener_test.dart | 9 ++ test/game/pinball_game_test.dart | 8 ++ test/game/view/pinball_game_page_test.dart | 7 ++ test/helpers/pump_app.dart | 7 ++ test/how_to_play/how_to_play_dialog_test.dart | 24 +++--- .../widgets/start_game_listener_test.dart | 11 +++ 17 files changed, 239 insertions(+), 74 deletions(-) diff --git a/lib/app/view/app.dart b/lib/app/view/app.dart index f621f1e2..97ef8d63 100644 --- a/lib/app/view/app.dart +++ b/lib/app/view/app.dart @@ -9,6 +9,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_ui/pinball_ui.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class App extends StatelessWidget { @@ -18,16 +19,19 @@ class App extends StatelessWidget { required LeaderboardRepository leaderboardRepository, required ShareRepository shareRepository, required PinballAudioPlayer pinballAudioPlayer, + required PlatformHelper platformHelper, }) : _authenticationRepository = authenticationRepository, _leaderboardRepository = leaderboardRepository, _shareRepository = shareRepository, _pinballAudioPlayer = pinballAudioPlayer, + _platformHelper = platformHelper, super(key: key); final AuthenticationRepository _authenticationRepository; final LeaderboardRepository _leaderboardRepository; final ShareRepository _shareRepository; final PinballAudioPlayer _pinballAudioPlayer; + final PlatformHelper _platformHelper; @override Widget build(BuildContext context) { @@ -37,6 +41,7 @@ class App extends StatelessWidget { RepositoryProvider.value(value: _leaderboardRepository), RepositoryProvider.value(value: _shareRepository), RepositoryProvider.value(value: _pinballAudioPlayer), + RepositoryProvider.value(value: _platformHelper), ], child: MultiBlocProvider( providers: [ diff --git a/lib/game/behaviors/character_selection_behavior.dart b/lib/game/behaviors/character_selection_behavior.dart index 27003d75..e62438f6 100644 --- a/lib/game/behaviors/character_selection_behavior.dart +++ b/lib/game/behaviors/character_selection_behavior.dart @@ -2,6 +2,8 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; +import 'package:platform_helper/platform_helper.dart'; /// Updates the [ArcadeBackground] and launch [Ball] to reflect character /// selections. @@ -11,12 +13,14 @@ class CharacterSelectionBehavior extends Component HasGameRef { @override void onNewState(CharacterThemeState state) { - gameRef - .descendants() - .whereType() - .single - .bloc - .onCharacterSelected(state.characterTheme); + if (!readProvider().isMobile) { + gameRef + .descendants() + .whereType() + .single + .bloc + .onCharacterSelected(state.characterTheme); + } gameRef .descendants() .whereType() diff --git a/lib/game/components/backbox/backbox.dart b/lib/game/components/backbox/backbox.dart index 3b3b2614..4ce44348 100644 --- a/lib/game/components/backbox/backbox.dart +++ b/lib/game/components/backbox/backbox.dart @@ -27,23 +27,19 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef { leaderboardRepository: leaderboardRepository, initialEntries: entries, ), - _shareRepository = shareRepository, - _platformHelper = PlatformHelper(); + _shareRepository = shareRepository; /// {@macro backbox} @visibleForTesting Backbox.test({ required BackboxBloc bloc, required ShareRepository shareRepository, - required PlatformHelper platformHelper, }) : _bloc = bloc, - _shareRepository = shareRepository, - _platformHelper = platformHelper; + _shareRepository = shareRepository; final ShareRepository _shareRepository; late final Component _display; final BackboxBloc _bloc; - final PlatformHelper _platformHelper; late StreamSubscription _subscription; @override @@ -76,7 +72,7 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef { } else if (state is LeaderboardFailureState) { _display.add(LeaderboardFailureDisplay()); } else if (state is InitialsFormState) { - if (_platformHelper.isMobile) { + if (readProvider().isMobile) { gameRef.overlays.add(PinballGame.mobileControlsOverlay); } _display.add( diff --git a/lib/game/game_assets.dart b/lib/game/game_assets.dart index a770985b..fccd494e 100644 --- a/lib/game/game_assets.dart +++ b/lib/game/game_assets.dart @@ -12,7 +12,7 @@ extension PinballGameAssetsX on PinballGame { const androidTheme = AndroidTheme(); const dinoTheme = DinoTheme(); - return [ + final gameAssets = [ images.load(components.Assets.images.boardBackground.keyName), images.load(components.Assets.images.ball.flameEffect.keyName), images.load(components.Assets.images.signpost.inactive.keyName), @@ -148,17 +148,21 @@ extension PinballGameAssetsX on PinballGame { images.load(components.Assets.images.displayArrows.arrowLeft.keyName), images.load(components.Assets.images.displayArrows.arrowRight.keyName), images.load(androidTheme.leaderboardIcon.keyName), - images.load(androidTheme.background.keyName), images.load(androidTheme.ball.keyName), images.load(dashTheme.leaderboardIcon.keyName), - images.load(dashTheme.background.keyName), images.load(dashTheme.ball.keyName), images.load(dinoTheme.leaderboardIcon.keyName), - images.load(dinoTheme.background.keyName), images.load(dinoTheme.ball.keyName), images.load(sparkyTheme.leaderboardIcon.keyName), - images.load(sparkyTheme.background.keyName), images.load(sparkyTheme.ball.keyName), ]; + + return (platformHelper.isMobile) ? gameAssets : gameAssets + ..addAll([ + images.load(androidTheme.background.keyName), + images.load(dashTheme.background.keyName), + images.load(dinoTheme.background.keyName), + images.load(sparkyTheme.background.keyName), + ]); } } diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 751b8d8e..dca26b84 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -14,6 +14,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class PinballGame extends PinballForge2DGame @@ -25,6 +26,7 @@ class PinballGame extends PinballForge2DGame required GameBloc gameBloc, required AppLocalizations l10n, required PinballAudioPlayer audioPlayer, + required this.platformHelper, }) : focusNode = FocusNode(), _gameBloc = gameBloc, _audioPlayer = audioPlayer, @@ -57,6 +59,8 @@ class PinballGame extends PinballForge2DGame final AppLocalizations _l10n; + final PlatformHelper platformHelper; + final GameBloc _gameBloc; List? _entries; @@ -90,6 +94,7 @@ class PinballGame extends PinballForge2DGame FlameProvider.value(leaderboardRepository), FlameProvider.value(shareRepository), FlameProvider.value(_l10n), + FlameProvider.value(platformHelper), ], children: [ BonusNoiseBehavior(), @@ -106,7 +111,7 @@ class PinballGame extends PinballForge2DGame children: [ ZCanvasComponent( children: [ - ArcadeBackground(), + if (!platformHelper.isMobile) ArcadeBackground(), BoardBackgroundSpriteComponent(), Boundaries(), Backbox( @@ -197,6 +202,7 @@ class DebugPinballGame extends PinballGame with FPSCounter, PanDetector { required ShareRepository shareRepository, required AppLocalizations l10n, required PinballAudioPlayer audioPlayer, + required PlatformHelper platformHelper, required GameBloc gameBloc, }) : super( characterThemeBloc: characterThemeBloc, @@ -204,6 +210,7 @@ class DebugPinballGame extends PinballGame with FPSCounter, PanDetector { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, l10n: l10n, + platformHelper: platformHelper, gameBloc: gameBloc, ); diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index a36754d8..efc11996 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -11,6 +11,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_ui/pinball_ui.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class PinballGamePage extends StatelessWidget { @@ -27,6 +28,7 @@ class PinballGamePage extends StatelessWidget { final audioPlayer = context.read(); final leaderboardRepository = context.read(); final shareRepository = context.read(); + final platformHelper = context.read(); final gameBloc = context.read(); final game = isDebugMode ? DebugPinballGame( @@ -35,6 +37,7 @@ class PinballGamePage extends StatelessWidget { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, l10n: context.l10n, + platformHelper: platformHelper, gameBloc: gameBloc, ) : PinballGame( @@ -43,6 +46,7 @@ class PinballGamePage extends StatelessWidget { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, l10n: context.l10n, + platformHelper: platformHelper, gameBloc: gameBloc, ); diff --git a/lib/how_to_play/widgets/how_to_play_dialog.dart b/lib/how_to_play/widgets/how_to_play_dialog.dart index 8a709605..6c8c3f13 100644 --- a/lib/how_to_play/widgets/how_to_play_dialog.dart +++ b/lib/how_to_play/widgets/how_to_play_dialog.dart @@ -50,14 +50,11 @@ extension on Control { } class HowToPlayDialog extends StatefulWidget { - HowToPlayDialog({ + const HowToPlayDialog({ Key? key, required this.onDismissCallback, - @visibleForTesting PlatformHelper? platformHelper, - }) : platformHelper = platformHelper ?? PlatformHelper(), - super(key: key); + }) : super(key: key); - final PlatformHelper platformHelper; final VoidCallback onDismissCallback; @override @@ -85,7 +82,7 @@ class _HowToPlayDialogState extends State { @override Widget build(BuildContext context) { - final isMobile = widget.platformHelper.isMobile; + final isMobile = context.read().isMobile; final l10n = context.l10n; return WillPopScope( diff --git a/lib/main.dart b/lib/main.dart index cb8c78da..877843ee 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:pinball/app/app.dart'; import 'package:pinball/bootstrap.dart'; import 'package:pinball_audio/pinball_audio.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; void main() { @@ -15,6 +16,7 @@ void main() { ShareRepository(appUrl: ShareRepository.pinballGameUrl); final authenticationRepository = AuthenticationRepository(firebaseAuth); final pinballAudioPlayer = PinballAudioPlayer(); + final platformHelper = PlatformHelper(); unawaited( Firebase.initializeApp().then( (_) => authenticationRepository.authenticateAnonymously(), @@ -25,6 +27,7 @@ void main() { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, pinballAudioPlayer: pinballAudioPlayer, + platformHelper: platformHelper, ); }); } diff --git a/test/app/view/app_test.dart b/test/app/view/app_test.dart index d247a562..b9f2ef16 100644 --- a/test/app/view/app_test.dart +++ b/test/app/view/app_test.dart @@ -5,6 +5,7 @@ import 'package:mocktail/mocktail.dart'; import 'package:pinball/app/app.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_audio/pinball_audio.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class _MockAuthenticationRepository extends Mock @@ -17,18 +18,25 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { class _MockShareRepository extends Mock implements ShareRepository {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + void main() { group('App', () { late AuthenticationRepository authenticationRepository; late LeaderboardRepository leaderboardRepository; late ShareRepository shareRepository; late PinballAudioPlayer pinballAudioPlayer; + late PlatformHelper platformHelper; setUp(() { authenticationRepository = _MockAuthenticationRepository(); leaderboardRepository = _MockLeaderboardRepository(); shareRepository = _MockShareRepository(); pinballAudioPlayer = _MockPinballAudioPlayer(); + platformHelper = _MockPlatformHelper(); when(pinballAudioPlayer.load).thenAnswer((_) => [Future.value()]); }); @@ -39,6 +47,7 @@ void main() { leaderboardRepository: leaderboardRepository, shareRepository: shareRepository, pinballAudioPlayer: pinballAudioPlayer, + platformHelper: platformHelper, ), ); await tester.pump(const Duration(milliseconds: 1100)); diff --git a/test/game/behaviors/character_selection_behavior_test.dart b/test/game/behaviors/character_selection_behavior_test.dart index 67a8b0a5..edf17999 100644 --- a/test/game/behaviors/character_selection_behavior_test.dart +++ b/test/game/behaviors/character_selection_behavior_test.dart @@ -12,6 +12,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; +import 'package:platform_helper/platform_helper.dart'; class _TestGame extends Forge2DGame { @override @@ -28,11 +29,17 @@ class _TestGame extends Forge2DGame { Future pump( List children, { CharacterThemeCubit? characterThemeBloc, + PlatformHelper? platformHelper, }) async { await ensureAdd( FlameBlocProvider.value( value: characterThemeBloc ?? CharacterThemeCubit(), - children: children, + children: [ + FlameProvider.value( + platformHelper ?? _MockPlatformHelper(), + children: children, + ), + ], ), ); } @@ -43,6 +50,8 @@ class _MockBallCubit extends Mock implements BallCubit {} class _MockArcadeBackgroundCubit extends Mock implements ArcadeBackgroundCubit { } +class _MockPlatformHelper extends Mock implements PlatformHelper {} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -68,8 +77,45 @@ void main() { ); flameTester.test( - 'onNewState calls onCharacterSelected on the arcade background bloc', + 'onNewState does not call onCharacterSelected on the arcade background ' + 'bloc when platform is mobile', + (game) async { + final platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => true); + final arcadeBackgroundBloc = _MockArcadeBackgroundCubit(); + whenListen( + arcadeBackgroundBloc, + const Stream.empty(), + initialState: const ArcadeBackgroundState.initial(), + ); + final behavior = CharacterSelectionBehavior(); + await game.pump( + [ + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + Ball.test(), + ], + platformHelper: platformHelper, + ); + + const dinoThemeState = CharacterThemeState(theme.DinoTheme()); + behavior.onNewState(dinoThemeState); + await game.ready(); + + verifyNever( + () => arcadeBackgroundBloc + .onCharacterSelected(dinoThemeState.characterTheme), + ); + }, + ); + + flameTester.test( + 'onNewState calls onCharacterSelected on the arcade background ' + 'bloc when platform is not mobile', (game) async { + final platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => false); final arcadeBackgroundBloc = _MockArcadeBackgroundCubit(); whenListen( arcadeBackgroundBloc, @@ -79,13 +125,16 @@ void main() { final arcadeBackground = ArcadeBackground.test(bloc: arcadeBackgroundBloc); final behavior = CharacterSelectionBehavior(); - await game.pump([ - arcadeBackground, - behavior, - ZCanvasComponent(), - Plunger.test(compressionDistance: 10), - Ball.test(), - ]); + await game.pump( + [ + arcadeBackground, + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + Ball.test(), + ], + platformHelper: platformHelper, + ); const dinoThemeState = CharacterThemeState(theme.DinoTheme()); behavior.onNewState(dinoThemeState); @@ -101,6 +150,8 @@ void main() { flameTester.test( 'onNewState calls onCharacterSelected on the ball bloc', (game) async { + final platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => false); final ballBloc = _MockBallCubit(); whenListen( ballBloc, @@ -109,13 +160,16 @@ void main() { ); final ball = Ball.test(bloc: ballBloc); final behavior = CharacterSelectionBehavior(); - await game.pump([ - ball, - behavior, - ZCanvasComponent(), - Plunger.test(compressionDistance: 10), - ArcadeBackground.test(), - ]); + await game.pump( + [ + ball, + behavior, + ZCanvasComponent(), + Plunger.test(compressionDistance: 10), + ArcadeBackground.test(), + ], + platformHelper: platformHelper, + ); const dinoThemeState = CharacterThemeState(theme.DinoTheme()); behavior.onNewState(dinoThemeState); diff --git a/test/game/components/backbox/backbox_test.dart b/test/game/components/backbox/backbox_test.dart index 6fb87c7c..cf28cccf 100644 --- a/test/game/components/backbox/backbox_test.dart +++ b/test/game/components/backbox/backbox_test.dart @@ -47,7 +47,10 @@ class _TestGame extends Forge2DGame ]); } - Future pump(Backbox component) async { + Future pump( + Backbox component, { + PlatformHelper? platformHelper, + }) async { // Not needed once https://github.com/flame-engine/flame/issues/1607 // is fixed await onLoad(); @@ -55,8 +58,15 @@ class _TestGame extends Forge2DGame FlameBlocProvider.value( value: GameBloc(), children: [ - FlameProvider.value( - _MockAppLocalizations(), + MultiFlameProvider( + providers: [ + FlameProvider.value( + _MockAppLocalizations(), + ), + FlameProvider.value( + platformHelper ?? _MockPlatformHelper(), + ), + ], children: [component], ), ], @@ -191,9 +201,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect(game.descendants(), contains(backbox)); }, ); @@ -209,8 +221,8 @@ void main() { Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), - platformHelper: platformHelper, ), + platformHelper: platformHelper, ); await tester.pump(); }, @@ -231,9 +243,11 @@ void main() { initialEntries: [LeaderboardEntryData.empty], ), shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); backbox.requestInitials( score: 0, character: game.character, @@ -263,9 +277,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); game.onKeyEvent(_mockKeyUp(LogicalKeyboardKey.enter), {}); verify( @@ -292,9 +308,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.descendants().whereType().length, @@ -322,9 +340,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.overlays.value, @@ -349,9 +369,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.overlays.value, @@ -372,9 +394,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.descendants().whereType().length, @@ -395,9 +419,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); final shareLink = game.descendants().whereType().first; @@ -425,9 +451,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game @@ -457,9 +485,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.descendants().whereType().length, @@ -504,9 +534,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: shareRepository, + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); final facebookButton = game.descendants().whereType().first; @@ -558,9 +590,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: shareRepository, + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); final facebookButton = game.descendants().whereType().first; @@ -590,9 +624,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.descendants().whereType().length, @@ -613,9 +649,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game.descendants().whereType().length, @@ -637,9 +675,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); backbox.removeFromParent(); await game.ready(); @@ -678,9 +718,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); game.update(4); verify( diff --git a/test/game/components/game_bloc_status_listener_test.dart b/test/game/components/game_bloc_status_listener_test.dart index c1ca9b3e..d468ce2f 100644 --- a/test/game/components/game_bloc_status_listener_test.dart +++ b/test/game/components/game_bloc_status_listener_test.dart @@ -15,6 +15,7 @@ import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart' as theme; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class _TestGame extends Forge2DGame with HasTappables { @@ -55,6 +56,9 @@ class _TestGame extends Forge2DGame with HasTappables { FlameProvider.value( _MockAppLocalizations(), ), + FlameProvider.value( + _MockPlatformHelper(), + ), ], children: children, ), @@ -71,6 +75,11 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { class _MockShareRepository extends Mock implements ShareRepository {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + class _MockAppLocalizations extends Mock implements AppLocalizations { @override String get score => ''; diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 52e8c97c..289fb4fa 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -16,6 +16,7 @@ import 'package:pinball/game/game.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball_audio/src/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class _TestPinballGame extends PinballGame { @@ -27,6 +28,7 @@ class _TestPinballGame extends PinballGame { gameBloc: GameBloc(), l10n: _MockAppLocalizations(), audioPlayer: _MockPinballAudioPlayer(), + platformHelper: _MockPlatformHelper(), ); @override @@ -47,6 +49,7 @@ class _TestDebugPinballGame extends DebugPinballGame { gameBloc: GameBloc(), l10n: _MockAppLocalizations(), audioPlayer: _MockPinballAudioPlayer(), + platformHelper: _MockPlatformHelper(), ); @override @@ -88,6 +91,11 @@ class _MockShareRepository extends Mock implements ShareRepository {} class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); diff --git a/test/game/view/pinball_game_page_test.dart b/test/game/view/pinball_game_page_test.dart index fce6e74e..a0a0f22c 100644 --- a/test/game/view/pinball_game_page_test.dart +++ b/test/game/view/pinball_game_page_test.dart @@ -15,6 +15,7 @@ import 'package:pinball/more_information/more_information.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; import '../../helpers/helpers.dart'; @@ -28,6 +29,7 @@ class _TestPinballGame extends PinballGame { gameBloc: GameBloc(), l10n: _MockAppLocalizations(), audioPlayer: _MockPinballAudioPlayer(), + platformHelper: _MockPlatformHelper(), ); @override @@ -63,6 +65,11 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { class _MockShareRepository extends Mock implements ShareRepository {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + void main() { final game = _TestPinballGame(); diff --git a/test/helpers/pump_app.dart b/test/helpers/pump_app.dart index df75efae..d136487c 100644 --- a/test/helpers/pump_app.dart +++ b/test/helpers/pump_app.dart @@ -12,6 +12,7 @@ import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_ui/pinball_ui.dart'; +import 'package:platform_helper/platform_helper.dart'; import 'package:share_repository/share_repository.dart'; class _MockAssetsManagerCubit extends Mock implements AssetsManagerCubit {} @@ -29,6 +30,8 @@ class _MockStartGameBloc extends Mock implements StartGameBloc {} class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} +class _MockPlatformHelper extends Mock implements PlatformHelper {} + PinballAudioPlayer _buildDefaultPinballAudioPlayer() { final audioPlayer = _MockPinballAudioPlayer(); when(audioPlayer.load).thenAnswer((_) => [Future.value()]); @@ -60,6 +63,7 @@ extension PumpApp on WidgetTester { LeaderboardRepository? leaderboardRepository, ShareRepository? shareRepository, PinballAudioPlayer? pinballAudioPlayer, + PlatformHelper? platformHelper, }) { return runAsync(() { return pumpWidget( @@ -74,6 +78,9 @@ extension PumpApp on WidgetTester { RepositoryProvider.value( value: pinballAudioPlayer ?? _buildDefaultPinballAudioPlayer(), ), + RepositoryProvider.value( + value: platformHelper ?? _MockPlatformHelper(), + ), ], child: MultiBlocProvider( providers: [ diff --git a/test/how_to_play/how_to_play_dialog_test.dart b/test/how_to_play/how_to_play_dialog_test.dart index c6e60d73..78e793cb 100644 --- a/test/how_to_play/how_to_play_dialog_test.dart +++ b/test/how_to_play/how_to_play_dialog_test.dart @@ -17,27 +17,23 @@ void main() { setUp(() async { l10n = await AppLocalizations.delegate.load(const Locale('en')); platformHelper = _MockPlatformHelper(); + when(() => platformHelper.isMobile).thenAnswer((_) => false); }); - testWidgets( - 'can be instantiated without passing in a platform helper', - (tester) async { - await tester.pumpApp( - HowToPlayDialog( - onDismissCallback: () {}, - ), - ); - expect(find.byType(HowToPlayDialog), findsOneWidget); - }, - ); + test('can be instantiated', () { + expect( + HowToPlayDialog(onDismissCallback: () {}), + isA(), + ); + }); testWidgets('displays content for desktop', (tester) async { when(() => platformHelper.isMobile).thenAnswer((_) => false); await tester.pumpApp( HowToPlayDialog( - platformHelper: platformHelper, onDismissCallback: () {}, ), + platformHelper: platformHelper, ); expect(find.text(l10n.howToPlay), findsOneWidget); expect(find.text(l10n.tipsForFlips), findsOneWidget); @@ -50,9 +46,9 @@ void main() { when(() => platformHelper.isMobile).thenAnswer((_) => true); await tester.pumpApp( HowToPlayDialog( - platformHelper: platformHelper, onDismissCallback: () {}, ), + platformHelper: platformHelper, ); expect(find.text(l10n.howToPlay), findsOneWidget); expect(find.text(l10n.tipsForFlips), findsOneWidget); @@ -75,6 +71,7 @@ void main() { ); }, ), + platformHelper: platformHelper, ); expect(find.byType(HowToPlayDialog), findsNothing); await tester.tap(find.text('test')); @@ -100,6 +97,7 @@ void main() { ); }, ), + platformHelper: platformHelper, ); expect(find.byType(HowToPlayDialog), findsNothing); await tester.tap(find.text('test')); diff --git a/test/start_game/widgets/start_game_listener_test.dart b/test/start_game/widgets/start_game_listener_test.dart index d801864b..61171a40 100644 --- a/test/start_game/widgets/start_game_listener_test.dart +++ b/test/start_game/widgets/start_game_listener_test.dart @@ -7,6 +7,7 @@ import 'package:pinball/how_to_play/how_to_play.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; +import 'package:platform_helper/platform_helper.dart'; import '../../helpers/helpers.dart'; @@ -18,10 +19,16 @@ class _MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {} class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} +class _MockPlatformHelper extends Mock implements PlatformHelper { + @override + bool get isMobile => false; +} + void main() { late StartGameBloc startGameBloc; late PinballAudioPlayer pinballAudioPlayer; late CharacterThemeCubit characterThemeCubit; + late PlatformHelper platformHelper; group('StartGameListener', () { setUp(() async { @@ -30,6 +37,7 @@ void main() { startGameBloc = _MockStartGameBloc(); pinballAudioPlayer = _MockPinballAudioPlayer(); characterThemeCubit = _MockCharacterThemeCubit(); + platformHelper = _MockPlatformHelper(); }); group('on selectCharacter status', () { @@ -121,6 +129,7 @@ void main() { child: SizedBox.shrink(), ), startGameBloc: startGameBloc, + platformHelper: platformHelper, ); await tester.pumpAndSettle(); @@ -213,6 +222,7 @@ void main() { child: SizedBox.shrink(), ), startGameBloc: startGameBloc, + platformHelper: platformHelper, ); await tester.pumpAndSettle(); @@ -244,6 +254,7 @@ void main() { ), startGameBloc: startGameBloc, pinballAudioPlayer: pinballAudioPlayer, + platformHelper: platformHelper, ); await tester.pumpAndSettle();