refactor: inject platform helper

pull/411/head
Allison Ryan 3 years ago
parent 1bd1f45d99
commit 69e0f240b6

@ -2,6 +2,8 @@ import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_components/pinball_components.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 /// Updates the [ArcadeBackground] and launch [Ball] to reflect character
/// selections. /// selections.
@ -11,12 +13,14 @@ class CharacterSelectionBehavior extends Component
HasGameRef { HasGameRef {
@override @override
void onNewState(CharacterThemeState state) { void onNewState(CharacterThemeState state) {
if (!readProvider<PlatformHelper>().isMobile) {
gameRef gameRef
.descendants() .descendants()
.whereType<ArcadeBackground>() .whereType<ArcadeBackground>()
.single .single
.bloc .bloc
.onCharacterSelected(state.characterTheme); .onCharacterSelected(state.characterTheme);
}
gameRef gameRef
.descendants() .descendants()
.whereType<Ball>() .whereType<Ball>()

@ -26,11 +26,13 @@ class PinballGame extends PinballForge2DGame
required GameBloc gameBloc, required GameBloc gameBloc,
required AppLocalizations l10n, required AppLocalizations l10n,
required PinballAudioPlayer audioPlayer, required PinballAudioPlayer audioPlayer,
required PlatformHelper platformHelper,
}) : focusNode = FocusNode(), }) : focusNode = FocusNode(),
_gameBloc = gameBloc, _gameBloc = gameBloc,
_audioPlayer = audioPlayer, _audioPlayer = audioPlayer,
_characterThemeBloc = characterThemeBloc, _characterThemeBloc = characterThemeBloc,
_l10n = l10n, _l10n = l10n,
_platformHelper = platformHelper,
super( super(
gravity: Vector2(0, 30), gravity: Vector2(0, 30),
) { ) {
@ -58,6 +60,8 @@ class PinballGame extends PinballForge2DGame
final AppLocalizations _l10n; final AppLocalizations _l10n;
final PlatformHelper _platformHelper;
final GameBloc _gameBloc; final GameBloc _gameBloc;
List<LeaderboardEntryData>? _entries; List<LeaderboardEntryData>? _entries;
@ -91,6 +95,7 @@ class PinballGame extends PinballForge2DGame
FlameProvider<LeaderboardRepository>.value(leaderboardRepository), FlameProvider<LeaderboardRepository>.value(leaderboardRepository),
FlameProvider<ShareRepository>.value(shareRepository), FlameProvider<ShareRepository>.value(shareRepository),
FlameProvider<AppLocalizations>.value(_l10n), FlameProvider<AppLocalizations>.value(_l10n),
FlameProvider<PlatformHelper>.value(_platformHelper),
], ],
children: [ children: [
BonusNoiseBehavior(), BonusNoiseBehavior(),
@ -107,7 +112,7 @@ class PinballGame extends PinballForge2DGame
children: [ children: [
ZCanvasComponent( ZCanvasComponent(
children: [ children: [
if (!PlatformHelper().isMobile) ArcadeBackground(), if (!_platformHelper.isMobile) ArcadeBackground(),
BoardBackgroundSpriteComponent(), BoardBackgroundSpriteComponent(),
Boundaries(), Boundaries(),
Backbox( Backbox(
@ -198,6 +203,7 @@ class DebugPinballGame extends PinballGame with FPSCounter, PanDetector {
required ShareRepository shareRepository, required ShareRepository shareRepository,
required AppLocalizations l10n, required AppLocalizations l10n,
required PinballAudioPlayer audioPlayer, required PinballAudioPlayer audioPlayer,
required PlatformHelper platformHelper,
required GameBloc gameBloc, required GameBloc gameBloc,
}) : super( }) : super(
characterThemeBloc: characterThemeBloc, characterThemeBloc: characterThemeBloc,
@ -205,6 +211,7 @@ class DebugPinballGame extends PinballGame with FPSCounter, PanDetector {
leaderboardRepository: leaderboardRepository, leaderboardRepository: leaderboardRepository,
shareRepository: shareRepository, shareRepository: shareRepository,
l10n: l10n, l10n: l10n,
platformHelper: platformHelper,
gameBloc: gameBloc, gameBloc: gameBloc,
); );

@ -11,6 +11,7 @@ import 'package:pinball/select_character/select_character.dart';
import 'package:pinball/start_game/start_game.dart'; import 'package:pinball/start_game/start_game.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_ui/pinball_ui.dart'; import 'package:pinball_ui/pinball_ui.dart';
import 'package:platform_helper/platform_helper.dart';
import 'package:share_repository/share_repository.dart'; import 'package:share_repository/share_repository.dart';
class PinballGamePage extends StatelessWidget { class PinballGamePage extends StatelessWidget {
@ -27,6 +28,7 @@ class PinballGamePage extends StatelessWidget {
final audioPlayer = context.read<PinballAudioPlayer>(); final audioPlayer = context.read<PinballAudioPlayer>();
final leaderboardRepository = context.read<LeaderboardRepository>(); final leaderboardRepository = context.read<LeaderboardRepository>();
final shareRepository = context.read<ShareRepository>(); final shareRepository = context.read<ShareRepository>();
final platformHelper = PlatformHelper();
final gameBloc = context.read<GameBloc>(); final gameBloc = context.read<GameBloc>();
final game = isDebugMode final game = isDebugMode
? DebugPinballGame( ? DebugPinballGame(
@ -35,6 +37,7 @@ class PinballGamePage extends StatelessWidget {
leaderboardRepository: leaderboardRepository, leaderboardRepository: leaderboardRepository,
shareRepository: shareRepository, shareRepository: shareRepository,
l10n: context.l10n, l10n: context.l10n,
platformHelper: platformHelper,
gameBloc: gameBloc, gameBloc: gameBloc,
) )
: PinballGame( : PinballGame(
@ -43,6 +46,7 @@ class PinballGamePage extends StatelessWidget {
leaderboardRepository: leaderboardRepository, leaderboardRepository: leaderboardRepository,
shareRepository: shareRepository, shareRepository: shareRepository,
l10n: context.l10n, l10n: context.l10n,
platformHelper: platformHelper,
gameBloc: gameBloc, gameBloc: gameBloc,
); );

@ -12,6 +12,7 @@ import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
import 'package:pinball_theme/pinball_theme.dart' as theme; import 'package:pinball_theme/pinball_theme.dart' as theme;
import 'package:platform_helper/platform_helper.dart';
class _TestGame extends Forge2DGame { class _TestGame extends Forge2DGame {
@override @override
@ -28,12 +29,18 @@ class _TestGame extends Forge2DGame {
Future<void> pump( Future<void> pump(
List<Component> children, { List<Component> children, {
CharacterThemeCubit? characterThemeBloc, CharacterThemeCubit? characterThemeBloc,
PlatformHelper? platformHelper,
}) async { }) async {
await ensureAdd( await ensureAdd(
FlameBlocProvider<CharacterThemeCubit, CharacterThemeState>.value( FlameBlocProvider<CharacterThemeCubit, CharacterThemeState>.value(
value: characterThemeBloc ?? CharacterThemeCubit(), value: characterThemeBloc ?? CharacterThemeCubit(),
children: [
FlameProvider.value(
platformHelper ?? _MockPlatformHelper(),
children: children, children: children,
), ),
],
),
); );
} }
} }
@ -43,6 +50,8 @@ class _MockBallCubit extends Mock implements BallCubit {}
class _MockArcadeBackgroundCubit extends Mock implements ArcadeBackgroundCubit { class _MockArcadeBackgroundCubit extends Mock implements ArcadeBackgroundCubit {
} }
class _MockPlatformHelper extends Mock implements PlatformHelper {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
@ -68,8 +77,45 @@ void main() {
); );
flameTester.test( 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 { (game) async {
final platformHelper = _MockPlatformHelper();
when(() => platformHelper.isMobile).thenAnswer((_) => true);
final arcadeBackgroundBloc = _MockArcadeBackgroundCubit();
whenListen(
arcadeBackgroundBloc,
const Stream<ArcadeBackgroundState>.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(); final arcadeBackgroundBloc = _MockArcadeBackgroundCubit();
whenListen( whenListen(
arcadeBackgroundBloc, arcadeBackgroundBloc,
@ -79,13 +125,16 @@ void main() {
final arcadeBackground = final arcadeBackground =
ArcadeBackground.test(bloc: arcadeBackgroundBloc); ArcadeBackground.test(bloc: arcadeBackgroundBloc);
final behavior = CharacterSelectionBehavior(); final behavior = CharacterSelectionBehavior();
await game.pump([ await game.pump(
[
arcadeBackground, arcadeBackground,
behavior, behavior,
ZCanvasComponent(), ZCanvasComponent(),
Plunger.test(compressionDistance: 10), Plunger.test(compressionDistance: 10),
Ball.test(), Ball.test(),
]); ],
platformHelper: platformHelper,
);
const dinoThemeState = CharacterThemeState(theme.DinoTheme()); const dinoThemeState = CharacterThemeState(theme.DinoTheme());
behavior.onNewState(dinoThemeState); behavior.onNewState(dinoThemeState);
@ -101,6 +150,8 @@ void main() {
flameTester.test( flameTester.test(
'onNewState calls onCharacterSelected on the ball bloc', 'onNewState calls onCharacterSelected on the ball bloc',
(game) async { (game) async {
final platformHelper = _MockPlatformHelper();
when(() => platformHelper.isMobile).thenAnswer((_) => false);
final ballBloc = _MockBallCubit(); final ballBloc = _MockBallCubit();
whenListen( whenListen(
ballBloc, ballBloc,
@ -109,13 +160,16 @@ void main() {
); );
final ball = Ball.test(bloc: ballBloc); final ball = Ball.test(bloc: ballBloc);
final behavior = CharacterSelectionBehavior(); final behavior = CharacterSelectionBehavior();
await game.pump([ await game.pump(
[
ball, ball,
behavior, behavior,
ZCanvasComponent(), ZCanvasComponent(),
Plunger.test(compressionDistance: 10), Plunger.test(compressionDistance: 10),
ArcadeBackground.test(), ArcadeBackground.test(),
]); ],
platformHelper: platformHelper,
);
const dinoThemeState = CharacterThemeState(theme.DinoTheme()); const dinoThemeState = CharacterThemeState(theme.DinoTheme());
behavior.onNewState(dinoThemeState); behavior.onNewState(dinoThemeState);

@ -16,6 +16,7 @@ import 'package:pinball/game/game.dart';
import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_audio/src/pinball_audio.dart'; import 'package:pinball_audio/src/pinball_audio.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:platform_helper/platform_helper.dart';
import 'package:share_repository/share_repository.dart'; import 'package:share_repository/share_repository.dart';
class _TestPinballGame extends PinballGame { class _TestPinballGame extends PinballGame {
@ -27,6 +28,7 @@ class _TestPinballGame extends PinballGame {
gameBloc: GameBloc(), gameBloc: GameBloc(),
l10n: _MockAppLocalizations(), l10n: _MockAppLocalizations(),
audioPlayer: _MockPinballAudioPlayer(), audioPlayer: _MockPinballAudioPlayer(),
platformHelper: _MockPlatformHelper(),
); );
@override @override
@ -47,6 +49,7 @@ class _TestDebugPinballGame extends DebugPinballGame {
gameBloc: GameBloc(), gameBloc: GameBloc(),
l10n: _MockAppLocalizations(), l10n: _MockAppLocalizations(),
audioPlayer: _MockPinballAudioPlayer(), audioPlayer: _MockPinballAudioPlayer(),
platformHelper: _MockPlatformHelper(),
); );
@override @override
@ -88,6 +91,11 @@ class _MockShareRepository extends Mock implements ShareRepository {}
class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {}
class _MockPlatformHelper extends Mock implements PlatformHelper {
@override
bool get isMobile => false;
}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();

@ -15,6 +15,7 @@ import 'package:pinball/more_information/more_information.dart';
import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball/start_game/start_game.dart'; import 'package:pinball/start_game/start_game.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'package:platform_helper/platform_helper.dart';
import 'package:share_repository/share_repository.dart'; import 'package:share_repository/share_repository.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
@ -28,6 +29,7 @@ class _TestPinballGame extends PinballGame {
gameBloc: GameBloc(), gameBloc: GameBloc(),
l10n: _MockAppLocalizations(), l10n: _MockAppLocalizations(),
audioPlayer: _MockPinballAudioPlayer(), audioPlayer: _MockPinballAudioPlayer(),
platformHelper: _MockPlatformHelper(),
); );
@override @override
@ -63,6 +65,11 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository {
class _MockShareRepository extends Mock implements ShareRepository {} class _MockShareRepository extends Mock implements ShareRepository {}
class _MockPlatformHelper extends Mock implements PlatformHelper {
@override
bool get isMobile => false;
}
void main() { void main() {
final game = _TestPinballGame(); final game = _TestPinballGame();

Loading…
Cancel
Save