From 46adba5cb5ea28a9a475feef52f46cd98706c794 Mon Sep 17 00:00:00 2001 From: alestiago Date: Mon, 2 May 2022 22:09:12 +0100 Subject: [PATCH] refactor: defined isFullyProgressed method --- .../flutter_forest_bonus_behavior.dart | 2 +- .../signpost/cubit/signpost_cubit.dart | 2 + .../signpost/cubit/signpost_state.dart | 4 -- .../lib/src/components/signpost/signpost.dart | 6 +++ .../signpost/cubit/signpost_cubit_test.dart | 39 +++++++++++++++++++ .../components/signpost/signpost_test.dart | 21 ++++++++++ 6 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 packages/pinball_components/test/src/components/signpost/cubit/signpost_cubit_test.dart diff --git a/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart b/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart index 3f8f5b6d..a585ada9 100644 --- a/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart +++ b/lib/game/components/flutter_forest/behaviors/flutter_forest_bonus_behavior.dart @@ -31,7 +31,7 @@ class FlutterForestBonusBehavior extends Component bumper.bloc.onReset(); } - if (signpost.bloc.state.isFullyLit()) { + if (signpost.bloc.isFullyProgressed()) { gameRef .read() .add(const BonusActivated(GameBonus.dashNest)); diff --git a/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart index 41c614ea..f94feebe 100644 --- a/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart +++ b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_cubit.dart @@ -13,4 +13,6 @@ class SignpostCubit extends Cubit { SignpostState.values[(index + 1) % SignpostState.values.length], ); } + + bool isFullyProgressed() => state == SignpostState.active3; } diff --git a/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart index 6537f2bd..0141ae06 100644 --- a/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart +++ b/packages/pinball_components/lib/src/components/signpost/cubit/signpost_state.dart @@ -15,7 +15,3 @@ enum SignpostState { /// Signpost with all signs of lit up dashes. active3, } - -extension SignpostX on SignpostState { - bool isFullyLit() => this == SignpostState.active3; -} diff --git a/packages/pinball_components/lib/src/components/signpost/signpost.dart b/packages/pinball_components/lib/src/components/signpost/signpost.dart index e2aca547..68b4ad60 100644 --- a/packages/pinball_components/lib/src/components/signpost/signpost.dart +++ b/packages/pinball_components/lib/src/components/signpost/signpost.dart @@ -48,6 +48,12 @@ class Signpost extends BodyComponent with InitialPosition { // ignore: public_member_api_docs final SignpostCubit bloc; + @override + void onRemove() { + bloc.close(); + super.onRemove(); + } + @override Body createBody() { final shape = CircleShape()..radius = 0.25; diff --git a/packages/pinball_components/test/src/components/signpost/cubit/signpost_cubit_test.dart b/packages/pinball_components/test/src/components/signpost/cubit/signpost_cubit_test.dart new file mode 100644 index 00000000..081beab2 --- /dev/null +++ b/packages/pinball_components/test/src/components/signpost/cubit/signpost_cubit_test.dart @@ -0,0 +1,39 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; + +void main() { + group('SignpostCubit', () { + blocTest( + 'onProgressed progresses', + build: SignpostCubit.new, + act: (bloc) { + bloc + ..onProgressed() + ..onProgressed() + ..onProgressed() + ..onProgressed(); + }, + expect: () => [ + SignpostState.active1, + SignpostState.active2, + SignpostState.active3, + SignpostState.inactive, + ], + ); + + test('isFullyProgressed when on active3', () { + final bloc = SignpostCubit(); + expect(bloc.isFullyProgressed(), isFalse); + + bloc.onProgressed(); + expect(bloc.isFullyProgressed(), isFalse); + + bloc.onProgressed(); + expect(bloc.isFullyProgressed(), isFalse); + + bloc.onProgressed(); + expect(bloc.isFullyProgressed(), isTrue); + }); + }); +} diff --git a/packages/pinball_components/test/src/components/signpost/signpost_test.dart b/packages/pinball_components/test/src/components/signpost/signpost_test.dart index 492e4545..6aecd0bd 100644 --- a/packages/pinball_components/test/src/components/signpost/signpost_test.dart +++ b/packages/pinball_components/test/src/components/signpost/signpost_test.dart @@ -1,12 +1,16 @@ // ignore_for_file: cascade_invocations +import 'package:bloc_test/bloc_test.dart'; import 'package:flame/components.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; import '../../../helpers/helpers.dart'; +class _MockSignpostCubit extends Mock implements SignpostCubit {} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ @@ -140,5 +144,22 @@ void main() { await game.ensureAdd(signpost); expect(signpost.children, contains(component)); }); + + flameTester.test('closes bloc when removed', (game) async { + final bloc = _MockSignpostCubit(); + whenListen( + bloc, + const Stream.empty(), + initialState: SignpostState.inactive, + ); + when(bloc.close).thenAnswer((_) async {}); + final component = Signpost.test(bloc: bloc); + + await game.ensureAdd(component); + game.remove(component); + await game.ready(); + + verify(bloc.close).called(1); + }); }); }