From 73e9dc5fbc12366237d011f37dc6d6c4f26b459b Mon Sep 17 00:00:00 2001 From: alestiago Date: Mon, 9 May 2022 12:08:10 +0100 Subject: [PATCH] feat: tested plunger behaviors --- lib/game/components/launcher.dart | 6 +- .../behaviors/plunger_noise_behavior.dart | 10 +- .../behaviors/plunger_pulling_behavior.dart | 15 +- .../behaviors/plunger_releasing_behavior.dart | 19 +- .../lib/src/components/plunger/plunger.dart | 13 +- .../lib/stories/plunger/plunger_game.dart | 37 +--- .../src/components/golden/plunger/pull.png | Bin 42569 -> 43414 bytes .../src/components/golden/plunger/release.png | Bin 43416 -> 42568 bytes .../plunger_jointing_behavior_test.dart | 145 ------------- ...plunger_key_controlling_behavior_test.dart | 169 +++++++++++++-- .../plunger_noise_behavior_test.dart | 53 +++-- .../plunger_pulling_behavior_test.dart | 131 ++++++++++++ .../plunger_releasing_behavior_test.dart | 69 +++++- .../src/components/plunger/plunger_test.dart | 198 ++++++------------ 14 files changed, 486 insertions(+), 379 deletions(-) diff --git a/lib/game/components/launcher.dart b/lib/game/components/launcher.dart index 3a609838..99b44a80 100644 --- a/lib/game/components/launcher.dart +++ b/lib/game/components/launcher.dart @@ -1,5 +1,4 @@ import 'package:flame/components.dart'; -import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball_components/pinball_components.dart' hide Assets; /// {@template launcher} @@ -13,10 +12,7 @@ class Launcher extends Component { children: [ LaunchRamp(), Flapper(), - FlameBlocProvider( - create: PlungerCubit.new, - children: [Plunger()..initialPosition = Vector2(41, 43.7)], - ), + Plunger()..initialPosition = Vector2(41, 43.7), RocketSpriteComponent()..position = Vector2(42.8, 62.3), ], ); diff --git a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_noise_behavior.dart b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_noise_behavior.dart index 8f7bb84a..96cb9bd2 100644 --- a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_noise_behavior.dart +++ b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_noise_behavior.dart @@ -9,19 +9,11 @@ import 'package:pinball_flame/pinball_flame.dart'; /// It is attached when the plunger is released. class PlungerNoiseBehavior extends Component with FlameBlocListenable { - late final PinballAudioPlayer _audioPlayer; - @override void onNewState(PlungerState state) { super.onNewState(state); if (state.isReleasing) { - _audioPlayer.play(PinballAudio.launcher); + readProvider().play(PinballAudio.launcher); } } - - @override - Future onLoad() async { - await super.onLoad(); - _audioPlayer = readProvider(); - } } diff --git a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart index 454653a5..c7188aeb 100644 --- a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart +++ b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_pulling_behavior.dart @@ -2,20 +2,27 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; class PlungerPullingBehavior extends Component - with ParentIsA, FlameBlocReader { + with FlameBlocReader { PlungerPullingBehavior({ required double strength, }) : _strength = strength; final double _strength; + late final Plunger _plunger; + + @override + Future onLoad() async { + await super.onLoad(); + _plunger = parent!.parent! as Plunger; + } + @override void update(double dt) { if (bloc.state.isPulling) { - parent.body.linearVelocity = Vector2(0, _strength); + _plunger.body.linearVelocity = Vector2(0, _strength.abs()); } } } @@ -29,7 +36,7 @@ class PlungerAutoPullingBehavior extends PlungerPullingBehavior { void update(double dt) { super.update(dt); - final joint = parent.body.joints.whereType().single; + final joint = _plunger.body.joints.whereType().single; final reachedBottom = joint.getJointTranslation() <= joint.getLowerLimit(); if (reachedBottom) { bloc.released(); diff --git a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_releasing_behavior.dart b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_releasing_behavior.dart index bb017732..ac02984f 100644 --- a/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_releasing_behavior.dart +++ b/packages/pinball_components/lib/src/components/plunger/behaviors/plunger_releasing_behavior.dart @@ -1,23 +1,30 @@ import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:pinball_components/pinball_components.dart'; -import 'package:pinball_flame/pinball_flame.dart'; class PlungerReleasingBehavior extends Component - with ParentIsA, FlameBlocListenable { + with FlameBlocListenable { PlungerReleasingBehavior({ required double strength, }) : _strength = strength; - final double _strength; // 11 + final double _strength; + + late final Plunger _plunger; + + @override + Future onLoad() async { + await super.onLoad(); + _plunger = parent!.parent! as Plunger; + } @override void onNewState(PlungerState state) { super.onNewState(state); if (state.isReleasing) { - final velocity = - (parent.initialPosition.y - parent.body.position.y) * _strength; - parent.body.linearVelocity = Vector2(0, velocity); + final velocity = (_plunger.initialPosition.y - _plunger.body.position.y) * + _strength.abs(); + _plunger.body.linearVelocity = Vector2(0, velocity); } } } diff --git a/packages/pinball_components/lib/src/components/plunger/plunger.dart b/packages/pinball_components/lib/src/components/plunger/plunger.dart index c15265c6..63c81cff 100644 --- a/packages/pinball_components/lib/src/components/plunger/plunger.dart +++ b/packages/pinball_components/lib/src/components/plunger/plunger.dart @@ -12,7 +12,7 @@ export 'cubit/plunger_cubit.dart'; /// [Plunger] serves as a spring, that shoots the ball on the right side of the /// play field. /// -/// [Plunger] ignores gravity so the player controls its downward [pull]. +/// [Plunger] ignores gravity so the player controls its downward movement. /// {@endtemplate} class Plunger extends BodyComponent with InitialPosition, Layered, ZIndex { /// {@macro plunger} @@ -20,10 +20,15 @@ class Plunger extends BodyComponent with InitialPosition, Layered, ZIndex { : super( renderBody: false, children: [ - _PlungerSpriteAnimationGroupComponent(), + FlameBlocProvider( + create: PlungerCubit.new, + children: [ + _PlungerSpriteAnimationGroupComponent(), + PlungerPullingBehavior(strength: 7), + PlungerReleasingBehavior(strength: 11), + ], + ), PlungerJointingBehavior(compressionDistance: 9.2), - PlungerAutoPullingBehavior(strength: 7), - PlungerReleasingBehavior(strength: 11) ], ) { zIndex = ZIndexes.plunger; diff --git a/packages/pinball_components/sandbox/lib/stories/plunger/plunger_game.dart b/packages/pinball_components/sandbox/lib/stories/plunger/plunger_game.dart index cef7b9eb..50af919f 100644 --- a/packages/pinball_components/sandbox/lib/stories/plunger/plunger_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/plunger/plunger_game.dart @@ -1,11 +1,10 @@ import 'package:flame/input.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:pinball_components/pinball_components.dart'; import 'package:sandbox/common/common.dart'; import 'package:sandbox/stories/ball/basic_ball_game.dart'; -class PlungerGame extends BallGame with KeyboardEvents, Traceable { +class PlungerGame extends BallGame + with HasKeyboardHandlerComponents, Traceable { static const description = ''' Shows how Plunger is rendered. @@ -13,38 +12,16 @@ class PlungerGame extends BallGame with KeyboardEvents, Traceable { - Tap anywhere on the screen to spawn a ball into the game. '''; - static const _downKeys = [ - LogicalKeyboardKey.arrowDown, - LogicalKeyboardKey.space, - ]; - - late Plunger plunger; - @override Future onLoad() async { await super.onLoad(); final center = screenToWorld(camera.viewport.canvasSize! / 2); - await add( - plunger = Plunger()..initialPosition = Vector2(center.x - 8.8, center.y), - ); - await traceAllBodies(); - } + final plunger = Plunger() + ..initialPosition = Vector2(center.x - 8.8, center.y); + await add(plunger); + await plunger.add(PlungerKeyControllingBehavior()); - @override - KeyEventResult onKeyEvent( - RawKeyEvent event, - Set keysPressed, - ) { - final movedPlungerDown = _downKeys.contains(event.logicalKey); - if (movedPlungerDown) { - if (event is RawKeyDownEvent) { - plunger.pull(); - } else if (event is RawKeyUpEvent) { - plunger.release(); - } - return KeyEventResult.handled; - } - return KeyEventResult.ignored; + await traceAllBodies(); } } diff --git a/packages/pinball_components/test/src/components/golden/plunger/pull.png b/packages/pinball_components/test/src/components/golden/plunger/pull.png index 0ec27a4e77405eb3cf766932c942b504dd65fb18..45e104ba71a12bf9e2968a2a763a4b57553260c1 100644 GIT binary patch literal 43414 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 z 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 Jynp2P{|St)ZHNE> literal 43416 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 diff --git a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_jointing_behavior_test.dart b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_jointing_behavior_test.dart index 674aad3a..940ea625 100644 --- a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_jointing_behavior_test.dart +++ b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_jointing_behavior_test.dart @@ -25,14 +25,6 @@ void main() { expect(parent.children, contains(behavior)); }); - flameTester.test('can be loaded', (game) async { - final parent = Plunger.test(); - final behavior = PlungerJointingBehavior(compressionDistance: 0); - await game.ensureAdd(parent); - await parent.ensureAdd(behavior); - expect(parent.children, contains(behavior)); - }); - flameTester.test('creates a joint', (game) async { final behavior = PlungerJointingBehavior(compressionDistance: 0); final parent = Plunger.test(); @@ -41,141 +33,4 @@ void main() { expect(parent.body.joints, isNotEmpty); }); }); - -// group('PlungerAnchorPrismaticJointDef', () { -// const compressionDistance = 10.0; -// late Plunger plunger; - -// setUp(() { -// plunger = Plunger( -// compressionDistance: compressionDistance, -// ); -// anchor = PlungerAnchor(plunger: plunger); -// }); - -// group('initializes with', () { -// flameTester.test( -// 'plunger body as bodyA', -// (game) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); - -// expect(jointDef.bodyA, equals(plunger.body)); -// }, -// ); - -// flameTester.test( -// 'anchor body as bodyB', -// (game) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); -// game.world.createJoint(PrismaticJoint(jointDef)); - -// expect(jointDef.bodyB, equals(anchor.body)); -// }, -// ); - -// flameTester.test( -// 'limits enabled', -// (game) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); -// game.world.createJoint(PrismaticJoint(jointDef)); - -// expect(jointDef.enableLimit, isTrue); -// }, -// ); - -// flameTester.test( -// 'lower translation limit as negative infinity', -// (game) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); -// game.world.createJoint(PrismaticJoint(jointDef)); - -// expect(jointDef.lowerTranslation, equals(double.negativeInfinity)); -// }, -// ); - -// flameTester.test( -// 'connected body collision enabled', -// (game) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); -// game.world.createJoint(PrismaticJoint(jointDef)); - -// expect(jointDef.collideConnected, isTrue); -// }, -// ); -// }); - -// flameTester.testGameWidget( -// 'plunger cannot go below anchor', -// setUp: (game, tester) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// // Giving anchor a shape for the plunger to collide with. -// anchor.body.createFixtureFromShape(PolygonShape()..setAsBoxXY(2, 1)); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); -// game.world.createJoint(PrismaticJoint(jointDef)); - -// await tester.pump(const Duration(seconds: 1)); -// }, -// verify: (game, tester) async { -// expect(plunger.body.position.y < anchor.body.position.y, isTrue); -// }, -// ); - -// flameTester.testGameWidget( -// 'plunger cannot excessively exceed starting position', -// setUp: (game, tester) async { -// await game.ensureAdd(plunger); -// await game.ensureAdd(anchor); - -// final jointDef = PlungerAnchorPrismaticJointDef( -// plunger: plunger, -// anchor: anchor, -// ); -// game.world.createJoint(PrismaticJoint(jointDef)); - -// plunger.body.setTransform(Vector2(0, -1), 0); - -// await tester.pump(const Duration(seconds: 1)); -// }, -// verify: (game, tester) async { -// expect(plunger.body.position.y < 1, isTrue); -// }, -// ); -// }); -// } } diff --git a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_key_controlling_behavior_test.dart b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_key_controlling_behavior_test.dart index 5cd03719..d415bf7d 100644 --- a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_key_controlling_behavior_test.dart +++ b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_key_controlling_behavior_test.dart @@ -1,3 +1,6 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter/foundation.dart'; @@ -6,6 +9,22 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; +class _TestGame extends Forge2DGame { + Future pump( + PlungerKeyControllingBehavior child, { + PlungerCubit? plugerBloc, + }) async { + final plunger = Plunger.test(); + await ensureAdd(plunger); + return plunger.ensureAdd( + FlameBlocProvider.value( + value: plugerBloc ?? _MockPlungerCubit(), + children: [child], + ), + ); + } +} + class _MockRawKeyDownEvent extends Mock implements RawKeyDownEvent { @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { @@ -20,9 +39,11 @@ class _MockRawKeyUpEvent extends Mock implements RawKeyUpEvent { } } +class _MockPlungerCubit extends Mock implements PlungerCubit {} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); - final flameTester = FlameTester(Forge2DGame.new); + final flameTester = FlameTester(_TestGame.new); group('PlungerKeyControllingBehavior', () { test('can be instantiated', () { @@ -33,39 +54,141 @@ void main() { }); flameTester.test('can be loaded', (game) async { - final parent = Plunger.test(); final behavior = PlungerKeyControllingBehavior(); - await game.ensureAdd(parent); - await parent.ensureAdd(behavior); - expect(parent.children, contains(behavior)); + await game.pump(behavior); + expect(game.descendants(), contains(behavior)); }); group('onKeyEvent', () { - late Plunger plunger; + late PlungerCubit plungerBloc; setUp(() { - plunger = Plunger.test(); + plungerBloc = _MockPlungerCubit(); }); - flameTester.test( - 'pulls when down arrow is pressed', - (game) async { - final plunger = Plunger.test(); - await game.ensureAdd(plunger); - final behavior = PlungerKeyControllingBehavior(); - await plunger.ensureAdd(behavior); + group('pulls when', () { + flameTester.test( + 'down arrow is pressed', + (game) async { + final behavior = PlungerKeyControllingBehavior(); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); - final event = _MockRawKeyDownEvent(); - when(() => event.logicalKey).thenReturn( - LogicalKeyboardKey.arrowDown, - ); + final event = _MockRawKeyDownEvent(); + when(() => event.logicalKey).thenReturn( + LogicalKeyboardKey.arrowDown, + ); - behavior.onKeyEvent(event, {}); + behavior.onKeyEvent(event, {}); - // expect(plunger.body.linearVelocity.y, isPositive); - // expect(plunger.body.linearVelocity.x, isZero); - }, - ); + verify(() => plungerBloc.pulled()).called(1); + }, + ); + + flameTester.test( + '"s" is pressed', + (game) async { + final behavior = PlungerKeyControllingBehavior(); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + + final event = _MockRawKeyDownEvent(); + when(() => event.logicalKey).thenReturn( + LogicalKeyboardKey.keyS, + ); + + behavior.onKeyEvent(event, {}); + + verify(() => plungerBloc.pulled()).called(1); + }, + ); + + flameTester.test( + 'space is pressed', + (game) async { + final behavior = PlungerKeyControllingBehavior(); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + + final event = _MockRawKeyDownEvent(); + when(() => event.logicalKey).thenReturn( + LogicalKeyboardKey.space, + ); + + behavior.onKeyEvent(event, {}); + + verify(() => plungerBloc.pulled()).called(1); + }, + ); + }); + + group('releases when', () { + flameTester.test( + 'down arrow is released', + (game) async { + final behavior = PlungerKeyControllingBehavior(); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + + final event = _MockRawKeyUpEvent(); + when(() => event.logicalKey).thenReturn( + LogicalKeyboardKey.arrowDown, + ); + + behavior.onKeyEvent(event, {}); + + verify(() => plungerBloc.released()).called(1); + }, + ); + + flameTester.test( + '"s" is released', + (game) async { + final behavior = PlungerKeyControllingBehavior(); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + + final event = _MockRawKeyUpEvent(); + when(() => event.logicalKey).thenReturn( + LogicalKeyboardKey.keyS, + ); + + behavior.onKeyEvent(event, {}); + + verify(() => plungerBloc.released()).called(1); + }, + ); + + flameTester.test( + 'space is released', + (game) async { + final behavior = PlungerKeyControllingBehavior(); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + + final event = _MockRawKeyUpEvent(); + when(() => event.logicalKey).thenReturn( + LogicalKeyboardKey.space, + ); + + behavior.onKeyEvent(event, {}); + + verify(() => plungerBloc.released()).called(1); + }, + ); + }); }); }); } diff --git a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_noise_behavior_test.dart b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_noise_behavior_test.dart index 5b067c3d..a5e11ad0 100644 --- a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_noise_behavior_test.dart +++ b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_noise_behavior_test.dart @@ -1,5 +1,8 @@ // ignore_for_file: cascade_invocations +import 'dart:async'; + +import 'package:bloc_test/bloc_test.dart'; import 'package:flame/components.dart'; import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; @@ -14,13 +17,16 @@ class _TestGame extends Forge2DGame { Future pump( Component child, { PinballAudioPlayer? pinballAudioPlayer, - }) { - return ensureAdd( + PlungerCubit? plungerBloc, + }) async { + final parent = Component(); + await ensureAdd(parent); + return parent.ensureAdd( FlameProvider.value( pinballAudioPlayer ?? _MockPinballAudioPlayer(), children: [ FlameBlocProvider.value( - value: PlungerCubit(), + value: plungerBloc ?? PlungerCubit(), children: [child], ), ], @@ -31,6 +37,8 @@ class _TestGame extends Forge2DGame { class _MockPinballAudioPlayer extends Mock implements PinballAudioPlayer {} +class _MockPlungerCubit extends Mock implements PlungerCubit {} + void main() { TestWidgetsFlutterBinding.ensureInitialized(); final flameTester = FlameTester(_TestGame.new); @@ -50,25 +58,34 @@ void main() { }); flameTester.test('can be loaded', (game) async { - final parent = Component(); final behavior = PlungerNoiseBehavior(); - await game.pump(parent); - await parent.ensureAdd(behavior); - expect(parent.children, contains(behavior)); + await game.pump(behavior); + expect(game.descendants(), contains(behavior)); }); - flameTester.test('plays the correct sound on when released', (game) async { - final parent = Component(); - final behavior = PlungerNoiseBehavior(); - await game.pump( - parent, - pinballAudioPlayer: audioPlayer, - ); - await parent.ensureAdd(behavior); + flameTester.test( + 'plays the correct sound when released', + (game) async { + final plungerBloc = _MockPlungerCubit(); + final streamController = StreamController(); + whenListen( + plungerBloc, + streamController.stream, + initialState: PlungerState.pulling, + ); - behavior.onNewState(PlungerState.releasing); + final behavior = PlungerNoiseBehavior(); + await game.pump( + behavior, + pinballAudioPlayer: audioPlayer, + plungerBloc: plungerBloc, + ); - verify(() => audioPlayer.play(PinballAudio.launcher)).called(1); - }); + streamController.add(PlungerState.releasing); + await Future.delayed(Duration.zero); + + verify(() => audioPlayer.play(PinballAudio.launcher)).called(1); + }, + ); }); } diff --git a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart index 2989024c..2fa55233 100644 --- a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart +++ b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_pulling_behavior_test.dart @@ -1,7 +1,39 @@ +// ignore_for_file: cascade_invocations + +import 'dart:async'; + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; import 'package:pinball_components/pinball_components.dart'; +class _TestGame extends Forge2DGame { + Future pump( + PlungerPullingBehavior behavior, { + PlungerCubit? plugerBloc, + }) async { + final plunger = Plunger.test(); + await ensureAdd(plunger); + return plunger.ensureAdd( + FlameBlocProvider.value( + value: plugerBloc ?? _MockPlungerCubit(), + children: [behavior], + ), + ); + } +} + +class _MockPlungerCubit extends Mock implements PlungerCubit {} + +class _MockPrismaticJoint extends Mock implements PrismaticJoint {} + void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(_TestGame.new); + group('PlungerPullingBehavior', () { test('can be instantiated', () { expect( @@ -9,6 +41,38 @@ void main() { isA(), ); }); + + flameTester.test('can be loaded', (game) async { + final behavior = PlungerPullingBehavior(strength: 0); + await game.pump(behavior); + expect(game.descendants(), contains(behavior)); + }); + + flameTester.test( + 'applies vertical linear velocity when pulled', + (game) async { + final plungerBloc = _MockPlungerCubit(); + whenListen( + plungerBloc, + Stream.value(PlungerState.pulling), + initialState: PlungerState.pulling, + ); + + const strength = 2.0; + final behavior = PlungerPullingBehavior( + strength: strength, + ); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + game.update(0); + + final plunger = behavior.ancestors().whereType().single; + expect(plunger.body.linearVelocity.x, equals(0)); + expect(plunger.body.linearVelocity.y, equals(strength)); + }, + ); }); group('PlungerAutoPullingBehavior', () { @@ -18,5 +82,72 @@ void main() { isA(), ); }); + + flameTester.test('can be loaded', (game) async { + final behavior = PlungerAutoPullingBehavior(strength: 0); + await game.pump(behavior); + expect(game.descendants(), contains(behavior)); + }); + + flameTester.test( + "pulls while joint hasn't reached limit", + (game) async { + final plungerBloc = _MockPlungerCubit(); + whenListen( + plungerBloc, + Stream.value(PlungerState.pulling), + initialState: PlungerState.pulling, + ); + + const strength = 2.0; + final behavior = PlungerAutoPullingBehavior( + strength: strength, + ); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + final plunger = behavior.ancestors().whereType().single; + final joint = _MockPrismaticJoint(); + when(joint.getJointTranslation).thenReturn(2); + when(joint.getLowerLimit).thenReturn(0); + plunger.body.joints.add(joint); + + game.update(0); + + expect(plunger.body.linearVelocity.x, equals(0)); + expect(plunger.body.linearVelocity.y, equals(strength)); + }, + ); + + flameTester.test( + 'releases when joint reaches limit', + (game) async { + final plungerBloc = _MockPlungerCubit(); + whenListen( + plungerBloc, + Stream.value(PlungerState.pulling), + initialState: PlungerState.pulling, + ); + + const strength = 2.0; + final behavior = PlungerAutoPullingBehavior( + strength: strength, + ); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + final plunger = behavior.ancestors().whereType().single; + final joint = _MockPrismaticJoint(); + when(joint.getJointTranslation).thenReturn(0); + when(joint.getLowerLimit).thenReturn(0); + plunger.body.joints.add(joint); + + game.update(0); + + verify(plungerBloc.released).called(1); + }, + ); }); } diff --git a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_releasing_behavior_test.dart b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_releasing_behavior_test.dart index ec0dea98..71f3132a 100644 --- a/packages/pinball_components/test/src/components/plunger/behaviors/plunger_releasing_behavior_test.dart +++ b/packages/pinball_components/test/src/components/plunger/behaviors/plunger_releasing_behavior_test.dart @@ -1,5 +1,72 @@ +// ignore_for_file: cascade_invocations + +import 'dart:async'; + +import 'package:bloc_test/bloc_test.dart'; +import 'package:flame_bloc/flame_bloc.dart'; +import 'package:flame_forge2d/forge2d_game.dart'; +import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball_components/pinball_components.dart'; + +class _TestGame extends Forge2DGame { + Future pump( + PlungerReleasingBehavior behavior, { + PlungerCubit? plugerBloc, + }) async { + final plunger = Plunger.test(); + await ensureAdd(plunger); + return plunger.ensureAdd( + FlameBlocProvider.value( + value: plugerBloc ?? PlungerCubit(), + children: [behavior], + ), + ); + } +} + +class _MockPlungerCubit extends Mock implements PlungerCubit {} void main() { - group('PlungerReleasingBehavior', () {}); + group('PlungerReleasingBehavior', () { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(_TestGame.new); + + test('can be instantiated', () { + expect( + PlungerReleasingBehavior(strength: 0), + isA(), + ); + }); + + flameTester.test('can be loaded', (game) async { + final behavior = PlungerReleasingBehavior(strength: 0); + await game.pump(behavior); + expect(game.descendants(), contains(behavior)); + }); + + flameTester.test('applies vertical linear velocity', (game) async { + final plungerBloc = _MockPlungerCubit(); + final streamController = StreamController(); + whenListen( + plungerBloc, + streamController.stream, + initialState: PlungerState.pulling, + ); + + final behavior = PlungerReleasingBehavior(strength: 2); + await game.pump( + behavior, + plugerBloc: plungerBloc, + ); + + streamController.add(PlungerState.releasing); + await Future.delayed(Duration.zero); + + final plunger = behavior.ancestors().whereType().single; + expect(plunger.body.linearVelocity.x, equals(0)); + expect(plunger.body.linearVelocity.y, isNot(greaterThan(0))); + }); + }); } diff --git a/packages/pinball_components/test/src/components/plunger/plunger_test.dart b/packages/pinball_components/test/src/components/plunger/plunger_test.dart index 7b43a210..f4b5c446 100644 --- a/packages/pinball_components/test/src/components/plunger/plunger_test.dart +++ b/packages/pinball_components/test/src/components/plunger/plunger_test.dart @@ -1,5 +1,6 @@ // ignore_for_file: cascade_invocations +import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -14,7 +15,6 @@ void main() { group('Plunger', () { test('can be instantiated', () { expect(Plunger(), isA()); - expect(Plunger.test(), isA()); }); flameTester.test( @@ -26,148 +26,78 @@ void main() { }, ); - flameTester.testGameWidget( - 'renders correctly', - setUp: (game, tester) async { - await game.ensureAdd(Plunger()); - game.camera.followVector2(Vector2.zero()); - game.camera.zoom = 4.1; - }, - verify: (game, tester) async { - final plunger = game.descendants().whereType().first; - plunger.pull(); - game.update(1); - await tester.pump(); - await expectLater( - find.byGame(), - matchesGoldenFile('golden/plunger/pull.png'), - ); - - plunger.release(); - game.update(1); - await tester.pump(); - await expectLater( - find.byGame(), - matchesGoldenFile('golden/plunger/release.png'), - ); - }, - ); - - group('body', () { - test('is dynamic', () { - final body = Plunger().createBody(); - expect(body.bodyType, equals(BodyType.dynamic)); - }); - - test('ignores gravity', () { - final body = Plunger().createBody(); - expect(body.gravityScale, equals(Vector2.zero())); - }); - }); - - group('fixture', () { - test('exists', () async { - final body = Plunger().createBody(); - expect(body.fixtures[0], isA()); - }); - - test('has density', () { - final body = Plunger().createBody(); - final fixture = body.fixtures[0]; - expect(fixture.density, greaterThan(0)); - }); - }); - - group('pullFor', () { - late Plunger plunger; - - setUp(() { - plunger = Plunger(); - }); - + group('renders correctly', () { + const goldenPath = '../golden/plunger/'; flameTester.testGameWidget( - 'moves downwards for given period when pullFor is called', + 'pulling', setUp: (game, tester) async { - await game.ensureAdd(plunger); + await game.ensureAdd(Plunger()); + game.camera.followVector2(Vector2.zero()); + game.camera.zoom = 4.1; }, verify: (game, tester) async { - plunger.pullFor(2); - game.update(0); - - expect(plunger.body.linearVelocity.y, isPositive); - - // Call game update at 120 FPS, so that the plunger will act as if it - // was pulled for 2 seconds. - for (var i = 0.0; i < 2; i += 1 / 120) { - game.update(1 / 20); - } - - expect(plunger.body.linearVelocity.y, isZero); + final plunger = game.descendants().whereType().first; + final bloc = plunger + .descendants() + .whereType>() + .single + .bloc; + bloc.pulled(); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenPath}pull.png'), + ); }, ); - }); - - group('pull', () { - late Plunger plunger; - - setUp(() { - plunger = Plunger(); - }); - flameTester.test( - 'moves downwards when pull is called', - (game) async { - await game.ensureAdd(plunger); - plunger.pull(); - - expect(plunger.body.linearVelocity.y, isPositive); - expect(plunger.body.linearVelocity.x, isZero); + flameTester.testGameWidget( + 'releasing', + setUp: (game, tester) async { + await game.ensureAdd(Plunger()); + game.camera.followVector2(Vector2.zero()); + game.camera.zoom = 4.1; }, - ); - - flameTester.test( - 'moves downwards when pull is called ' - 'and plunger is below its starting position', (game) async { - await game.ensureAdd(plunger); - plunger.pull(); - plunger.release(); - plunger.pull(); - - expect(plunger.body.linearVelocity.y, isPositive); - expect(plunger.body.linearVelocity.x, isZero); - }); - }); - - group('release', () { - late Plunger plunger; - - setUp(() { - plunger = Plunger(); - }); - - flameTester.test( - 'moves upwards when release is called ' - 'and plunger is below its starting position', (game) async { - await game.ensureAdd(plunger); - plunger.body.setTransform(Vector2(0, 1), 0); - plunger.release(); - - expect(plunger.body.linearVelocity.y, isNegative); - expect(plunger.body.linearVelocity.x, isZero); - }); - - flameTester.test( - 'does not move when release is called ' - 'and plunger is in its starting position', - (game) async { - await game.ensureAdd(plunger); - plunger.release(); - - expect(plunger.body.linearVelocity.y, isZero); - expect(plunger.body.linearVelocity.x, isZero); + verify: (game, tester) async { + final plunger = game.descendants().whereType().first; + final bloc = plunger + .descendants() + .whereType>() + .single + .bloc; + bloc.released(); + await tester.pump(); + await expectLater( + find.byGame(), + matchesGoldenFile('${goldenPath}release.png'), + ); }, ); }); - }); - + // group('body', () { + // test('is dynamic', () { + // final body = Plunger.test().createBody(); + // expect(body.bodyType, equals(BodyType.dynamic)); + // }); + + // test('ignores gravity', () { + // final body = Plunger().createBody(); + // expect(body.gravityScale, equals(Vector2.zero())); + // }); + // }); + + // group('fixture', () { + // test('exists', () async { + // final body = Plunger().createBody(); + // expect(body.fixtures[0], isA()); + // }); + + // test('has density', () { + // final body = Plunger().createBody(); + // final fixture = body.fixtures[0]; + // expect(fixture.density, greaterThan(0)); + // }); + // }); + }); +}