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/components/backbox/backbox.dart b/lib/game/components/backbox/backbox.dart index dad2c118..723c1f88 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/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index ffa9498a..efc11996 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -28,7 +28,7 @@ class PinballGamePage extends StatelessWidget { final audioPlayer = context.read(); final leaderboardRepository = context.read(); final shareRepository = context.read(); - final platformHelper = PlatformHelper(); + final platformHelper = context.read(); final gameBloc = context.read(); final game = isDebugMode ? DebugPinballGame( 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/components/backbox/backbox_test.dart b/test/game/components/backbox/backbox_test.dart index b99b86ab..61b0907e 100644 --- a/test/game/components/backbox/backbox_test.dart +++ b/test/game/components/backbox/backbox_test.dart @@ -45,13 +45,23 @@ class _TestGame extends Forge2DGame ]); } - Future pump(Backbox component) { + Future pump( + Backbox component, { + PlatformHelper? platformHelper, + }) { return ensureAdd( FlameBlocProvider.value( value: GameBloc(), children: [ - FlameProvider.value( - _MockAppLocalizations(), + MultiFlameProvider( + providers: [ + FlameProvider.value( + _MockAppLocalizations(), + ), + FlameProvider.value( + platformHelper ?? _MockPlatformHelper(), + ), + ], children: [component], ), ], @@ -186,9 +196,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)); }, ); @@ -204,8 +216,8 @@ void main() { Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), - platformHelper: platformHelper, ), + platformHelper: platformHelper, ); await tester.pump(); }, @@ -226,9 +238,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, @@ -258,9 +272,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( @@ -287,9 +303,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, @@ -317,9 +335,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, @@ -344,9 +364,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, @@ -367,9 +389,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, @@ -390,9 +414,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; @@ -420,9 +446,11 @@ void main() { final backbox = Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), + ); + await game.pump( + backbox, platformHelper: platformHelper, ); - await game.pump(backbox); expect( game @@ -452,9 +480,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, @@ -499,9 +529,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; @@ -553,9 +585,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; @@ -585,9 +619,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, @@ -608,9 +644,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, @@ -632,9 +670,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(); @@ -673,9 +713,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/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'));