refactor: blinking behavior to TimerComponent and test coverage

pull/235/head
RuiAlonso 3 years ago
parent 1c1cf96b94
commit 7b9f2a3c85

@ -6,15 +6,20 @@ import 'package:pinball_flame/pinball_flame.dart';
/// Makes a [Multiball] blink back to [MultiballLightState.lit] when /// Makes a [Multiball] blink back to [MultiballLightState.lit] when
/// [MultiballLightState.dimmed]. /// [MultiballLightState.dimmed].
/// {@endtemplate} /// {@endtemplate}
class MultiballBlinkingBehavior extends Component with ParentIsA<Multiball> { class MultiballBlinkingBehavior extends TimerComponent
with ParentIsA<Multiball> {
/// {@macro multiball_blinking_behavior} /// {@macro multiball_blinking_behavior}
MultiballBlinkingBehavior() : super(); MultiballBlinkingBehavior() : super(period: 0.01);
final _maxBlinks = 10; final _maxBlinks = 10;
int _blinksCounter = 0;
bool _isAnimating = false; bool _isAnimating = false;
void _onNewState(MultiballState state) { void _onNewState(MultiballState state) {
if (state.animationState == MultiballAnimationState.animated) { final animationEnabled =
state.animationState == MultiballAnimationState.animated;
final canBlink = _blinksCounter < _maxBlinks;
if (animationEnabled && canBlink) {
_animate(); _animate();
} else { } else {
_stop(); _stop();
@ -24,28 +29,36 @@ class MultiballBlinkingBehavior extends Component with ParentIsA<Multiball> {
Future<void> _animate() async { Future<void> _animate() async {
if (!_isAnimating) { if (!_isAnimating) {
_isAnimating = true; _isAnimating = true;
for (var i = 0; i < _maxBlinks; i++) { parent.bloc.onBlink();
parent.bloc.onBlink(); _blinksCounter++;
await Future<void>.delayed(
const Duration(milliseconds: 100),
);
parent.bloc.onBlink();
await Future<void>.delayed(
const Duration(milliseconds: 100),
);
}
_stop();
} }
} }
void _stop() { void _stop() {
_isAnimating = false; if (_isAnimating) {
parent.bloc.onStop(); _isAnimating = false;
timer.stop();
_blinksCounter = 0;
parent.bloc.onStop();
}
} }
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
timer.stop();
parent.bloc.stream.listen(_onNewState); parent.bloc.stream.listen(_onNewState);
} }
@override
void onTick() {
super.onTick();
if (_isAnimating) {
timer
..reset()
..start();
} else {
timer.stop();
}
}
} }

@ -86,37 +86,6 @@ void main() {
verify(bloc.onStop).called(1); verify(bloc.onStop).called(1);
}, },
); );
flameTester.testGameWidget(
'stops animation after 2 seconds',
setUp: (game, tester) async {
final behavior = MultiballBlinkingBehavior();
final bloc = MockMultiballCubit();
final streamController = StreamController<MultiballState>();
whenListen(
bloc,
streamController.stream,
initialState: MultiballState.initial(),
);
when(bloc.onBlink).thenAnswer((_) async {});
final multiball = Multiball.test(bloc: bloc);
await multiball.add(behavior);
await game.ensureAdd(multiball);
streamController.add(
MultiballState(
animationState: MultiballAnimationState.animated,
lightState: MultiballLightState.lit,
),
);
await tester.pump();
game.update(2);
await streamController.close();
verify(bloc.onStop).called(1);
},
);
}, },
); );
} }

Loading…
Cancel
Save