fix: fixed bloc bug for tests on multiplier behavior

pull/231/head
RuiAlonso 3 years ago
parent 4cc334a90c
commit 69ba18ea3d

@ -1,27 +1,25 @@
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_bloc/flame_bloc.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.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';
/// Toggle each [Multiplier] when GameState.multiplier changes. /// Toggle each [Multiplier] when GameState.multiplier changes.
class MultipliersBehavior extends Component class MultipliersBehavior extends Component
with HasGameRef<PinballGame>, ParentIsA<Multipliers> { with
HasGameRef<PinballGame>,
ParentIsA<Multipliers>,
BlocComponent<GameBloc, GameState> {
@override @override
void onMount() { bool listenWhen(GameState? previousState, GameState newState) {
super.onMount(); return previousState?.multiplier != newState.multiplier;
}
var previousMultiplier = 1;
// TODO(ruimiguel): filter only when multiplier has change.
gameRef.read<GameBloc>().stream.listen((state) {
if (state.multiplier != previousMultiplier) {
previousMultiplier = state.multiplier;
@override
void onNewState(GameState state) {
final multipliers = parent.children.whereType<Multiplier>(); final multipliers = parent.children.whereType<Multiplier>();
for (final multiplier in multipliers) { for (final multiplier in multipliers) {
multiplier.bloc.next(state.multiplier); multiplier.bloc.next(state.multiplier);
} }
} }
});
}
} }

@ -46,43 +46,79 @@ void main() {
assets: assets, assets: assets,
); );
group('listenWhen', () {
test('is true when the multiplier has changed', () {
final state = GameState(
score: 10,
multiplier: 2,
rounds: 0,
bonusHistory: const [],
);
final previous = GameState.initial();
expect(
MultipliersBehavior().listenWhen(previous, state),
isTrue,
);
});
test('is false when the multiplier state is the same', () {
final state = GameState(
score: 10,
multiplier: 1,
rounds: 0,
bonusHistory: const [],
);
final previous = GameState.initial();
expect(
MultipliersBehavior().listenWhen(previous, state),
isFalse,
);
});
flameBlocTester.testGameWidget( flameBlocTester.testGameWidget(
"calls 'next' once per each multiplier when GameBloc emit state", "calls 'next' once per each multiplier when GameBloc emit state",
setUp: (game, tester) async { setUp: (game, tester) async {
final multiplierCubit = MockMultiplierCubit();
final behavior = MultipliersBehavior(); final behavior = MultipliersBehavior();
final parent = Multipliers.test(); final parent = Multipliers.test();
final multiplierX2Cubit = MockMultiplierCubit();
final multiplierX3Cubit = MockMultiplierCubit();
final multipliers = [ final multipliers = [
Multiplier.test( Multiplier.test(
value: MultiplierValue.x2, value: MultiplierValue.x2,
bloc: multiplierCubit, bloc: multiplierX2Cubit,
),
Multiplier.test(
value: MultiplierValue.x3,
bloc: multiplierX3Cubit,
), ),
]; ];
whenListen( whenListen(
multiplierCubit, multiplierX2Cubit,
const Stream<MultiplierState>.empty(), const Stream<MultiplierState>.empty(),
initialState: MultiplierState( initialState: MultiplierState.initial(MultiplierValue.x2),
value: MultiplierValue.x2,
spriteState: MultiplierSpriteState.dimmed,
),
); );
when(() => multiplierX2Cubit.next(any())).thenAnswer((_) async {});
final streamController = StreamController<GameState>();
whenListen( whenListen(
gameBloc, multiplierX3Cubit,
streamController.stream, const Stream<MultiplierState>.empty(),
initialState: GameState.initial(), initialState: MultiplierState.initial(MultiplierValue.x2),
); );
when(() => multiplierX3Cubit.next(any())).thenAnswer((_) async {});
await parent.addAll(multipliers); await parent.addAll(multipliers);
await game.ensureAdd(parent); await game.ensureAdd(parent);
await parent.ensureAdd(behavior); await parent.ensureAdd(behavior);
streamController.add(GameState.initial().copyWith(multiplier: 2));
await tester.pump(); await tester.pump();
behavior.onNewState(
GameState.initial().copyWith(multiplier: 2),
);
for (final multiplier in multipliers) { for (final multiplier in multipliers) {
verify( verify(
() => multiplier.bloc.next(any()), () => multiplier.bloc.next(any()),
@ -91,4 +127,5 @@ void main() {
}, },
); );
}); });
});
} }

Loading…
Cancel
Save