From 4bb2f25617aa69c57785dc270c43dfee735506cf Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Fri, 29 Apr 2022 10:09:37 +0200 Subject: [PATCH] refactor: changed multiball cubit and state --- .../multiball/cubit/multiball_cubit.dart | 30 ++++++-- .../multiball/cubit/multiball_state.dart | 37 ++++++++- .../multiball/cubit/multiball_cubit_test.dart | 55 ++++++++++++-- .../multiball/cubit/multiball_state_test.dart | 76 +++++++++++++++++++ 4 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 packages/pinball_components/test/src/components/multiball/cubit/multiball_state_test.dart diff --git a/packages/pinball_components/lib/src/components/multiball/cubit/multiball_cubit.dart b/packages/pinball_components/lib/src/components/multiball/cubit/multiball_cubit.dart index 1fe37044..ceb2271f 100644 --- a/packages/pinball_components/lib/src/components/multiball/cubit/multiball_cubit.dart +++ b/packages/pinball_components/lib/src/components/multiball/cubit/multiball_cubit.dart @@ -1,17 +1,37 @@ // ignore_for_file: public_member_api_docs import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; part 'multiball_state.dart'; class MultiballCubit extends Cubit { - MultiballCubit() : super(MultiballState.dimmed); + MultiballCubit() : super(MultiballState.initial()); - void animate() { - emit(MultiballState.lit); + void onAnimate() { + emit( + state.copyWith(animationState: MultiballAnimationState.animated), + ); } - void onBlinked() { - emit(MultiballState.dimmed); + void onStop() { + emit( + state.copyWith(animationState: MultiballAnimationState.stopped), + ); + } + + void onBlink() { + switch (state.lightState) { + case MultiballLightState.lit: + emit( + state.copyWith(lightState: MultiballLightState.dimmed), + ); + break; + case MultiballLightState.dimmed: + emit( + state.copyWith(lightState: MultiballLightState.lit), + ); + break; + } } } diff --git a/packages/pinball_components/lib/src/components/multiball/cubit/multiball_state.dart b/packages/pinball_components/lib/src/components/multiball/cubit/multiball_state.dart index 44b8bb80..b4ab65ef 100644 --- a/packages/pinball_components/lib/src/components/multiball/cubit/multiball_state.dart +++ b/packages/pinball_components/lib/src/components/multiball/cubit/multiball_state.dart @@ -3,7 +3,42 @@ part of 'multiball_cubit.dart'; /// Indicates the different sprite states for [MultiballSpriteGroupComponent]. -enum MultiballState { +enum MultiballLightState { lit, dimmed, } + +// Indicates if the blinking animation is running. +enum MultiballAnimationState { + stopped, + animated, +} + +class MultiballState extends Equatable { + MultiballState({ + required this.lightState, + required this.animationState, + }); + + MultiballState.initial() + : this( + lightState: MultiballLightState.dimmed, + animationState: MultiballAnimationState.stopped, + ); + + final MultiballLightState lightState; + final MultiballAnimationState animationState; + + MultiballState copyWith({ + MultiballLightState? lightState, + MultiballAnimationState? animationState, + }) { + return MultiballState( + lightState: lightState ?? this.lightState, + animationState: animationState ?? this.animationState, + ); + } + + @override + List get props => [lightState, animationState]; +} diff --git a/packages/pinball_components/test/src/components/multiball/cubit/multiball_cubit_test.dart b/packages/pinball_components/test/src/components/multiball/cubit/multiball_cubit_test.dart index dbb75abd..1d7f4a12 100644 --- a/packages/pinball_components/test/src/components/multiball/cubit/multiball_cubit_test.dart +++ b/packages/pinball_components/test/src/components/multiball/cubit/multiball_cubit_test.dart @@ -7,17 +7,60 @@ void main() { 'MultiballCubit', () { blocTest( - 'animate emits lit', + 'onAnimate emits animationState [animate]', build: MultiballCubit.new, - act: (bloc) => bloc.animate(), - expect: () => [MultiballState.lit], + act: (bloc) => bloc.onAnimate(), + expect: () => [ + isA() + ..having( + (state) => state.animationState, + 'animationState', + MultiballAnimationState.animated, + ) + ], ); blocTest( - 'onBlinked emits dimmed', + 'onStop emits animationState [stopped]', build: MultiballCubit.new, - act: (bloc) => bloc.onBlinked(), - expect: () => [MultiballState.dimmed], + act: (bloc) => bloc.onStop(), + expect: () => [ + isA() + ..having( + (state) => state.animationState, + 'animationState', + MultiballAnimationState.stopped, + ) + ], + ); + + blocTest( + 'onBlink emits lightState [lit, dimmed, lit]', + build: MultiballCubit.new, + act: (bloc) => bloc + ..onBlink() + ..onBlink() + ..onBlink(), + expect: () => [ + isA() + ..having( + (state) => state.lightState, + 'lightState', + MultiballLightState.lit, + ), + isA() + ..having( + (state) => state.lightState, + 'lightState', + MultiballLightState.dimmed, + ), + isA() + ..having( + (state) => state.lightState, + 'lightState', + MultiballLightState.lit, + ) + ], ); }, ); diff --git a/packages/pinball_components/test/src/components/multiball/cubit/multiball_state_test.dart b/packages/pinball_components/test/src/components/multiball/cubit/multiball_state_test.dart new file mode 100644 index 00000000..9f706337 --- /dev/null +++ b/packages/pinball_components/test/src/components/multiball/cubit/multiball_state_test.dart @@ -0,0 +1,76 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/src/pinball_components.dart'; + +void main() { + group('MultiballState', () { + test('supports value equality', () { + expect( + MultiballState( + animationState: MultiballAnimationState.stopped, + lightState: MultiballLightState.dimmed, + ), + equals( + MultiballState( + animationState: MultiballAnimationState.stopped, + lightState: MultiballLightState.dimmed, + ), + ), + ); + }); + + group('constructor', () { + test('can be instantiated', () { + expect( + MultiballState( + animationState: MultiballAnimationState.stopped, + lightState: MultiballLightState.dimmed, + ), + isNotNull, + ); + }); + }); + + group('copyWith', () { + test( + 'copies correctly ' + 'when no argument specified', + () { + final multiballState = MultiballState( + animationState: MultiballAnimationState.stopped, + lightState: MultiballLightState.dimmed, + ); + expect( + multiballState.copyWith(), + equals(multiballState), + ); + }, + ); + + test( + 'copies correctly ' + 'when all arguments specified', + () { + final multiballState = MultiballState( + animationState: MultiballAnimationState.stopped, + lightState: MultiballLightState.dimmed, + ); + final otherMultiballState = MultiballState( + animationState: MultiballAnimationState.animated, + lightState: MultiballLightState.lit, + ); + expect(multiballState, isNot(equals(otherMultiballState))); + + expect( + multiballState.copyWith( + animationState: MultiballAnimationState.animated, + lightState: MultiballLightState.lit, + ), + equals(otherMultiballState), + ); + }, + ); + }); + }); +}