From fbf9b39ee312e5248a33ff368b099bb5cab31499 Mon Sep 17 00:00:00 2001 From: alestiago Date: Wed, 2 Mar 2022 17:27:01 +0000 Subject: [PATCH] feat: implemented ScorePoints mixin --- lib/game/components/ball.dart | 5 +- lib/game/components/components.dart | 1 + lib/game/components/score_points.dart | 22 ++++++++ test/game/components/score_points_test.dart | 60 +++++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 lib/game/components/score_points.dart create mode 100644 test/game/components/score_points_test.dart diff --git a/lib/game/components/ball.dart b/lib/game/components/ball.dart index ce2e4335..8ff24094 100644 --- a/lib/game/components/ball.dart +++ b/lib/game/components/ball.dart @@ -1,8 +1,11 @@ +import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/body_component.dart'; import 'package:flutter/material.dart'; import 'package:forge2d/forge2d.dart'; +import 'package:pinball/game/game.dart'; -class Ball extends BodyComponent { +class Ball extends BodyComponent + with BlocComponent { Ball({ required Vector2 position, }) : _position = position { diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart index 6a26208c..e3d2c6ce 100644 --- a/lib/game/components/components.dart +++ b/lib/game/components/components.dart @@ -1 +1,2 @@ export 'ball.dart'; +export 'score_points.dart'; diff --git a/lib/game/components/score_points.dart b/lib/game/components/score_points.dart new file mode 100644 index 00000000..c29094c8 --- /dev/null +++ b/lib/game/components/score_points.dart @@ -0,0 +1,22 @@ +// ignore_for_file: avoid_renaming_method_parameters + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball/game/game.dart'; + +mixin ScorePoints { + int get points; +} + +class BallHasScoreCallback extends ContactCallback { + @override + void begin( + Ball ball, + ScorePoints hasPoints, + Contact _, + ) { + ball.gameRef.read().add(Scored(points: hasPoints.points)); + } + + @override + void end(Ball _, ScorePoints __, Contact ___) {} +} diff --git a/test/game/components/score_points_test.dart b/test/game/components/score_points_test.dart new file mode 100644 index 00000000..b51a33b9 --- /dev/null +++ b/test/game/components/score_points_test.dart @@ -0,0 +1,60 @@ +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball/game/game.dart'; + +class MockHasScore extends Mock with ScorePoints {} + +class MockBall extends Mock implements Ball {} + +class MockGameBloc extends Mock implements GameBloc {} + +class MockPinballGame extends Mock implements PinballGame {} + +class FakeContact extends Fake implements Contact {} + +void main() { + group('BallHasScoreCallback', () { + late MockPinballGame game; + late MockGameBloc bloc; + late MockBall ball; + late MockHasScore hasScore; + + setUp(() { + game = MockPinballGame(); + bloc = MockGameBloc(); + ball = MockBall(); + hasScore = MockHasScore(); + }); + + group('begin', () { + test( + 'emits Scored event with points', + () { + const points = 2; + + when(() => ball.gameRef).thenReturn(game); + when(game.read).thenReturn(bloc); + when(() => hasScore.points).thenReturn(points); + + BallHasScoreCallback().begin( + ball, + hasScore, + FakeContact(), + ); + + verify( + () => bloc.add(const Scored(points: points)), + ).called(1); + }, + ); + }); + + group('end', () { + test('does nothing', () { + // TODO(alestiago): Write test. + }); + }); + }); +}