refactor: changed multiball cubit and state

pull/235/head
RuiAlonso 3 years ago
parent e989f87978
commit 4bb2f25617

@ -1,17 +1,37 @@
// ignore_for_file: public_member_api_docs // ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart'; import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
part 'multiball_state.dart'; part 'multiball_state.dart';
class MultiballCubit extends Cubit<MultiballState> { class MultiballCubit extends Cubit<MultiballState> {
MultiballCubit() : super(MultiballState.dimmed); MultiballCubit() : super(MultiballState.initial());
void animate() { void onAnimate() {
emit(MultiballState.lit); emit(
state.copyWith(animationState: MultiballAnimationState.animated),
);
} }
void onBlinked() { void onStop() {
emit(MultiballState.dimmed); 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;
}
} }
} }

@ -3,7 +3,42 @@
part of 'multiball_cubit.dart'; part of 'multiball_cubit.dart';
/// Indicates the different sprite states for [MultiballSpriteGroupComponent]. /// Indicates the different sprite states for [MultiballSpriteGroupComponent].
enum MultiballState { enum MultiballLightState {
lit, lit,
dimmed, 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<Object> get props => [lightState, animationState];
}

@ -7,17 +7,60 @@ void main() {
'MultiballCubit', 'MultiballCubit',
() { () {
blocTest<MultiballCubit, MultiballState>( blocTest<MultiballCubit, MultiballState>(
'animate emits lit', 'onAnimate emits animationState [animate]',
build: MultiballCubit.new, build: MultiballCubit.new,
act: (bloc) => bloc.animate(), act: (bloc) => bloc.onAnimate(),
expect: () => [MultiballState.lit], expect: () => [
isA<MultiballState>()
..having(
(state) => state.animationState,
'animationState',
MultiballAnimationState.animated,
)
],
); );
blocTest<MultiballCubit, MultiballState>( blocTest<MultiballCubit, MultiballState>(
'onBlinked emits dimmed', 'onStop emits animationState [stopped]',
build: MultiballCubit.new, build: MultiballCubit.new,
act: (bloc) => bloc.onBlinked(), act: (bloc) => bloc.onStop(),
expect: () => [MultiballState.dimmed], expect: () => [
isA<MultiballState>()
..having(
(state) => state.animationState,
'animationState',
MultiballAnimationState.stopped,
)
],
);
blocTest<MultiballCubit, MultiballState>(
'onBlink emits lightState [lit, dimmed, lit]',
build: MultiballCubit.new,
act: (bloc) => bloc
..onBlink()
..onBlink()
..onBlink(),
expect: () => [
isA<MultiballState>()
..having(
(state) => state.lightState,
'lightState',
MultiballLightState.lit,
),
isA<MultiballState>()
..having(
(state) => state.lightState,
'lightState',
MultiballLightState.dimmed,
),
isA<MultiballState>()
..having(
(state) => state.lightState,
'lightState',
MultiballLightState.lit,
)
],
); );
}, },
); );

@ -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),
);
},
);
});
});
}
Loading…
Cancel
Save