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
/// [MultiballLightState.dimmed].
/// {@endtemplate}
class MultiballBlinkingBehavior extends Component with ParentIsA<Multiball> {
class MultiballBlinkingBehavior extends TimerComponent
with ParentIsA<Multiball> {
/// {@macro multiball_blinking_behavior}
MultiballBlinkingBehavior() : super();
MultiballBlinkingBehavior() : super(period: 0.01);
final _maxBlinks = 10;
int _blinksCounter = 0;
bool _isAnimating = false;
void _onNewState(MultiballState state) {
if (state.animationState == MultiballAnimationState.animated) {
final animationEnabled =
state.animationState == MultiballAnimationState.animated;
final canBlink = _blinksCounter < _maxBlinks;
if (animationEnabled && canBlink) {
_animate();
} else {
_stop();
@ -24,28 +29,36 @@ class MultiballBlinkingBehavior extends Component with ParentIsA<Multiball> {
Future<void> _animate() async {
if (!_isAnimating) {
_isAnimating = true;
for (var i = 0; i < _maxBlinks; i++) {
parent.bloc.onBlink();
await Future<void>.delayed(
const Duration(milliseconds: 100),
);
parent.bloc.onBlink();
await Future<void>.delayed(
const Duration(milliseconds: 100),
);
}
_stop();
_blinksCounter++;
}
}
void _stop() {
if (_isAnimating) {
_isAnimating = false;
timer.stop();
_blinksCounter = 0;
parent.bloc.onStop();
}
}
@override
Future<void> onLoad() async {
await super.onLoad();
timer.stop();
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);
},
);
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