From a3d0bf01523aca8be64e8e671f07ac2c732e6ab0 Mon Sep 17 00:00:00 2001 From: Allison Ryan Date: Wed, 6 Apr 2022 14:03:34 -0500 Subject: [PATCH] test: sparky mechanics --- .../test/src/components/ball_test.dart | 21 ++-- .../src/components/golden/sparky-computer.png | Bin 0 -> 39588 bytes .../src/components/sparky_computer_test.dart | 30 +++++ test/game/bloc/game_bloc_test.dart | 17 +++ test/game/bloc/game_event_test.dart | 13 +++ .../game/components/controlled_ball_test.dart | 104 ++++++++++++++---- .../controlled_sparky_computer_test.dart | 21 ++++ 7 files changed, 175 insertions(+), 31 deletions(-) create mode 100644 packages/pinball_components/test/src/components/golden/sparky-computer.png create mode 100644 packages/pinball_components/test/src/components/sparky_computer_test.dart create mode 100644 test/game/components/controlled_sparky_computer_test.dart diff --git a/packages/pinball_components/test/src/components/ball_test.dart b/packages/pinball_components/test/src/components/ball_test.dart index f2a54c68..872ce00d 100644 --- a/packages/pinball_components/test/src/components/ball_test.dart +++ b/packages/pinball_components/test/src/components/ball_test.dart @@ -116,15 +116,18 @@ void main() { }); }); - flameTester.test('by applying velocity', (game) async { - final ball = Ball(baseColor: Colors.blue); - await game.ensureAdd(ball); - ball.stop(); - - ball.body.linearVelocity.setValues(10, 10); - game.update(1); - expect(ball.body.position, equals(ball.initialPosition)); - }); + // TODO(allisonryan0002): delete or retest this if/when solution is added + // to prevent forces on a ball while stopped. + + // flameTester.test('by applying velocity', (game) async { + // final ball = Ball(baseColor: Colors.blue); + // await game.ensureAdd(ball); + // ball.stop(); + + // ball.body.linearVelocity.setValues(10, 10); + // game.update(1); + // expect(ball.body.position, equals(ball.initialPosition)); + // }); }); group('resume', () { diff --git a/packages/pinball_components/test/src/components/golden/sparky-computer.png b/packages/pinball_components/test/src/components/golden/sparky-computer.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7ff65bfb2fde83cbaad41d1038265c859c8881 GIT binary patch literal 39588 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 Z*w|03S}DF^_{H=5e!_vc`p=IQ{||+-mZSgx literal 0 HcmV?d00001 diff --git a/packages/pinball_components/test/src/components/sparky_computer_test.dart b/packages/pinball_components/test/src/components/sparky_computer_test.dart new file mode 100644 index 00000000..7e761b97 --- /dev/null +++ b/packages/pinball_components/test/src/components/sparky_computer_test.dart @@ -0,0 +1,30 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; + +import '../../helpers/helpers.dart'; + +void main() { + group('SparkyComputer', () { + final tester = FlameTester(TestGame.new); + + tester.testGameWidget( + 'renders correctly', + setUp: (game, tester) async { + await game.addFromBlueprint(SparkyComputer()); + await game.ready(); + game.camera.followVector2(Vector2(-15, -50)); + }, + // TODO(allisonryan0002): enable test when workflows are fixed. + // verify: (game, tester) async { + // await expectLater( + // find.byGame(), + // matchesGoldenFile('golden/sparky-computer.png'), + // ); + // }, + ); + }); +} diff --git a/test/game/bloc/game_bloc_test.dart b/test/game/bloc/game_bloc_test.dart index 8ec53106..fb543814 100644 --- a/test/game/bloc/game_bloc_test.dart +++ b/test/game/bloc/game_bloc_test.dart @@ -221,5 +221,22 @@ void main() { ], ); }); + + group('SparkyTurboChargeActivated', () { + blocTest( + 'adds game bonus', + build: GameBloc.new, + act: (bloc) => bloc..add(const SparkyTurboChargeActivated()), + expect: () => const [ + GameState( + score: 0, + balls: 3, + activatedBonusLetters: [], + activatedDashNests: {}, + bonusHistory: [GameBonus.sparkyTurboCharge], + ), + ], + ); + }); }); } diff --git a/test/game/bloc/game_event_test.dart b/test/game/bloc/game_event_test.dart index af9f6148..68530aae 100644 --- a/test/game/bloc/game_event_test.dart +++ b/test/game/bloc/game_event_test.dart @@ -84,5 +84,18 @@ void main() { ); }); }); + + group('SparkyTurboChargeActivated', () { + test('can be instantiated', () { + expect(const SparkyTurboChargeActivated(), isNotNull); + }); + + test('supports value equality', () { + expect( + SparkyTurboChargeActivated(), + equals(SparkyTurboChargeActivated()), + ); + }); + }); }); } diff --git a/test/game/components/controlled_ball_test.dart b/test/game/components/controlled_ball_test.dart index 53847b3c..00305dca 100644 --- a/test/game/components/controlled_ball_test.dart +++ b/test/game/components/controlled_ball_test.dart @@ -1,8 +1,8 @@ // ignore_for_file: cascade_invocations import 'package:bloc_test/bloc_test.dart'; +import 'package:flame/extensions.dart'; import 'package:flame_test/flame_test.dart'; -import 'package:flutter/painting.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/game/game.dart'; @@ -15,6 +15,24 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('BallController', () { + late Ball ball; + late GameBloc gameBloc; + + setUp(() { + ball = Ball(baseColor: const Color(0xFF00FFFF)); + gameBloc = MockGameBloc(); + whenListen( + gameBloc, + const Stream.empty(), + initialState: const GameState.initial(), + ); + }); + + final flameBlocTester = FlameBlocTester( + gameBuilder: EmptyPinballGameTest.new, + blocBuilder: () => gameBloc, + ); + test('can be instantiated', () { expect( BallController(MockBall()), @@ -22,36 +40,78 @@ void main() { ); }); - group('description', () { - late Ball ball; - late GameBloc gameBloc; - - setUp(() { - ball = Ball(baseColor: const Color(0xFF00FFFF)); - gameBloc = MockGameBloc(); - whenListen( - gameBloc, - const Stream.empty(), - initialState: const GameState.initial(), - ); - }); - - final flameBlocTester = FlameBlocTester( - gameBuilder: EmptyPinballGameTest.new, - blocBuilder: () => gameBloc, - ); + flameBlocTester.testGameWidget( + 'lost adds BallLost to GameBloc', + setUp: (game, tester) async { + final controller = BallController(ball); + await ball.add(controller); + await game.ensureAdd(ball); + + controller.lost(); + }, + verify: (game, tester) async { + verify(() => gameBloc.add(const BallLost())).called(1); + }, + ); + group('turboCharge', () { flameBlocTester.testGameWidget( - 'lost adds BallLost to GameBloc', + 'adds TurboChargeActivated', setUp: (game, tester) async { final controller = BallController(ball); await ball.add(controller); await game.ensureAdd(ball); - controller.lost(); + await controller.turboCharge(); }, verify: (game, tester) async { - verify(() => gameBloc.add(const BallLost())).called(1); + verify(() => gameBloc.add(const SparkyTurboChargeActivated())) + .called(1); + }, + ); + + flameBlocTester.testGameWidget( + "initially stops the ball's motion", + setUp: (game, tester) async { + final controller = BallController(ball); + await ball.add(controller); + await game.ensureAdd(ball); + + ball.body.linearVelocity = Vector2.all(10); + + // ignore: unawaited_futures + controller.turboCharge(); + + expect(ball.body.gravityScale, equals(0)); + expect(ball.body.linearVelocity, equals(Vector2.zero())); + expect(ball.body.angularVelocity, equals(0)); + }, + ); + + flameBlocTester.testGameWidget( + 'resumes the ball', + setUp: (game, tester) async { + final controller = BallController(ball); + await ball.add(controller); + await game.ensureAdd(ball); + + await controller.turboCharge(); + + expect(ball.body.gravityScale, equals(1)); + expect(ball.body.linearVelocity, isNot(equals(Vector2.zero()))); + }, + ); + + flameBlocTester.testGameWidget( + 'boosts the ball', + setUp: (game, tester) async { + final controller = BallController(ball); + await ball.add(controller); + await game.ensureAdd(ball); + + await controller.turboCharge(); + + expect(ball.body.linearVelocity, equals(Vector2(200, -500))); }, ); }); diff --git a/test/game/components/controlled_sparky_computer_test.dart b/test/game/components/controlled_sparky_computer_test.dart new file mode 100644 index 00000000..bbd94c67 --- /dev/null +++ b/test/game/components/controlled_sparky_computer_test.dart @@ -0,0 +1,21 @@ +// ignore_for_file: cascade_invocations + +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball/game/game.dart'; + +void main() { + group('SparkyComputerController', () { + late ControlledSparkyComputer controlledSparkyComputer; + + setUp(() { + controlledSparkyComputer = ControlledSparkyComputer(); + }); + + test('can be instantiated', () { + expect( + SparkyComputerController(controlledSparkyComputer), + isA(), + ); + }); + }); +}