From 69ba18ea3d31c25cd1a87084c84894edb2cfcdd1 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Fri, 29 Apr 2022 22:44:14 +0200 Subject: [PATCH] fix: fixed bloc bug for tests on multiplier behavior --- .../behaviors/multipliers_behavior.dart | 30 +++-- .../behaviors/multipliers_behavior_test.dart | 111 ++++++++++++------ 2 files changed, 88 insertions(+), 53 deletions(-) diff --git a/lib/game/components/multipliers/behaviors/multipliers_behavior.dart b/lib/game/components/multipliers/behaviors/multipliers_behavior.dart index 5266e58f..33a59a08 100644 --- a/lib/game/components/multipliers/behaviors/multipliers_behavior.dart +++ b/lib/game/components/multipliers/behaviors/multipliers_behavior.dart @@ -1,27 +1,25 @@ import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// Toggle each [Multiplier] when GameState.multiplier changes. class MultipliersBehavior extends Component - with HasGameRef, ParentIsA { + with + HasGameRef, + ParentIsA, + BlocComponent { @override - void onMount() { - super.onMount(); - - var previousMultiplier = 1; - - // TODO(ruimiguel): filter only when multiplier has change. - gameRef.read().stream.listen((state) { - if (state.multiplier != previousMultiplier) { - previousMultiplier = state.multiplier; + bool listenWhen(GameState? previousState, GameState newState) { + return previousState?.multiplier != newState.multiplier; + } - final multipliers = parent.children.whereType(); - for (final multiplier in multipliers) { - multiplier.bloc.next(state.multiplier); - } - } - }); + @override + void onNewState(GameState state) { + final multipliers = parent.children.whereType(); + for (final multiplier in multipliers) { + multiplier.bloc.next(state.multiplier); + } } } diff --git a/test/game/components/multipliers/behaviors/multipliers_behavior_test.dart b/test/game/components/multipliers/behaviors/multipliers_behavior_test.dart index 84cc6590..288165ee 100644 --- a/test/game/components/multipliers/behaviors/multipliers_behavior_test.dart +++ b/test/game/components/multipliers/behaviors/multipliers_behavior_test.dart @@ -46,49 +46,86 @@ void main() { assets: assets, ); - flameBlocTester.testGameWidget( - "calls 'next' once per each multiplier when GameBloc emit state", - setUp: (game, tester) async { - final multiplierCubit = MockMultiplierCubit(); - final behavior = MultipliersBehavior(); - final parent = Multipliers.test(); - final multipliers = [ - Multiplier.test( - value: MultiplierValue.x2, - bloc: multiplierCubit, - ), - ]; - - whenListen( - multiplierCubit, - const Stream.empty(), - initialState: MultiplierState( - value: MultiplierValue.x2, - spriteState: MultiplierSpriteState.dimmed, - ), + group('listenWhen', () { + test('is true when the multiplier has changed', () { + final state = GameState( + score: 10, + multiplier: 2, + rounds: 0, + bonusHistory: const [], ); - final streamController = StreamController(); - whenListen( - gameBloc, - streamController.stream, - initialState: GameState.initial(), + final previous = GameState.initial(); + expect( + MultipliersBehavior().listenWhen(previous, state), + isTrue, ); + }); - await parent.addAll(multipliers); - await game.ensureAdd(parent); - await parent.ensureAdd(behavior); + test('is false when the multiplier state is the same', () { + final state = GameState( + score: 10, + multiplier: 1, + rounds: 0, + bonusHistory: const [], + ); - streamController.add(GameState.initial().copyWith(multiplier: 2)); + final previous = GameState.initial(); + expect( + MultipliersBehavior().listenWhen(previous, state), + isFalse, + ); + }); - await tester.pump(); + flameBlocTester.testGameWidget( + "calls 'next' once per each multiplier when GameBloc emit state", + setUp: (game, tester) async { + final behavior = MultipliersBehavior(); + final parent = Multipliers.test(); + final multiplierX2Cubit = MockMultiplierCubit(); + final multiplierX3Cubit = MockMultiplierCubit(); + final multipliers = [ + Multiplier.test( + value: MultiplierValue.x2, + bloc: multiplierX2Cubit, + ), + Multiplier.test( + value: MultiplierValue.x3, + bloc: multiplierX3Cubit, + ), + ]; - for (final multiplier in multipliers) { - verify( - () => multiplier.bloc.next(any()), - ).called(1); - } - }, - ); + whenListen( + multiplierX2Cubit, + const Stream.empty(), + initialState: MultiplierState.initial(MultiplierValue.x2), + ); + when(() => multiplierX2Cubit.next(any())).thenAnswer((_) async {}); + + whenListen( + multiplierX3Cubit, + const Stream.empty(), + initialState: MultiplierState.initial(MultiplierValue.x2), + ); + when(() => multiplierX3Cubit.next(any())).thenAnswer((_) async {}); + + await parent.addAll(multipliers); + await game.ensureAdd(parent); + await parent.ensureAdd(behavior); + + await tester.pump(); + + behavior.onNewState( + GameState.initial().copyWith(multiplier: 2), + ); + + for (final multiplier in multipliers) { + verify( + () => multiplier.bloc.next(any()), + ).called(1); + } + }, + ); + }); }); }