diff --git a/lib/app/view/app.dart b/lib/app/view/app.dart index de46512b..a44d2e33 100644 --- a/lib/app/view/app.dart +++ b/lib/app/view/app.dart @@ -17,15 +17,15 @@ class App extends StatelessWidget { Key? key, required AuthenticationRepository authenticationRepository, required LeaderboardRepository leaderboardRepository, - required PinballAudio pinballAudio, + required PinballPlayer pinballPlayer, }) : _authenticationRepository = authenticationRepository, _leaderboardRepository = leaderboardRepository, - _pinballAudio = pinballAudio, + _pinballPlayer = pinballPlayer, super(key: key); final AuthenticationRepository _authenticationRepository; final LeaderboardRepository _leaderboardRepository; - final PinballAudio _pinballAudio; + final PinballPlayer _pinballPlayer; @override Widget build(BuildContext context) { @@ -33,7 +33,7 @@ class App extends StatelessWidget { providers: [ RepositoryProvider.value(value: _authenticationRepository), RepositoryProvider.value(value: _leaderboardRepository), - RepositoryProvider.value(value: _pinballAudio), + RepositoryProvider.value(value: _pinballPlayer), ], child: MultiBlocProvider( providers: [ diff --git a/lib/game/behaviors/bumper_noisy_behavior.dart b/lib/game/behaviors/bumper_noisy_behavior.dart index c837c8c5..86c9f7b0 100644 --- a/lib/game/behaviors/bumper_noisy_behavior.dart +++ b/lib/game/behaviors/bumper_noisy_behavior.dart @@ -3,12 +3,13 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball/game/pinball_game.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_flame/pinball_flame.dart'; class BumperNoisyBehavior extends ContactBehavior with HasGameRef { @override void beginContact(Object other, Contact contact) { super.beginContact(other, contact); - gameRef.audio.bumper(); + gameRef.player.play(PinballAudio.bumper); } } diff --git a/lib/game/components/game_flow_controller.dart b/lib/game/components/game_flow_controller.dart index 1299e6eb..e285eb3a 100644 --- a/lib/game/components/game_flow_controller.dart +++ b/lib/game/components/game_flow_controller.dart @@ -1,6 +1,7 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template game_flow_controller} @@ -38,7 +39,7 @@ class GameFlowController extends ComponentController /// Puts the game in the playing state. void start() { - component.audio.backgroundMusic(); + component.player.play(PinballAudio.backgroundMusic); component.firstChild()?.focusOnGame(); component.overlays.remove(PinballGame.playButtonOverlay); } diff --git a/lib/game/components/google_word/behaviors/google_word_bonus_behavior.dart b/lib/game/components/google_word/behaviors/google_word_bonus_behavior.dart index cb9ad308..a9522e76 100644 --- a/lib/game/components/google_word/behaviors/google_word_bonus_behavior.dart +++ b/lib/game/components/google_word/behaviors/google_word_bonus_behavior.dart @@ -1,5 +1,6 @@ import 'package:flame/components.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; @@ -20,7 +21,7 @@ class GoogleWordBonusBehavior extends Component .every((letter) => letter.bloc.state == GoogleLetterState.lit); if (achievedBonus) { - gameRef.audio.googleBonus(); + gameRef.player.play(PinballAudio.google); gameRef .read() .add(const BonusActivated(GameBonus.googleWord)); diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 907687c9..a6f496af 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -23,8 +23,8 @@ class PinballGame extends PinballForge2DGame MultiTouchTapDetector { PinballGame({ required this.characterTheme, - required this.audio, required this.l10n, + required this.player, }) : super(gravity: Vector2(0, 30)) { images.prefix = ''; controller = _GameBallsController(this); @@ -38,7 +38,7 @@ class PinballGame extends PinballForge2DGame final CharacterTheme characterTheme; - final PinballAudio audio; + final PinballPlayer player; final AppLocalizations l10n; @@ -186,11 +186,11 @@ class _GameBallsController extends ComponentController class DebugPinballGame extends PinballGame with FPSCounter, PanDetector { DebugPinballGame({ required CharacterTheme characterTheme, - required PinballAudio audio, required AppLocalizations l10n, + required PinballPlayer player, }) : super( characterTheme: characterTheme, - audio: audio, + player: player, l10n: l10n, ) { controller = _GameBallsController(this); diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index 6c823a69..033d5b04 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -36,24 +36,24 @@ class PinballGamePage extends StatelessWidget { Widget build(BuildContext context) { final characterTheme = context.read().state.characterTheme; - final audio = context.read(); - final pinballAudio = context.read(); + final player = context.read(); + final pinballAudio = context.read(); final game = isDebugMode ? DebugPinballGame( characterTheme: characterTheme, - audio: audio, + player: player, l10n: context.l10n, ) : PinballGame( characterTheme: characterTheme, - audio: audio, + player: player, l10n: context.l10n, ); final loadables = [ ...game.preLoadAssets(), - pinballAudio.load(), + ...pinballAudio.load(), ...BonusAnimation.loadAssets(), ...SelectedCharacter.loadAssets(), ]; 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 5ac1ef2a..1fd26837 100644 --- a/lib/how_to_play/widgets/how_to_play_dialog.dart +++ b/lib/how_to_play/widgets/how_to_play_dialog.dart @@ -3,8 +3,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:pinball/gen/gen.dart'; import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_ui/pinball_ui.dart'; import 'package:platform_helper/platform_helper.dart'; @@ -91,6 +93,7 @@ class _HowToPlayDialogState extends State { return WillPopScope( onWillPop: () { widget.onDismissCallback.call(); + context.read().play(PinballAudio.ioPinballVoiceOver); return Future.value(true); }, child: PinballDialog( diff --git a/lib/main_development.dart b/lib/main_development.dart index 21166057..67d83b81 100644 --- a/lib/main_development.dart +++ b/lib/main_development.dart @@ -11,7 +11,7 @@ void main() { bootstrap((firestore, firebaseAuth) async { final leaderboardRepository = LeaderboardRepository(firestore); final authenticationRepository = AuthenticationRepository(firebaseAuth); - final pinballAudio = PinballAudio(); + final pinballPlayer = PinballPlayer(); unawaited( Firebase.initializeApp().then( (_) => authenticationRepository.authenticateAnonymously(), @@ -20,7 +20,7 @@ void main() { return App( authenticationRepository: authenticationRepository, leaderboardRepository: leaderboardRepository, - pinballAudio: pinballAudio, + pinballPlayer: pinballPlayer, ); }); } diff --git a/lib/main_production.dart b/lib/main_production.dart index 21166057..67d83b81 100644 --- a/lib/main_production.dart +++ b/lib/main_production.dart @@ -11,7 +11,7 @@ void main() { bootstrap((firestore, firebaseAuth) async { final leaderboardRepository = LeaderboardRepository(firestore); final authenticationRepository = AuthenticationRepository(firebaseAuth); - final pinballAudio = PinballAudio(); + final pinballPlayer = PinballPlayer(); unawaited( Firebase.initializeApp().then( (_) => authenticationRepository.authenticateAnonymously(), @@ -20,7 +20,7 @@ void main() { return App( authenticationRepository: authenticationRepository, leaderboardRepository: leaderboardRepository, - pinballAudio: pinballAudio, + pinballPlayer: pinballPlayer, ); }); } diff --git a/lib/main_staging.dart b/lib/main_staging.dart index 21166057..67d83b81 100644 --- a/lib/main_staging.dart +++ b/lib/main_staging.dart @@ -11,7 +11,7 @@ void main() { bootstrap((firestore, firebaseAuth) async { final leaderboardRepository = LeaderboardRepository(firestore); final authenticationRepository = AuthenticationRepository(firebaseAuth); - final pinballAudio = PinballAudio(); + final pinballPlayer = PinballPlayer(); unawaited( Firebase.initializeApp().then( (_) => authenticationRepository.authenticateAnonymously(), @@ -20,7 +20,7 @@ void main() { return App( authenticationRepository: authenticationRepository, leaderboardRepository: leaderboardRepository, - pinballAudio: pinballAudio, + pinballPlayer: pinballPlayer, ); }); } diff --git a/lib/start_game/widgets/start_game_listener.dart b/lib/start_game/widgets/start_game_listener.dart index df34b324..6184bd91 100644 --- a/lib/start_game/widgets/start_game_listener.dart +++ b/lib/start_game/widgets/start_game_listener.dart @@ -4,7 +4,6 @@ import 'package:pinball/game/game.dart'; 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:pinball_ui/pinball_ui.dart'; /// {@template start_game_listener} @@ -57,14 +56,11 @@ class StartGameListener extends StatelessWidget { } void _onHowToPlay(BuildContext context) { - final audio = context.read(); - _showPinballDialog( context: context, child: HowToPlayDialog( onDismissCallback: () { context.read().add(const HowToPlayFinished()); - audio.ioPinballVoiceOver(); }, ), ); diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 07257fea..a859a86f 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -3,10 +3,25 @@ import 'dart:math'; import 'package:audioplayers/audioplayers.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; +import 'package:flutter/material.dart'; import 'package:pinball_audio/gen/assets.gen.dart'; -/// Function that defines the contract of the creation -/// of an [AudioPool] +/// Sounds available for play +enum PinballAudio { + /// Google + google, + + /// Bumper + bumper, + + /// Background music + backgroundMusic, + + /// IO Pinball voice over + ioPinballVoiceOver +} + +/// Defines the contract of the creation of an [AudioPool]. typedef CreateAudioPool = Future Function( String sound, { bool? repeating, @@ -31,12 +46,97 @@ typedef PreCacheSingleAudio = Future Function(String); /// an [AudioCache] instance typedef ConfigureAudioCache = void Function(AudioCache); -/// {@template pinball_audio} +abstract class _Audio { + void play(); + Future load(); + + String prefixFile(String file) { + return 'packages/pinball_audio/$file'; + } +} + +class _SimplePlayAudio extends _Audio { + _SimplePlayAudio({ + required this.preCacheSingleAudio, + required this.playSingleAudio, + required this.path, + }); + + final PreCacheSingleAudio preCacheSingleAudio; + final PlaySingleAudio playSingleAudio; + final String path; + + @override + Future load() => preCacheSingleAudio(prefixFile(path)); + + @override + void play() { + playSingleAudio(prefixFile(path)); + } +} + +class _LoopAudio extends _Audio { + _LoopAudio({ + required this.preCacheSingleAudio, + required this.loopSingleAudio, + required this.path, + }); + + final PreCacheSingleAudio preCacheSingleAudio; + final LoopSingleAudio loopSingleAudio; + final String path; + + @override + Future load() => preCacheSingleAudio(prefixFile(path)); + + @override + void play() { + loopSingleAudio(prefixFile(path)); + } +} + +class _BumperAudio extends _Audio { + _BumperAudio({ + required this.createAudioPool, + required this.seed, + }); + + final CreateAudioPool createAudioPool; + final Random seed; + + late AudioPool bumperA; + late AudioPool bumperB; + + @override + Future load() async { + await Future.wait( + [ + createAudioPool( + prefixFile(Assets.sfx.bumperA), + maxPlayers: 4, + prefix: '', + ).then((pool) => bumperA = pool), + createAudioPool( + prefixFile(Assets.sfx.bumperB), + maxPlayers: 4, + prefix: '', + ).then((pool) => bumperB = pool), + ], + ); + } + + @override + void play() { + (seed.nextBool() ? bumperA : bumperB).start(volume: 0.6); + } +} + +/// {@template pinball_player} /// Sound manager for the pinball game /// {@endtemplate} -class PinballAudio { - /// {@macro pinball_audio} - PinballAudio({ +class PinballPlayer { + /// {@macro pinball_player} + PinballPlayer({ CreateAudioPool? createAudioPool, PlaySingleAudio? playSingleAudio, LoopSingleAudio? loopSingleAudio, @@ -52,7 +152,29 @@ class PinballAudio { ((AudioCache a) { a.prefix = ''; }), - _seed = seed ?? Random(); + _seed = seed ?? Random() { + audios = { + PinballAudio.google: _SimplePlayAudio( + preCacheSingleAudio: _preCacheSingleAudio, + playSingleAudio: _playSingleAudio, + path: Assets.sfx.google, + ), + PinballAudio.ioPinballVoiceOver: _SimplePlayAudio( + preCacheSingleAudio: _preCacheSingleAudio, + playSingleAudio: _playSingleAudio, + path: Assets.sfx.ioPinballVoiceOver, + ), + PinballAudio.bumper: _BumperAudio( + createAudioPool: _createAudioPool, + seed: _seed, + ), + PinballAudio.backgroundMusic: _LoopAudio( + preCacheSingleAudio: _preCacheSingleAudio, + loopSingleAudio: _loopSingleAudio, + path: Assets.music.background, + ), + }; + } final CreateAudioPool _createAudioPool; @@ -66,54 +188,24 @@ class PinballAudio { final Random _seed; - late AudioPool _bumperAPool; - - late AudioPool _bumperBPool; + /// Registered audios on the Player + @visibleForTesting + // ignore: library_private_types_in_public_api + late final Map audios; /// Loads the sounds effects into the memory - Future load() async { + List> load() { _configureAudioCache(FlameAudio.audioCache); - _bumperAPool = await _createAudioPool( - _prefixFile(Assets.sfx.bumperA), - maxPlayers: 4, - prefix: '', - ); - - _bumperBPool = await _createAudioPool( - _prefixFile(Assets.sfx.bumperB), - maxPlayers: 4, - prefix: '', - ); - - await Future.wait([ - _preCacheSingleAudio(_prefixFile(Assets.sfx.google)), - _preCacheSingleAudio(_prefixFile(Assets.sfx.ioPinballVoiceOver)), - _preCacheSingleAudio(_prefixFile(Assets.music.background)), - ]); - } - - /// Plays a random bumper sfx. - void bumper() { - (_seed.nextBool() ? _bumperAPool : _bumperBPool).start(volume: 0.6); - } - - /// Plays the google word bonus - void googleBonus() { - _playSingleAudio(_prefixFile(Assets.sfx.google)); + return audios.values.map((a) => a.load()).toList(); } - /// Plays the I/O Pinball voice over audio. - void ioPinballVoiceOver() { - _playSingleAudio(_prefixFile(Assets.sfx.ioPinballVoiceOver)); - } - - /// Plays the background music - void backgroundMusic() { - _loopSingleAudio(_prefixFile(Assets.music.background)); - } - - String _prefixFile(String file) { - return 'packages/pinball_audio/$file'; + /// Plays the received auido + void play(PinballAudio audio) { + assert( + audios.containsKey(audio), + 'Tried to play unregistered audio $audio', + ); + audios[audio]?.play(); } } diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 916d0f34..8740cda0 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -51,7 +51,7 @@ void main() { late _MockLoopSingleAudio loopSingleAudio; late _PreCacheSingleAudio preCacheSingleAudio; late Random seed; - late PinballAudio audio; + late PinballPlayer player; setUpAll(() { registerFallbackValue(_MockAudioCache()); @@ -81,7 +81,7 @@ void main() { seed = _MockRandom(); - audio = PinballAudio( + player = PinballPlayer( configureAudioCache: configureAudioCache.onCall, createAudioPool: createAudioPool.onCall, playSingleAudio: playSingleAudio.onCall, @@ -92,12 +92,12 @@ void main() { }); test('can be instantiated', () { - expect(PinballAudio(), isNotNull); + expect(PinballPlayer(), isNotNull); }); group('load', () { test('creates the bumpers pools', () async { - await audio.load(); + await Future.wait(player.load()); verify( () => createAudioPool.onCall( @@ -117,25 +117,25 @@ void main() { }); test('configures the audio cache instance', () async { - await audio.load(); + await Future.wait(player.load()); verify(() => configureAudioCache.onCall(FlameAudio.audioCache)) .called(1); }); test('sets the correct prefix', () async { - audio = PinballAudio( + player = PinballPlayer( createAudioPool: createAudioPool.onCall, playSingleAudio: playSingleAudio.onCall, preCacheSingleAudio: preCacheSingleAudio.onCall, ); - await audio.load(); + await Future.wait(player.load()); expect(FlameAudio.audioCache.prefix, equals('')); }); test('pre cache the assets', () async { - await audio.load(); + await Future.wait(player.load()); verify( () => preCacheSingleAudio @@ -184,8 +184,8 @@ void main() { group('when seed is true', () { test('plays the bumper A sound pool', () async { when(seed.nextBool).thenReturn(true); - await audio.load(); - audio.bumper(); + await Future.wait(player.load()); + player.play(PinballAudio.bumper); verify(() => bumperAPool.start(volume: 0.6)).called(1); }); @@ -194,8 +194,8 @@ void main() { group('when seed is false', () { test('plays the bumper B sound pool', () async { when(seed.nextBool).thenReturn(false); - await audio.load(); - audio.bumper(); + await Future.wait(player.load()); + player.play(PinballAudio.bumper); verify(() => bumperBPool.start(volume: 0.6)).called(1); }); @@ -204,8 +204,8 @@ void main() { group('googleBonus', () { test('plays the correct file', () async { - await audio.load(); - audio.googleBonus(); + await Future.wait(player.load()); + player.play(PinballAudio.google); verify( () => playSingleAudio @@ -216,8 +216,8 @@ void main() { group('ioPinballVoiceOver', () { test('plays the correct file', () async { - await audio.load(); - audio.ioPinballVoiceOver(); + await Future.wait(player.load()); + player.play(PinballAudio.ioPinballVoiceOver); verify( () => playSingleAudio.onCall( @@ -229,8 +229,8 @@ void main() { group('backgroundMusic', () { test('plays the correct file', () async { - await audio.load(); - audio.backgroundMusic(); + await Future.wait(player.load()); + player.play(PinballAudio.backgroundMusic); verify( () => loopSingleAudio @@ -238,5 +238,15 @@ void main() { ).called(1); }); }); + + test( + 'throws assertions error when playing an unregistered audio', + () async { + player.audios.remove(PinballAudio.google); + await Future.wait(player.load()); + + expect(() => player.play(PinballAudio.google), throwsAssertionError); + }, + ); }); } diff --git a/test/app/view/app_test.dart b/test/app/view/app_test.dart index ca1cedff..4f04a89d 100644 --- a/test/app/view/app_test.dart +++ b/test/app/view/app_test.dart @@ -9,7 +9,7 @@ import 'package:pinball_audio/pinball_audio.dart'; class _MockAuthenticationRepository extends Mock implements AuthenticationRepository {} -class _MockPinballAudio extends Mock implements PinballAudio {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} class _MockLeaderboardRepository extends Mock implements LeaderboardRepository { } @@ -18,13 +18,13 @@ void main() { group('App', () { late AuthenticationRepository authenticationRepository; late LeaderboardRepository leaderboardRepository; - late PinballAudio pinballAudio; + late PinballPlayer pinballPlayer; setUp(() { authenticationRepository = _MockAuthenticationRepository(); leaderboardRepository = _MockLeaderboardRepository(); - pinballAudio = _MockPinballAudio(); - when(pinballAudio.load).thenAnswer((_) => Future.value()); + pinballPlayer = _MockPinballPlayer(); + when(pinballPlayer.load).thenAnswer((_) => [Future.value()]); }); testWidgets('renders PinballGamePage', (tester) async { @@ -32,7 +32,7 @@ void main() { App( authenticationRepository: authenticationRepository, leaderboardRepository: leaderboardRepository, - pinballAudio: pinballAudio, + pinballPlayer: pinballPlayer, ), ); expect(find.byType(PinballGamePage), findsOneWidget); diff --git a/test/game/behaviors/bumper_noisy_behavior_test.dart b/test/game/behaviors/bumper_noisy_behavior_test.dart index b288e4c6..18d90fbd 100644 --- a/test/game/behaviors/bumper_noisy_behavior_test.dart +++ b/test/game/behaviors/bumper_noisy_behavior_test.dart @@ -16,7 +16,7 @@ class _TestBodyComponent extends BodyComponent { } } -class _MockPinballAudio extends Mock implements PinballAudio {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} class _MockContact extends Mock implements Contact {} @@ -25,13 +25,13 @@ void main() { group('BumperNoisyBehavior', () {}); - late PinballAudio audio; + late PinballPlayer player; final flameTester = FlameTester( - () => EmptyPinballTestGame(audio: audio), + () => EmptyPinballTestGame(player: player), ); setUp(() { - audio = _MockPinballAudio(); + player = _MockPinballPlayer(); }); flameTester.testGameWidget( @@ -44,7 +44,7 @@ void main() { behavior.beginContact(Object(), _MockContact()); }, verify: (_, __) async { - verify(audio.bumper).called(1); + verify(() => player.play(PinballAudio.bumper)).called(1); }, ); } diff --git a/test/game/components/game_flow_controller_test.dart b/test/game/components/game_flow_controller_test.dart index e403396d..25e2ed50 100644 --- a/test/game/components/game_flow_controller_test.dart +++ b/test/game/components/game_flow_controller_test.dart @@ -16,7 +16,7 @@ class _MockCameraController extends Mock implements CameraController {} class _MockActiveOverlaysNotifier extends Mock implements ActiveOverlaysNotifier {} -class _MockPinballAudio extends Mock implements PinballAudio {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} void main() { group('GameFlowController', () { @@ -43,7 +43,7 @@ void main() { late Backbox backbox; late CameraController cameraController; late GameFlowController gameFlowController; - late PinballAudio pinballAudio; + late PinballPlayer pinballPlayer; late ActiveOverlaysNotifier overlays; setUp(() { @@ -52,7 +52,7 @@ void main() { cameraController = _MockCameraController(); gameFlowController = GameFlowController(game); overlays = _MockActiveOverlaysNotifier(); - pinballAudio = _MockPinballAudio(); + pinballPlayer = _MockPinballPlayer(); when( () => backbox.initialsInput( @@ -71,7 +71,7 @@ void main() { when(game.firstChild).thenReturn(cameraController); when(() => game.overlays).thenReturn(overlays); when(() => game.characterTheme).thenReturn(DashTheme()); - when(() => game.audio).thenReturn(pinballAudio); + when(() => game.player).thenReturn(pinballPlayer); }); test( @@ -115,7 +115,8 @@ void main() { () { gameFlowController.onNewState(GameState.initial()); - verify(pinballAudio.backgroundMusic).called(1); + verify(() => pinballPlayer.play(PinballAudio.backgroundMusic)) + .called(1); }, ); }); diff --git a/test/helpers/pump_app.dart b/test/helpers/pump_app.dart index a7d7ae67..45929978 100644 --- a/test/helpers/pump_app.dart +++ b/test/helpers/pump_app.dart @@ -24,12 +24,12 @@ class _MockGameBloc extends Mock implements GameBloc {} class _MockStartGameBloc extends Mock implements StartGameBloc {} -class _MockPinballAudio extends Mock implements PinballAudio {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} -PinballAudio _buildDefaultPinballAudio() { - final audio = _MockPinballAudio(); - when(audio.load).thenAnswer((_) => Future.value()); - return audio; +PinballPlayer _buildDefaultPinballPlayer() { + final player = _MockPinballPlayer(); + when(player.load).thenAnswer((_) => [Future.value()]); + return player; } AssetsManagerCubit _buildDefaultAssetsManagerCubit() { @@ -55,7 +55,7 @@ extension PumpApp on WidgetTester { AssetsManagerCubit? assetsManagerCubit, CharacterThemeCubit? characterThemeCubit, LeaderboardRepository? leaderboardRepository, - PinballAudio? pinballAudio, + PinballPlayer? pinballPlayer, }) { return runAsync(() { return pumpWidget( @@ -65,7 +65,7 @@ extension PumpApp on WidgetTester { value: leaderboardRepository ?? _MockLeaderboardRepository(), ), RepositoryProvider.value( - value: pinballAudio ?? _buildDefaultPinballAudio(), + value: pinballPlayer ?? _buildDefaultPinballPlayer(), ), ], child: MultiBlocProvider( diff --git a/test/helpers/test_games.dart b/test/helpers/test_games.dart index aa1ef777..6bb39e2d 100644 --- a/test/helpers/test_games.dart +++ b/test/helpers/test_games.dart @@ -11,7 +11,7 @@ import 'package:pinball/l10n/l10n.dart'; import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_theme/pinball_theme.dart'; -class _MockPinballAudio extends Mock implements PinballAudio {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} class _MockAppLocalizations extends Mock implements AppLocalizations {} @@ -24,12 +24,12 @@ class TestGame extends Forge2DGame with FlameBloc { class PinballTestGame extends PinballGame { PinballTestGame({ List? assets, - PinballAudio? audio, + PinballPlayer? player, CharacterTheme? theme, AppLocalizations? l10n, }) : _assets = assets, super( - audio: audio ?? _MockPinballAudio(), + player: player ?? _MockPinballPlayer(), characterTheme: theme ?? const DashTheme(), l10n: l10n ?? _MockAppLocalizations(), ); @@ -47,12 +47,12 @@ class PinballTestGame extends PinballGame { class DebugPinballTestGame extends DebugPinballGame { DebugPinballTestGame({ List? assets, - PinballAudio? audio, + PinballPlayer? player, CharacterTheme? theme, AppLocalizations? l10n, }) : _assets = assets, super( - audio: audio ?? _MockPinballAudio(), + player: player ?? _MockPinballPlayer(), characterTheme: theme ?? const DashTheme(), l10n: l10n ?? _MockAppLocalizations(), ); @@ -71,12 +71,12 @@ class DebugPinballTestGame extends DebugPinballGame { class EmptyPinballTestGame extends PinballTestGame { EmptyPinballTestGame({ List? assets, - PinballAudio? audio, + PinballPlayer? player, CharacterTheme? theme, AppLocalizations? l10n, }) : super( assets: assets, - audio: audio, + player: player, theme: theme, l10n: l10n ?? _MockAppLocalizations(), ); @@ -93,12 +93,12 @@ class EmptyKeyboardPinballTestGame extends PinballTestGame with HasKeyboardHandlerComponents { EmptyKeyboardPinballTestGame({ List? assets, - PinballAudio? audio, + PinballPlayer? player, CharacterTheme? theme, AppLocalizations? l10n, }) : super( assets: assets, - audio: audio, + player: player, theme: theme, l10n: l10n ?? _MockAppLocalizations(), ); diff --git a/test/start_game/widgets/start_game_listener_test.dart b/test/start_game/widgets/start_game_listener_test.dart index ca646bc9..566bb6f2 100644 --- a/test/start_game/widgets/start_game_listener_test.dart +++ b/test/start_game/widgets/start_game_listener_test.dart @@ -18,12 +18,12 @@ class _MockPinballGame extends Mock implements PinballGame {} class _MockGameFlowController extends Mock implements GameFlowController {} -class _MockPinballAudio extends Mock implements PinballAudio {} +class _MockPinballPlayer extends Mock implements PinballPlayer {} void main() { late StartGameBloc startGameBloc; late PinballGame pinballGame; - late PinballAudio pinballAudio; + late PinballPlayer pinballPlayer; late CharacterThemeCubit characterThemeCubit; group('StartGameListener', () { @@ -32,7 +32,7 @@ void main() { startGameBloc = _MockStartGameBloc(); pinballGame = _MockPinballGame(); - pinballAudio = _MockPinballAudio(); + pinballPlayer = _MockPinballPlayer(); characterThemeCubit = _MockCharacterThemeCubit(); }); @@ -244,7 +244,7 @@ void main() { child: const SizedBox.shrink(), ), startGameBloc: startGameBloc, - pinballAudio: pinballAudio, + pinballPlayer: pinballPlayer, ); await tester.pumpAndSettle(); @@ -261,7 +261,8 @@ void main() { ); await tester.pumpAndSettle(); - verify(pinballAudio.ioPinballVoiceOver).called(1); + verify(() => pinballPlayer.play(PinballAudio.ioPinballVoiceOver)) + .called(1); }, ); });