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: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) {
if (!readProvider<PlatformHelper>().isMobile) {
gameRef
.descendants()
.whereType<ArcadeBackground>()
.single
.bloc
.onCharacterSelected(state.characterTheme);
}
gameRef
.descendants()
.whereType<Ball>()

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

@ -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,12 +29,18 @@ class _TestGame extends Forge2DGame {
Future<void> pump(
List<Component> children, {
CharacterThemeCubit? characterThemeBloc,
PlatformHelper? platformHelper,
}) async {
await ensureAdd(
FlameBlocProvider<CharacterThemeCubit, CharacterThemeState>.value(
value: characterThemeBloc ?? CharacterThemeCubit(),
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<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();
whenListen(
arcadeBackgroundBloc,
@ -79,13 +125,16 @@ void main() {
final arcadeBackground =
ArcadeBackground.test(bloc: arcadeBackgroundBloc);
final behavior = CharacterSelectionBehavior();
await game.pump([
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([
await game.pump(
[
ball,
behavior,
ZCanvasComponent(),
Plunger.test(compressionDistance: 10),
ArcadeBackground.test(),
]);
],
platformHelper: platformHelper,
);
const dinoThemeState = CharacterThemeState(theme.DinoTheme());
behavior.onNewState(dinoThemeState);

@ -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();

@ -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();

Loading…
Cancel
Save