test: refactor tests for pinball_game

pull/213/head
RuiAlonso 3 years ago
parent 6ef7e33d11
commit efd2ddce0d

@ -41,6 +41,8 @@ class PinballGame extends Forge2DGame
@override @override
Future<void> onLoad() async { Future<void> onLoad() async {
print("ONLOAD");
_addContactCallbacks(); _addContactCallbacks();
unawaited(add(gameFlowController = GameFlowController(this))); unawaited(add(gameFlowController = GameFlowController(this)));
@ -92,7 +94,7 @@ class PinballGame extends Forge2DGame
} }
class _GameBallsController extends ComponentController<PinballGame> class _GameBallsController extends ComponentController<PinballGame>
with BlocComponent<GameBloc, GameState>, HasGameRef<PinballGame> { with BlocComponent<GameBloc, GameState> {
_GameBallsController(PinballGame game) : super(game); _GameBallsController(PinballGame game) : super(game);
late final Plunger _plunger; late final Plunger _plunger;
@ -119,7 +121,7 @@ class _GameBallsController extends ComponentController<PinballGame>
void _spawnBall() { void _spawnBall() {
final ball = ControlledBall.launch( final ball = ControlledBall.launch(
characterTheme: gameRef.characterTheme, characterTheme: component.characterTheme,
)..initialPosition = Vector2( )..initialPosition = Vector2(
_plunger.body.position.x, _plunger.body.position.x,
_plunger.body.position.y - Ball.size.y, _plunger.body.position.y - Ball.size.y,

@ -13,28 +13,39 @@ import '../helpers/helpers.dart';
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
Assets.images.dash.bumper.main.active.keyName, Assets.images.ball.ball.keyName,
Assets.images.dash.bumper.main.inactive.keyName, Assets.images.ball.flameEffect.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.signpost.inactive.keyName, Assets.images.signpost.inactive.keyName,
Assets.images.signpost.active1.keyName, Assets.images.signpost.active1.keyName,
Assets.images.signpost.active2.keyName, Assets.images.signpost.active2.keyName,
Assets.images.signpost.active3.keyName, Assets.images.signpost.active3.keyName,
Assets.images.alienBumper.a.active.keyName, Assets.images.flipper.left.keyName,
Assets.images.alienBumper.a.inactive.keyName, Assets.images.flipper.right.keyName,
Assets.images.alienBumper.b.active.keyName, Assets.images.baseboard.left.keyName,
Assets.images.alienBumper.b.inactive.keyName, Assets.images.baseboard.right.keyName,
Assets.images.sparky.bumper.a.active.keyName, Assets.images.kicker.left.keyName,
Assets.images.sparky.bumper.a.inactive.keyName, Assets.images.kicker.right.keyName,
Assets.images.sparky.bumper.b.active.keyName, Assets.images.slingshot.upper.keyName,
Assets.images.sparky.bumper.b.inactive.keyName, Assets.images.slingshot.lower.keyName,
Assets.images.sparky.bumper.c.active.keyName, Assets.images.launchRamp.ramp.keyName,
Assets.images.sparky.bumper.c.inactive.keyName, Assets.images.launchRamp.foregroundRailing.keyName,
Assets.images.sparky.animatronic.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.boardOpening.keyName,
Assets.images.spaceship.ramp.railingForeground.keyName, Assets.images.spaceship.ramp.railingForeground.keyName,
Assets.images.spaceship.ramp.railingBackground.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.active3.keyName,
Assets.images.spaceship.ramp.arrow.active4.keyName, Assets.images.spaceship.ramp.arrow.active4.keyName,
Assets.images.spaceship.ramp.arrow.active5.keyName, Assets.images.spaceship.ramp.arrow.active5.keyName,
Assets.images.baseboard.left.keyName, Assets.images.spaceship.rail.main.keyName,
Assets.images.baseboard.right.keyName, Assets.images.spaceship.rail.foreground.keyName,
Assets.images.flipper.left.keyName, Assets.images.alienBumper.a.active.keyName,
Assets.images.flipper.right.keyName, Assets.images.alienBumper.a.inactive.keyName,
Assets.images.boundary.outer.keyName, Assets.images.alienBumper.b.active.keyName,
Assets.images.boundary.outerBottom.keyName, Assets.images.alienBumper.b.inactive.keyName,
Assets.images.boundary.bottom.keyName, Assets.images.chromeDino.mouth.keyName,
Assets.images.slingshot.upper.keyName, Assets.images.chromeDino.head.keyName,
Assets.images.slingshot.lower.keyName, Assets.images.sparky.computer.top.keyName,
Assets.images.dino.dinoLandTop.keyName, Assets.images.sparky.computer.base.keyName,
Assets.images.dino.dinoLandBottom.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 flameTester = FlameTester(() => PinballTestGame(assets));
final debugModeFlameTester = FlameTester(() => DebugPinballTestGame(assets)); final debugModeFlameTester = FlameTester(() => DebugPinballTestGame(assets));
late GameBloc gameBloc;
setUp(() {
gameBloc = GameBloc();
});
final flameBlocTester = FlameBlocTester<PinballGame, GameBloc>(
gameBuilder: EmptyPinballTestGame.new,
blocBuilder: () => gameBloc,
// assets: assets,
);
group('PinballGame', () { group('PinballGame', () {
// TODO(alestiago): test if [PinballGame] registers // TODO(alestiago): test if [PinballGame] registers
// [BallScorePointsCallback] once the following issue is resolved: // [BallScorePointsCallback] once the following issue is resolved:
// https://github.com/flame-engine/flame/issues/1416 // https://github.com/flame-engine/flame/issues/1416
group('components', () { group('components', () {
flameTester.test( flameTester.testGameWidget(
'has only one BottomWall', 'has only one BottomWall',
(game) async { setUp: (game, tester) async {
await game.ensureAdd(BottomWall());
await game.ready(); await game.ready();
expect( expect(
game.children.whereType<BottomWall>().length, game.children.whereType<BottomWall>().length,
@ -76,9 +115,9 @@ void main() {
}, },
); );
flameTester.test( flameTester.testGameWidget(
'has only one Plunger', 'has only one Plunger',
(game) async { setUp: (game, tester) async {
await game.ready(); await game.ready();
expect( expect(
game.children.whereType<Plunger>().length, game.children.whereType<Plunger>().length,
@ -87,17 +126,20 @@ void main() {
}, },
); );
flameTester.test('has one Board', (game) async { flameTester.testGameWidget(
await game.ready(); 'has one Board',
expect( setUp: (game, tester) async {
game.children.whereType<Board>().length, await game.ready();
equals(1), expect(
); game.children.whereType<Board>().length,
}); equals(1),
);
},
);
flameTester.test( flameTester.testGameWidget(
'one AlienZone', 'one AlienZone',
(game) async { setUp: (game, tester) async {
await game.ready(); await game.ready();
expect(game.children.whereType<AlienZone>().length, equals(1)); expect(game.children.whereType<AlienZone>().length, equals(1));
}, },
@ -106,9 +148,9 @@ void main() {
group('controller', () { group('controller', () {
// TODO(alestiago): Write test to be controller agnostic. // TODO(alestiago): Write test to be controller agnostic.
group('listenWhen', () { group('listenWhen', () {
flameTester.test( flameTester.testGameWidget(
'listens when all balls are lost and there are more than 0 rounds', 'listens when all balls are lost and there are more than 0 rounds',
(game) async { setUp: (game, tester) async {
final newState = MockGameState(); final newState = MockGameState();
when(() => newState.balls).thenReturn(0); when(() => newState.balls).thenReturn(0);
when(() => newState.rounds).thenReturn(2); when(() => newState.rounds).thenReturn(2);
@ -120,9 +162,9 @@ void main() {
}, },
); );
flameTester.test( flameTester.testGameWidget(
"doesn't listen when some balls are left", "doesn't listen when some balls are left",
(game) async { setUp: (game, tester) async {
final newState = MockGameState(); final newState = MockGameState();
when(() => newState.balls).thenReturn(1); when(() => newState.balls).thenReturn(1);
when(() => newState.rounds).thenReturn(2); when(() => newState.rounds).thenReturn(2);
@ -134,9 +176,9 @@ void main() {
}, },
); );
flameTester.test( flameTester.testGameWidget(
"doesn't listen when no balls left", "doesn't listen when no balls left",
(game) async { setUp: (game, tester) async {
final newState = MockGameState(); final newState = MockGameState();
when(() => newState.balls).thenReturn(1); when(() => newState.balls).thenReturn(1);
when(() => newState.rounds).thenReturn(0); when(() => newState.rounds).thenReturn(0);
@ -152,10 +194,11 @@ void main() {
group( group(
'onNewState', 'onNewState',
() { () {
flameTester.test( flameTester.testGameWidget(
'spawns a ball', 'spawns a ball',
(game) async { setUp: (game, tester) async {
await game.ready(); await game.ready();
final previousBalls = final previousBalls =
game.descendants().whereType<Ball>().toList(); game.descendants().whereType<Ball>().toList();
@ -177,24 +220,28 @@ void main() {
}); });
group('DebugPinballGame', () { group('DebugPinballGame', () {
debugModeFlameTester.test('adds a ball on tap up', (game) async { debugModeFlameTester.testGameWidget(
await game.ready(); 'adds a ball on tap up',
setUp: (game, tester) async {
await game.ready();
await tester.pump();
final eventPosition = MockEventPosition(); final eventPosition = MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2.all(10)); when(() => eventPosition.game).thenReturn(Vector2.all(10));
final tapUpEvent = MockTapUpInfo(); final tapUpEvent = MockTapUpInfo();
when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); when(() => tapUpEvent.eventPosition).thenReturn(eventPosition);
final previousBalls = game.descendants().whereType<Ball>().toList(); final previousBalls = game.descendants().whereType<Ball>().toList();
game.onTapUp(tapUpEvent); game.onTapUp(tapUpEvent);
await game.ready(); await game.ready();
expect( expect(
game.children.whereType<Ball>().length, game.children.whereType<Ball>().length,
equals(previousBalls.length + 1), equals(previousBalls.length + 1),
); );
}); },
);
}); });
} }

Loading…
Cancel
Save