From efd2ddce0d63d043b407858b369ef7b718004340 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Wed, 27 Apr 2022 15:08:27 +0200 Subject: [PATCH] test: refactor tests for pinball_game --- lib/game/pinball_game.dart | 6 +- test/game/pinball_game_test.dart | 175 ++++++++++++++++++++----------- 2 files changed, 115 insertions(+), 66 deletions(-) diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index 1b04175d..e7786189 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -41,6 +41,8 @@ class PinballGame extends Forge2DGame @override Future onLoad() async { + print("ONLOAD"); + _addContactCallbacks(); unawaited(add(gameFlowController = GameFlowController(this))); @@ -92,7 +94,7 @@ class PinballGame extends Forge2DGame } class _GameBallsController extends ComponentController - with BlocComponent, HasGameRef { + with BlocComponent { _GameBallsController(PinballGame game) : super(game); late final Plunger _plunger; @@ -119,7 +121,7 @@ class _GameBallsController extends ComponentController void _spawnBall() { final ball = ControlledBall.launch( - characterTheme: gameRef.characterTheme, + characterTheme: component.characterTheme, )..initialPosition = Vector2( _plunger.body.position.x, _plunger.body.position.y - Ball.size.y, diff --git a/test/game/pinball_game_test.dart b/test/game/pinball_game_test.dart index 312909e4..4390c84f 100644 --- a/test/game/pinball_game_test.dart +++ b/test/game/pinball_game_test.dart @@ -13,28 +13,39 @@ import '../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final assets = [ - Assets.images.dash.bumper.main.active.keyName, - Assets.images.dash.bumper.main.inactive.keyName, - Assets.images.dash.bumper.a.active.keyName, - Assets.images.dash.bumper.a.inactive.keyName, - Assets.images.dash.bumper.b.active.keyName, - Assets.images.dash.bumper.b.inactive.keyName, - Assets.images.dash.animatronic.keyName, + Assets.images.ball.ball.keyName, + Assets.images.ball.flameEffect.keyName, Assets.images.signpost.inactive.keyName, Assets.images.signpost.active1.keyName, Assets.images.signpost.active2.keyName, Assets.images.signpost.active3.keyName, - Assets.images.alienBumper.a.active.keyName, - Assets.images.alienBumper.a.inactive.keyName, - Assets.images.alienBumper.b.active.keyName, - Assets.images.alienBumper.b.inactive.keyName, - Assets.images.sparky.bumper.a.active.keyName, - Assets.images.sparky.bumper.a.inactive.keyName, - Assets.images.sparky.bumper.b.active.keyName, - Assets.images.sparky.bumper.b.inactive.keyName, - Assets.images.sparky.bumper.c.active.keyName, - Assets.images.sparky.bumper.c.inactive.keyName, - Assets.images.sparky.animatronic.keyName, + Assets.images.flipper.left.keyName, + Assets.images.flipper.right.keyName, + Assets.images.baseboard.left.keyName, + Assets.images.baseboard.right.keyName, + Assets.images.kicker.left.keyName, + Assets.images.kicker.right.keyName, + Assets.images.slingshot.upper.keyName, + Assets.images.slingshot.lower.keyName, + Assets.images.launchRamp.ramp.keyName, + Assets.images.launchRamp.foregroundRailing.keyName, + Assets.images.launchRamp.backgroundRailing.keyName, + Assets.images.dino.dinoLandTop.keyName, + Assets.images.dino.dinoLandBottom.keyName, + Assets.images.dash.animatronic.keyName, + Assets.images.dash.bumper.a.active.keyName, + Assets.images.dash.bumper.a.inactive.keyName, + Assets.images.dash.bumper.b.active.keyName, + Assets.images.dash.bumper.b.inactive.keyName, + Assets.images.dash.bumper.main.active.keyName, + Assets.images.dash.bumper.main.inactive.keyName, + Assets.images.plunger.plunger.keyName, + Assets.images.plunger.rocket.keyName, + Assets.images.boundary.bottom.keyName, + Assets.images.boundary.outer.keyName, + Assets.images.boundary.outerBottom.keyName, + Assets.images.spaceship.saucer.keyName, + Assets.images.spaceship.bridge.keyName, Assets.images.spaceship.ramp.boardOpening.keyName, Assets.images.spaceship.ramp.railingForeground.keyName, Assets.images.spaceship.ramp.railingBackground.keyName, @@ -45,29 +56,57 @@ void main() { Assets.images.spaceship.ramp.arrow.active3.keyName, Assets.images.spaceship.ramp.arrow.active4.keyName, Assets.images.spaceship.ramp.arrow.active5.keyName, - Assets.images.baseboard.left.keyName, - Assets.images.baseboard.right.keyName, - Assets.images.flipper.left.keyName, - Assets.images.flipper.right.keyName, - Assets.images.boundary.outer.keyName, - Assets.images.boundary.outerBottom.keyName, - Assets.images.boundary.bottom.keyName, - Assets.images.slingshot.upper.keyName, - Assets.images.slingshot.lower.keyName, - Assets.images.dino.dinoLandTop.keyName, - Assets.images.dino.dinoLandBottom.keyName, + Assets.images.spaceship.rail.main.keyName, + Assets.images.spaceship.rail.foreground.keyName, + Assets.images.alienBumper.a.active.keyName, + Assets.images.alienBumper.a.inactive.keyName, + Assets.images.alienBumper.b.active.keyName, + Assets.images.alienBumper.b.inactive.keyName, + Assets.images.chromeDino.mouth.keyName, + Assets.images.chromeDino.head.keyName, + Assets.images.sparky.computer.top.keyName, + Assets.images.sparky.computer.base.keyName, + Assets.images.sparky.animatronic.keyName, + Assets.images.sparky.bumper.a.inactive.keyName, + Assets.images.sparky.bumper.a.active.keyName, + Assets.images.sparky.bumper.b.active.keyName, + Assets.images.sparky.bumper.b.inactive.keyName, + Assets.images.sparky.bumper.c.active.keyName, + Assets.images.sparky.bumper.c.inactive.keyName, + Assets.images.backboard.backboardScores.keyName, + Assets.images.backboard.backboardGameOver.keyName, + Assets.images.googleWord.letter1.keyName, + Assets.images.googleWord.letter2.keyName, + Assets.images.googleWord.letter3.keyName, + Assets.images.googleWord.letter4.keyName, + Assets.images.googleWord.letter5.keyName, + Assets.images.googleWord.letter6.keyName, + Assets.images.backboard.display.keyName, ]; + final flameTester = FlameTester(() => PinballTestGame(assets)); final debugModeFlameTester = FlameTester(() => DebugPinballTestGame(assets)); + late GameBloc gameBloc; + + setUp(() { + gameBloc = GameBloc(); + }); + + final flameBlocTester = FlameBlocTester( + gameBuilder: EmptyPinballTestGame.new, + blocBuilder: () => gameBloc, + // assets: assets, + ); group('PinballGame', () { // TODO(alestiago): test if [PinballGame] registers // [BallScorePointsCallback] once the following issue is resolved: // https://github.com/flame-engine/flame/issues/1416 group('components', () { - flameTester.test( + flameTester.testGameWidget( 'has only one BottomWall', - (game) async { + setUp: (game, tester) async { + await game.ensureAdd(BottomWall()); await game.ready(); expect( game.children.whereType().length, @@ -76,9 +115,9 @@ void main() { }, ); - flameTester.test( + flameTester.testGameWidget( 'has only one Plunger', - (game) async { + setUp: (game, tester) async { await game.ready(); expect( game.children.whereType().length, @@ -87,17 +126,20 @@ void main() { }, ); - flameTester.test('has one Board', (game) async { - await game.ready(); - expect( - game.children.whereType().length, - equals(1), - ); - }); + flameTester.testGameWidget( + 'has one Board', + setUp: (game, tester) async { + await game.ready(); + expect( + game.children.whereType().length, + equals(1), + ); + }, + ); - flameTester.test( + flameTester.testGameWidget( 'one AlienZone', - (game) async { + setUp: (game, tester) async { await game.ready(); expect(game.children.whereType().length, equals(1)); }, @@ -106,9 +148,9 @@ void main() { group('controller', () { // TODO(alestiago): Write test to be controller agnostic. group('listenWhen', () { - flameTester.test( + flameTester.testGameWidget( 'listens when all balls are lost and there are more than 0 rounds', - (game) async { + setUp: (game, tester) async { final newState = MockGameState(); when(() => newState.balls).thenReturn(0); when(() => newState.rounds).thenReturn(2); @@ -120,9 +162,9 @@ void main() { }, ); - flameTester.test( + flameTester.testGameWidget( "doesn't listen when some balls are left", - (game) async { + setUp: (game, tester) async { final newState = MockGameState(); when(() => newState.balls).thenReturn(1); when(() => newState.rounds).thenReturn(2); @@ -134,9 +176,9 @@ void main() { }, ); - flameTester.test( + flameTester.testGameWidget( "doesn't listen when no balls left", - (game) async { + setUp: (game, tester) async { final newState = MockGameState(); when(() => newState.balls).thenReturn(1); when(() => newState.rounds).thenReturn(0); @@ -152,10 +194,11 @@ void main() { group( 'onNewState', () { - flameTester.test( + flameTester.testGameWidget( 'spawns a ball', - (game) async { + setUp: (game, tester) async { await game.ready(); + final previousBalls = game.descendants().whereType().toList(); @@ -177,24 +220,28 @@ void main() { }); group('DebugPinballGame', () { - debugModeFlameTester.test('adds a ball on tap up', (game) async { - await game.ready(); + debugModeFlameTester.testGameWidget( + 'adds a ball on tap up', + setUp: (game, tester) async { + await game.ready(); + await tester.pump(); - final eventPosition = MockEventPosition(); - when(() => eventPosition.game).thenReturn(Vector2.all(10)); + final eventPosition = MockEventPosition(); + when(() => eventPosition.game).thenReturn(Vector2.all(10)); - final tapUpEvent = MockTapUpInfo(); - when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); + final tapUpEvent = MockTapUpInfo(); + when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); - final previousBalls = game.descendants().whereType().toList(); + final previousBalls = game.descendants().whereType().toList(); - game.onTapUp(tapUpEvent); - await game.ready(); + game.onTapUp(tapUpEvent); + await game.ready(); - expect( - game.children.whereType().length, - equals(previousBalls.length + 1), - ); - }); + expect( + game.children.whereType().length, + equals(previousBalls.length + 1), + ); + }, + ); }); }