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
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
part 'multiball_state.dart';
class MultiballCubit extends Cubit<MultiballState> {
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;
}
}
}

@ -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<Object> get props => [lightState, animationState];
}

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