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 dad2c118..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( @@ -109,7 +105,7 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef { ShareDisplay( onShare: (platform) { final message = readProvider() - .iGotScoreAtPinball(state.score); + .iGotScoreAtPinball(state.score.formatScore()); final url = _shareRepository.shareText( value: message, platform: platform, diff --git a/lib/game/components/backbox/displays/game_over_info_display.dart b/lib/game/components/backbox/displays/game_over_info_display.dart index c7708bde..52939345 100644 --- a/lib/game/components/backbox/displays/game_over_info_display.dart +++ b/lib/game/components/backbox/displays/game_over_info_display.dart @@ -212,7 +212,7 @@ class GoogleIOLinkComponent extends TextComponent with HasGameRef, Tappable { ); @override - bool onTapDown(TapDownInfo info) { + bool onTapUp(TapUpInfo info) { openLink(ShareRepository.googleIOEvent); return true; } diff --git a/lib/game/components/backbox/displays/share_display.dart b/lib/game/components/backbox/displays/share_display.dart index ebaaac7e..0bf61e7d 100644 --- a/lib/game/components/backbox/displays/share_display.dart +++ b/lib/game/components/backbox/displays/share_display.dart @@ -140,7 +140,7 @@ class FacebookButtonComponent extends SpriteComponent final OnSocialShareTap? _onTap; @override - bool onTapDown(TapDownInfo info) { + bool onTapUp(TapUpInfo info) { _onTap?.call(SharePlatform.facebook); return true; } @@ -172,7 +172,7 @@ class TwitterButtonComponent extends SpriteComponent with HasGameRef, Tappable { final OnSocialShareTap? _onTap; @override - bool onTapDown(TapDownInfo info) { + bool onTapUp(TapUpInfo info) { _onTap?.call(SharePlatform.twitter); return true; } 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 abb6de1e..787fcefc 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 @@ -1,5 +1,6 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; +import 'package:pinball/game/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; @@ -17,6 +18,7 @@ class GoogleWordBonusBehavior extends Component { readBloc() .add(const BonusActivated(GameBonus.googleWord)); readBloc().onBonusAwarded(); + add(BonusBallSpawningBehavior()); }, ), ); diff --git a/lib/game/components/multiballs/behaviors/multiballs_behavior.dart b/lib/game/components/multiballs/behaviors/multiballs_behavior.dart index b01c32e1..1d3aa16c 100644 --- a/lib/game/components/multiballs/behaviors/multiballs_behavior.dart +++ b/lib/game/components/multiballs/behaviors/multiballs_behavior.dart @@ -11,7 +11,8 @@ class MultiballsBehavior extends Component bool listenWhen(GameState? previousState, GameState newState) { final hasChanged = previousState?.bonusHistory != newState.bonusHistory; final lastBonusIsMultiball = newState.bonusHistory.isNotEmpty && - newState.bonusHistory.last == GameBonus.dashNest; + (newState.bonusHistory.last == GameBonus.dashNest || + newState.bonusHistory.last == GameBonus.googleWord); return hasChanged && lastBonusIsMultiball; } 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/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index a9b12291..64093ac6 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -218,7 +218,7 @@ "description": "Text to share score on Social Network", "placeholders": { "score": { - "type": "int" + "type": "String" } } } 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/lib/more_information/more_information_dialog.dart b/lib/more_information/more_information_dialog.dart index b9a9ddbb..ca04db4e 100644 --- a/lib/more_information/more_information_dialog.dart +++ b/lib/more_information/more_information_dialog.dart @@ -204,7 +204,7 @@ class _MadeWithFlutterAndFirebase extends StatelessWidget { abstract class _MoreInformationUrl { static const flutterWebsite = 'https://flutter.dev'; static const firebaseWebsite = 'https://firebase.google.com'; - static const openSourceCode = 'https://github.com/VGVentures/pinball'; + static const openSourceCode = 'https://github.com/flutter/pinball'; static const googleIOEvent = 'https://events.google.com/io/'; static const flutterGamesWebsite = 'http://flutter.dev/games'; static const howItsMadeArticle = diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 19a5d583..9682b520 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -59,7 +59,7 @@ typedef CreateAudioPool = Future Function( typedef PlaySingleAudio = Future Function(String); /// Defines the contract for looping a single audio. -typedef LoopSingleAudio = Future Function(String); +typedef LoopSingleAudio = Future Function(String, {double volume}); /// Defines the contract for pre fetching an audio. typedef PreCacheSingleAudio = Future Function(String); @@ -101,18 +101,20 @@ class _LoopAudio extends _Audio { required this.preCacheSingleAudio, required this.loopSingleAudio, required this.path, + this.volume, }); final PreCacheSingleAudio preCacheSingleAudio; final LoopSingleAudio loopSingleAudio; final String path; + final double? volume; @override Future load() => preCacheSingleAudio(prefixFile(path)); @override void play() { - loopSingleAudio(prefixFile(path)); + loopSingleAudio(prefixFile(path), volume: volume ?? 1); } } @@ -121,10 +123,12 @@ class _SingleLoopAudio extends _LoopAudio { required PreCacheSingleAudio preCacheSingleAudio, required LoopSingleAudio loopSingleAudio, required String path, + double? volume, }) : super( preCacheSingleAudio: preCacheSingleAudio, loopSingleAudio: loopSingleAudio, path: path, + volume: volume, ); bool _playing = false; @@ -296,6 +300,7 @@ class PinballAudioPlayer { preCacheSingleAudio: _preCacheSingleAudio, loopSingleAudio: _loopSingleAudio, path: Assets.music.background, + volume: .6, ), }; } diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index e7592b8f..3e147329 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -33,7 +33,7 @@ class _MockPlaySingleAudio extends Mock { } class _MockLoopSingleAudio extends Mock { - Future onCall(String url); + Future onCall(String url, {double volume}); } abstract class _PreCacheSingleAudio { @@ -77,7 +77,8 @@ void main() { when(() => playSingleAudio.onCall(any())).thenAnswer((_) async {}); loopSingleAudio = _MockLoopSingleAudio(); - when(() => loopSingleAudio.onCall(any())).thenAnswer((_) async {}); + when(() => loopSingleAudio.onCall(any(), volume: any(named: 'volume'))) + .thenAnswer((_) async {}); preCacheSingleAudio = _MockPreCacheSingleAudio(); when(() => preCacheSingleAudio.onCall(any())).thenAnswer((_) async {}); @@ -443,8 +444,10 @@ void main() { audioPlayer.play(PinballAudio.backgroundMusic); verify( - () => loopSingleAudio - .onCall('packages/pinball_audio/${Assets.music.background}'), + () => loopSingleAudio.onCall( + 'packages/pinball_audio/${Assets.music.background}', + volume: .6, + ), ).called(1); }); @@ -455,8 +458,10 @@ void main() { ..play(PinballAudio.backgroundMusic); verify( - () => loopSingleAudio - .onCall('packages/pinball_audio/${Assets.music.background}'), + () => loopSingleAudio.onCall( + 'packages/pinball_audio/${Assets.music.background}', + volume: .6, + ), ).called(1); }); }); diff --git a/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart b/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart index 48c90552..b974f33c 100644 --- a/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart +++ b/packages/pinball_components/lib/src/components/multiball/behaviors/multiball_blinking_behavior.dart @@ -9,9 +9,9 @@ import 'package:pinball_flame/pinball_flame.dart'; class MultiballBlinkingBehavior extends TimerComponent with ParentIsA { /// {@macro multiball_blinking_behavior} - MultiballBlinkingBehavior() : super(period: 0.1); + MultiballBlinkingBehavior() : super(period: 0.18); - final _maxBlinks = 10; + final _maxBlinks = 28; int _blinksCounter = 0; diff --git a/packages/pinball_components/sandbox/lib/common/add_game.dart b/packages/pinball_components/sandbox/lib/common/add_game.dart index 5b6388d3..04e08c01 100644 --- a/packages/pinball_components/sandbox/lib/common/add_game.dart +++ b/packages/pinball_components/sandbox/lib/common/add_game.dart @@ -3,7 +3,7 @@ import 'package:flame/game.dart'; import 'package:sandbox/common/common.dart'; const _path = - 'https://github.com/VGVentures/pinball/tree/main/packages/pinball_components/sandbox/lib/stories/'; + 'https://github.com/flutter/pinball/tree/main/packages/pinball_components/sandbox/lib/stories/'; extension StoryAddGame on Story { void addGame({ diff --git a/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart b/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart index 379f8610..0fcf7668 100644 --- a/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart +++ b/packages/pinball_components/test/src/components/multiball/behaviors/multiball_blinking_behavior_test.dart @@ -21,7 +21,7 @@ void main() { 'MultiballBlinkingBehavior', () { flameTester.testGameWidget( - 'calls onBlink every 0.1 seconds when animation state is animated', + 'calls onBlink every 0.18 seconds when animation state is animated', setUp: (game, tester) async { final behavior = MultiballBlinkingBehavior(); final bloc = _MockMultiballCubit(); @@ -48,7 +48,7 @@ void main() { verify(bloc.onBlink).called(1); await tester.pump(); - game.update(0.1); + game.update(0.18); await streamController.close(); verify(bloc.onBlink).called(1); @@ -124,7 +124,7 @@ void main() { ); flameTester.testGameWidget( - 'onTick stops after 10 blinks repetitions', + 'onTick stops after 28 blinks', setUp: (game, tester) async { final behavior = MultiballBlinkingBehavior(); final bloc = _MockMultiballCubit(); @@ -148,7 +148,7 @@ void main() { ); await tester.pump(); - for (var i = 0; i < 10; i++) { + for (var i = 0; i < 28; i++) { behavior.onTick(); } diff --git a/packages/share_repository/lib/src/share_repository.dart b/packages/share_repository/lib/src/share_repository.dart index 16c29aee..a3f0f942 100644 --- a/packages/share_repository/lib/src/share_repository.dart +++ b/packages/share_repository/lib/src/share_repository.dart @@ -12,13 +12,13 @@ class ShareRepository { final String _appUrl; /// Url to the Github Open Source Pinball project. - static const openSourceCode = 'https://github.com/VGVentures/pinball'; + static const openSourceCode = 'https://github.com/flutter/pinball'; /// Url to the Google IO Event. static const googleIOEvent = 'https://events.google.com/io/'; /// Url to the Pinball game. - static const pinballGameUrl = 'https://ashehwkdkdjruejdnensjsjdne.web.app/#/'; + static const pinballGameUrl = 'https://pinball.flutter.dev'; /// Returns a url to share the [value] on the given [platform]. /// 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 cfc2437a..26f413f7 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], ), ], @@ -89,6 +99,8 @@ class _MockShareRepository extends Mock implements ShareRepository {} class _MockTapDownInfo extends Mock implements TapDownInfo {} +class _MockTapUpInfo extends Mock implements TapUpInfo {} + class _MockUrlLauncher extends Mock with MockPlatformInterfaceMixin implements UrlLauncherPlatform {} @@ -161,7 +173,7 @@ class _MockAppLocalizations extends Mock implements AppLocalizations { String get leaderboardErrorMessage => ''; @override - String iGotScoreAtPinball(int _) => ''; + String iGotScoreAtPinball(String _) => ''; } void main() { @@ -191,9 +203,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 +223,8 @@ void main() { Backbox.test( bloc: bloc, shareRepository: _MockShareRepository(), - platformHelper: platformHelper, ), + platformHelper: platformHelper, ); await tester.pump(); }, @@ -231,9 +245,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 +279,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 +310,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 +342,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 +371,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 +396,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 +421,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 +453,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 +487,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,13 +536,15 @@ 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; - facebookButton.onTapDown(_MockTapDownInfo()); + facebookButton.onTapUp(_MockTapUpInfo()); await game.ready(); @@ -558,13 +592,15 @@ 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; - facebookButton.onTapDown(_MockTapDownInfo()); + facebookButton.onTapUp(_MockTapUpInfo()); await game.ready(); @@ -590,9 +626,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 +651,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 +677,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 +720,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/backbox/displays/game_over_info_display_test.dart b/test/game/components/backbox/displays/game_over_info_display_test.dart index 6b79d9fd..2bee4005 100644 --- a/test/game/components/backbox/displays/game_over_info_display_test.dart +++ b/test/game/components/backbox/displays/game_over_info_display_test.dart @@ -68,6 +68,8 @@ class _MockAppLocalizations extends Mock implements AppLocalizations { class _MockTapDownInfo extends Mock implements TapDownInfo {} +class _MockTapUpInfo extends Mock implements TapUpInfo {} + class _MockUrlLauncher extends Mock with MockPlatformInterfaceMixin implements UrlLauncherPlatform {} @@ -135,7 +137,7 @@ void main() { final googleLink = component.descendants().whereType().first; - googleLink.onTapDown(_MockTapDownInfo()); + googleLink.onTapUp(_MockTapUpInfo()); await game.ready(); diff --git a/test/game/components/backbox/displays/share_display_test.dart b/test/game/components/backbox/displays/share_display_test.dart index 1f882223..ddcb4001 100644 --- a/test/game/components/backbox/displays/share_display_test.dart +++ b/test/game/components/backbox/displays/share_display_test.dart @@ -52,7 +52,7 @@ class _MockAppLocalizations extends Mock implements AppLocalizations { String get socialMediaAccount => ''; } -class _MockTapDownInfo extends Mock implements TapDownInfo {} +class _MockTapUpInfo extends Mock implements TapUpInfo {} void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -74,7 +74,7 @@ void main() { (game) async { var tapped = false; - final tapDownInfo = _MockTapDownInfo(); + final tapUpInfo = _MockTapUpInfo(); final component = ShareDisplay( onShare: (_) => tapped = true, ); @@ -83,7 +83,7 @@ void main() { final facebookButton = component.descendants().whereType().first; - facebookButton.onTapDown(tapDownInfo); + facebookButton.onTapUp(tapUpInfo); expect(tapped, isTrue); }, @@ -94,7 +94,7 @@ void main() { (game) async { var tapped = false; - final tapDownInfo = _MockTapDownInfo(); + final tapUpInfo = _MockTapUpInfo(); final component = ShareDisplay( onShare: (_) => tapped = true, ); @@ -103,7 +103,7 @@ void main() { final twitterButton = component.descendants().whereType().first; - twitterButton.onTapDown(tapDownInfo); + twitterButton.onTapUp(tapUpInfo); expect(tapped, isTrue); }, 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/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart b/test/game/components/google_gallery/behaviors/google_word_bonus_behavior_test.dart index 3d8d2b39..4b3ec2bd 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 @@ -8,6 +8,7 @@ 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/game/components/google_gallery/behaviors/behaviors.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -116,5 +117,51 @@ void main() { verify(googleWordBloc.onBonusAwarded).called(1); }, ); + + flameTester.testGameWidget( + 'adds BonusBallSpawningBehavior to the game when all letters ' + 'in google word are activated', + setUp: (game, tester) async { + final behavior = GoogleWordBonusBehavior(); + final parent = GoogleGallery.test(); + final googleWord = GoogleWord(position: Vector2.zero()); + final googleWordBloc = _MockGoogleWordCubit(); + final streamController = StreamController(); + + whenListen( + googleWordBloc, + streamController.stream, + initialState: GoogleWordState.initial(), + ); + + await parent.add(googleWord); + await game.pump( + parent, + gameBloc: gameBloc, + googleWordBloc: googleWordBloc, + ); + await parent.ensureAdd(behavior); + + streamController.add( + const GoogleWordState( + letterSpriteStates: { + 0: GoogleLetterSpriteState.lit, + 1: GoogleLetterSpriteState.lit, + 2: GoogleLetterSpriteState.lit, + 3: GoogleLetterSpriteState.lit, + 4: GoogleLetterSpriteState.lit, + 5: GoogleLetterSpriteState.lit, + }, + ), + ); + await tester.pump(); + await game.ready(); + + expect( + game.descendants().whereType().length, + equals(1), + ); + }, + ); }); } diff --git a/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart b/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart index 139c7e47..af77ef32 100644 --- a/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart +++ b/test/game/components/multiballs/behaviors/multiballs_behavior_test.dart @@ -78,8 +78,24 @@ void main() { ); test( - 'is false when the bonusHistory has changed ' - 'with a bonus different than GameBonus.dashNest', () { + 'is true when the bonusHistory has changed ' + 'with a new GameBonus.googleWord', + () { + final previous = GameState.initial(); + final state = previous.copyWith( + bonusHistory: [GameBonus.googleWord], + ); + + expect( + MultiballsBehavior().listenWhen(previous, state), + isTrue, + ); + }, + ); + + test( + 'is false when the bonusHistory has changed with a bonus other than ' + 'GameBonus.dashNest or GameBonus.googleWord', () { final previous = GameState.initial().copyWith(bonusHistory: [GameBonus.dashNest]); final state = previous.copyWith( 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/more_information/more_information_dialog_test.dart b/test/more_information/more_information_dialog_test.dart index f87ec84c..cf7ba149 100644 --- a/test/more_information/more_information_dialog_test.dart +++ b/test/more_information/more_information_dialog_test.dart @@ -138,7 +138,7 @@ void main() { ); { - 'Open Source Code': 'https://github.com/VGVentures/pinball', + 'Open Source Code': 'https://github.com/flutter/pinball', 'Google I/O': 'https://events.google.com/io/', 'Flutter Games': 'http://flutter.dev/games', 'How it’s made': 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();