From 1759ce4efee6ef2fbfccc760c2550081ca03856e Mon Sep 17 00:00:00 2001 From: Allison Ryan Date: Fri, 8 Apr 2022 10:29:42 -0500 Subject: [PATCH] test: contact callback test --- .../controlled_sparky_computer.dart | 54 ++++++++++++------- .../controlled_sparky_computer_test.dart | 24 +++++++++ test/helpers/mocks.dart | 3 ++ 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/lib/game/components/controlled_sparky_computer.dart b/lib/game/components/controlled_sparky_computer.dart index 951aed55..699ebae2 100644 --- a/lib/game/components/controlled_sparky_computer.dart +++ b/lib/game/components/controlled_sparky_computer.dart @@ -1,5 +1,8 @@ +// ignore_for_file: avoid_renaming_method_parameters + import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; import 'package:pinball/flame/flame.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball_components/pinball_components.dart'; @@ -16,22 +19,40 @@ class ControlledSparkyComputer extends SparkyComputer @override void build(Forge2DGame _) { - addContactCallback(_SparkyTurboChargeSensorBallContactCallback()); - final sparkyTurboChargeSensor = _SparkyTurboChargeSensor() + addContactCallback(SparkyTurboChargeSensorBallContactCallback()); + final sparkyTurboChargeSensor = SparkyTurboChargeSensor() ..initialPosition = Vector2(-13, 49.8); add(sparkyTurboChargeSensor); super.build(_); } } -class _SparkyTurboChargeSensor extends BodyComponent with InitialPosition { - _SparkyTurboChargeSensor() { +/// {@template sparky_computer_controller} +/// Controller attached to a [SparkyComputer] that handles its game related +/// logic. +/// {@endtemplate} +// TODO(allisonryan0002): listen for turbo charge game bonus and animate Sparky. +class SparkyComputerController + extends ComponentController { + /// {@macro sparky_computer_controller} + SparkyComputerController(ControlledSparkyComputer controlledComputer) + : super(controlledComputer); +} + +/// {@template sparky_turbo_charge_sensor} +/// Small sensor body used to detect when a ball has entered the +/// [SparkyComputer] with the [SparkyTurboChargeSensorBallContactCallback]. +/// {@endtemplate} +@visibleForTesting +class SparkyTurboChargeSensor extends BodyComponent with InitialPosition { + /// {@macro sparky_turbo_charge_sensor} + SparkyTurboChargeSensor() { renderBody = false; } @override Body createBody() { - final shape = CircleShape()..radius = .1; + final shape = CircleShape()..radius = 0.1; final fixtureDef = FixtureDef(shape)..isSensor = true; @@ -43,25 +64,18 @@ class _SparkyTurboChargeSensor extends BodyComponent with InitialPosition { } } -/// {@template sparky_computer_controller} -/// Controller attached to a [SparkyComputer] that handles its game related -/// logic. +/// {@template sparky_turbo_charge_sensor_ball_contact_callback} +/// Turbo charges the [Ball] on contact with [SparkyTurboChargeSensor]. /// {@endtemplate} -// TODO(allisonryan0002): listen for turbo charge game bonus and animate Sparky. -class SparkyComputerController - extends ComponentController { - /// {@macro sparky_computer_controller} - SparkyComputerController(ControlledSparkyComputer controlledComputer) - : super(controlledComputer); -} - -class _SparkyTurboChargeSensorBallContactCallback - extends ContactCallback<_SparkyTurboChargeSensor, ControlledBall> { - _SparkyTurboChargeSensorBallContactCallback(); +@visibleForTesting +class SparkyTurboChargeSensorBallContactCallback + extends ContactCallback { + /// {@macro sparky_turbo_charge_sensor_ball_contact_callback} + SparkyTurboChargeSensorBallContactCallback(); @override void begin( - _SparkyTurboChargeSensor sparkyTurboChargeSensor, + SparkyTurboChargeSensor sparkyTurboChargeSensor, ControlledBall ball, _, ) { diff --git a/test/game/components/controlled_sparky_computer_test.dart b/test/game/components/controlled_sparky_computer_test.dart index bbd94c67..a3e13486 100644 --- a/test/game/components/controlled_sparky_computer_test.dart +++ b/test/game/components/controlled_sparky_computer_test.dart @@ -1,10 +1,17 @@ // ignore_for_file: cascade_invocations +import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/game.dart'; +import '../../helpers/helpers.dart'; + void main() { group('SparkyComputerController', () { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(EmptyPinballGameTest.new); + late ControlledSparkyComputer controlledSparkyComputer; setUp(() { @@ -17,5 +24,22 @@ void main() { isA(), ); }); + + flameTester.testGameWidget( + 'SparkyTurboChargeSensorBallContactCallback turbo charges the ball', + setUp: (game, tester) async { + final contackCallback = SparkyTurboChargeSensorBallContactCallback(); + final sparkyTurboChargeSensor = MockSparkyTurboChargeSensor(); + final ball = MockControlledBall(); + final controller = MockBallController(); + + when(() => ball.controller).thenReturn(controller); + when(controller.turboCharge).thenAnswer((_) async {}); + + contackCallback.begin(sparkyTurboChargeSensor, ball, MockContact()); + + verify(() => ball.controller.turboCharge()).called(1); + }, + ); }); } diff --git a/test/helpers/mocks.dart b/test/helpers/mocks.dart index 748b48f3..36a7a9e5 100644 --- a/test/helpers/mocks.dart +++ b/test/helpers/mocks.dart @@ -74,3 +74,6 @@ class MockComponentSet extends Mock implements ComponentSet {} class MockDashNestBumper extends Mock implements DashNestBumper {} class MockPinballAudio extends Mock implements PinballAudio {} + +class MockSparkyTurboChargeSensor extends Mock + implements SparkyTurboChargeSensor {}