From baf06ca7372eb5ef5927ef888785b2bbf8a06c94 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Mon, 11 Apr 2022 23:25:33 +0100 Subject: [PATCH] feat: implements `GoogleLetter` (#172) * feat: implementing GoogleLetter * feat: implemented GoogleLetterGame * feat: included temp assets * feat: exported google_letter * feat: defined GoogleLetterActivationEffect * feat: included story * feat: included activate and deactivate tests * refactor: simplified GoogleLetter * refactor: updated constructor * refactor: removed condition * feat: included GoogleLetterOrder * feat: updated constructor * refactor: removed extension for index * refactor: removed unnecessary async Co-authored-by: Erick * refactor: removed unnecessary async Co-authored-by: Erick * Update packages/pinball_components/lib/src/components/google_letter.dart Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> * refactor: changed method typo Co-authored-by: Erick Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> --- .../assets/images/google_word/letter1.png | Bin 0 -> 371 bytes .../assets/images/google_word/letter2.png | Bin 0 -> 371 bytes .../assets/images/google_word/letter3.png | Bin 0 -> 371 bytes .../assets/images/google_word/letter4.png | Bin 0 -> 371 bytes .../assets/images/google_word/letter5.png | Bin 0 -> 313 bytes .../assets/images/google_word/letter6.png | Bin 0 -> 343 bytes .../lib/gen/assets.gen.dart | 90 +++++++++++++ .../lib/src/components/components.dart | 1 + .../lib/src/components/google_letter.dart | 95 +++++++++++++ packages/pinball_components/pubspec.yaml | 1 + .../pinball_components/sandbox/lib/main.dart | 1 + .../lib/stories/ball/basic_ball_game.dart | 2 +- .../google_word/google_letter_game.dart | 36 +++++ .../lib/stories/google_word/stories.dart | 15 +++ .../sandbox/lib/stories/stories.dart | 1 + .../src/components/google_letter_test.dart | 126 ++++++++++++++++++ 16 files changed, 367 insertions(+), 1 deletion(-) create mode 100644 packages/pinball_components/assets/images/google_word/letter1.png create mode 100644 packages/pinball_components/assets/images/google_word/letter2.png create mode 100644 packages/pinball_components/assets/images/google_word/letter3.png create mode 100644 packages/pinball_components/assets/images/google_word/letter4.png create mode 100644 packages/pinball_components/assets/images/google_word/letter5.png create mode 100644 packages/pinball_components/assets/images/google_word/letter6.png create mode 100644 packages/pinball_components/lib/src/components/google_letter.dart create mode 100644 packages/pinball_components/sandbox/lib/stories/google_word/google_letter_game.dart create mode 100644 packages/pinball_components/sandbox/lib/stories/google_word/stories.dart create mode 100644 packages/pinball_components/test/src/components/google_letter_test.dart diff --git a/packages/pinball_components/assets/images/google_word/letter1.png b/packages/pinball_components/assets/images/google_word/letter1.png new file mode 100644 index 0000000000000000000000000000000000000000..f79ea687beff562a109aad3689f00602dbf8dc73 GIT binary patch literal 371 zcmV-(0gV2MP)k`P9h_?fjWV1pibZj=mfGsbpmjL`UB~~NmCHb-J`wI{H94;B9B?3 z1RQ_?RwzIQQZT1J!=y+YY!AFh+9zZN2({V#OUN&XfzwDKN8*Iy(8LTJfeDLctThE| zUk*#K1ZVJ+{*F{jstV(C_pP=En~$+L9AQdY=V7$zr+h4@ck5jgR3=A9lx&I`x0_8Y7T^vIy7}ri|6l^l!aaHC%!Lfr;`2owi z18kcbtr~YVN*DMv_$l}Wm>uB#z<&7V2a$BxJcp)$0JK#04&14M#2~ zDPx|l6envY{YibCGdZ2icGq+6WW888Q}fE?FHRft6F7?!{v@epvnmwNP2>$*z`(zO zEj>v0rBToMyIZ5U`oeZIPW&_VMNps4HKonYd`n|rTy$-Gwol};vJ(Roo5jgR3=A9lx&I`x0_8Y7T^vIy7}ri|6l^l!aaHC%!Lfr;`2owi z18kcbtr~YVN*DMv_$l}Wm>uB#z<&7V2a$BxJcp)$0JK#04&14M#2~ zDPx|l6envY{YibCGdZ2icGq+6WW888Q}fE?FHRft6F7?!{v@epvnmwNP2>$*z`(zO zEj>v0rBToMyIZ5U`oeZIPW&_VMNps4HKonYd`n|rTy$-Gwol};vJ(Rook`P9h_?fjWV1pibZj=mfGsbpmjL`UB~~NmCHb-J`wI{H94;B9B?3 z1RQ_?RwzIQQZT1J!=y+YY!AFh+9zZN2({V#OUN&XfzwDKN8*Iy(8LTJfeDLctThE| zUk*#K1ZVJ+{*F{jstV(C_pP=En~$+L9AQdY=V7$zr+h4@ck5jgR3=A9lx&I`x0{Q1WT^vIy7}rjD%iCli;;Qd+fFnmi`2kzs z0S>FiU5&~+8Vi|Z8hKx_ZD72&e68Zbc!&I=x(hab-WBT`RFwlJO9!T0`LaZnS5tti z+w1Qk2?w)GCnZtESw()To49ut#A_N|aSPemCGzrdO74dc-pt4T;ZMH2ouI}(G1OzS zk^7;J9EVvvO0OrV%{?)1UzhOB>~-%pm9y~a-ect?T1f64XP=k!jTQ9qh*b*9C`zU=<~XD8U-W=4f273b6fea7JF>gTe~ HDWM4f>tAzq literal 0 HcmV?d00001 diff --git a/packages/pinball_components/assets/images/google_word/letter6.png b/packages/pinball_components/assets/images/google_word/letter6.png new file mode 100644 index 0000000000000000000000000000000000000000..7d87654bdea5558b3dc5bd2886cbe6b315e53ddf GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQ&H|6fVg?3opai!tBg3pY55jgR3=A9lx&I`x0{L$|T^vIy7}rkWLpqvG-FarFznPj$8^%+PQ`ncUcZ^bi3LY@PK&x;@H|F4+cDH-%2A0sCl^bf zy}xOa_vO0w!WFfr!*55O)i>Ev*%l(R>cpIn#s const $AssetsImagesBackboardGen(); + + /// File path: assets/images/ball.png AssetGenImage get ball => const AssetGenImage('assets/images/ball.png'); + $AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen(); $AssetsImagesBoundaryGen get boundary => const $AssetsImagesBoundaryGen(); $AssetsImagesChromeDinoGen get chromeDino => @@ -18,8 +23,13 @@ class $AssetsImagesGen { const $AssetsImagesDashBumperGen(); $AssetsImagesDinoGen get dino => const $AssetsImagesDinoGen(); $AssetsImagesFlipperGen get flipper => const $AssetsImagesFlipperGen(); + + /// File path: assets/images/flutter_sign_post.png AssetGenImage get flutterSignPost => const AssetGenImage('assets/images/flutter_sign_post.png'); + + $AssetsImagesGoogleWordGen get googleWord => + const $AssetsImagesGoogleWordGen(); $AssetsImagesKickerGen get kicker => const $AssetsImagesKickerGen(); $AssetsImagesLaunchRampGen get launchRamp => const $AssetsImagesLaunchRampGen(); @@ -31,8 +41,11 @@ class $AssetsImagesGen { class $AssetsImagesBackboardGen { const $AssetsImagesBackboardGen(); + /// File path: assets/images/backboard/backboard_game_over.png AssetGenImage get backboardGameOver => const AssetGenImage('assets/images/backboard/backboard_game_over.png'); + + /// File path: assets/images/backboard/backboard_scores.png AssetGenImage get backboardScores => const AssetGenImage('assets/images/backboard/backboard_scores.png'); } @@ -40,8 +53,11 @@ class $AssetsImagesBackboardGen { class $AssetsImagesBaseboardGen { const $AssetsImagesBaseboardGen(); + /// File path: assets/images/baseboard/left.png AssetGenImage get left => const AssetGenImage('assets/images/baseboard/left.png'); + + /// File path: assets/images/baseboard/right.png AssetGenImage get right => const AssetGenImage('assets/images/baseboard/right.png'); } @@ -49,8 +65,11 @@ class $AssetsImagesBaseboardGen { class $AssetsImagesBoundaryGen { const $AssetsImagesBoundaryGen(); + /// File path: assets/images/boundary/bottom.png AssetGenImage get bottom => const AssetGenImage('assets/images/boundary/bottom.png'); + + /// File path: assets/images/boundary/outer.png AssetGenImage get outer => const AssetGenImage('assets/images/boundary/outer.png'); } @@ -58,8 +77,11 @@ class $AssetsImagesBoundaryGen { class $AssetsImagesChromeDinoGen { const $AssetsImagesChromeDinoGen(); + /// File path: assets/images/chrome_dino/head.png AssetGenImage get head => const AssetGenImage('assets/images/chrome_dino/head.png'); + + /// File path: assets/images/chrome_dino/mouth.png AssetGenImage get mouth => const AssetGenImage('assets/images/chrome_dino/mouth.png'); } @@ -76,8 +98,11 @@ class $AssetsImagesDashBumperGen { class $AssetsImagesDinoGen { const $AssetsImagesDinoGen(); + /// File path: assets/images/dino/dino-land-bottom.png AssetGenImage get dinoLandBottom => const AssetGenImage('assets/images/dino/dino-land-bottom.png'); + + /// File path: assets/images/dino/dino-land-top.png AssetGenImage get dinoLandTop => const AssetGenImage('assets/images/dino/dino-land-top.png'); } @@ -85,17 +110,51 @@ class $AssetsImagesDinoGen { class $AssetsImagesFlipperGen { const $AssetsImagesFlipperGen(); + /// File path: assets/images/flipper/left.png AssetGenImage get left => const AssetGenImage('assets/images/flipper/left.png'); + + /// File path: assets/images/flipper/right.png AssetGenImage get right => const AssetGenImage('assets/images/flipper/right.png'); } +class $AssetsImagesGoogleWordGen { + const $AssetsImagesGoogleWordGen(); + + /// File path: assets/images/google_word/letter1.png + AssetGenImage get letter1 => + const AssetGenImage('assets/images/google_word/letter1.png'); + + /// File path: assets/images/google_word/letter2.png + AssetGenImage get letter2 => + const AssetGenImage('assets/images/google_word/letter2.png'); + + /// File path: assets/images/google_word/letter3.png + AssetGenImage get letter3 => + const AssetGenImage('assets/images/google_word/letter3.png'); + + /// File path: assets/images/google_word/letter4.png + AssetGenImage get letter4 => + const AssetGenImage('assets/images/google_word/letter4.png'); + + /// File path: assets/images/google_word/letter5.png + AssetGenImage get letter5 => + const AssetGenImage('assets/images/google_word/letter5.png'); + + /// File path: assets/images/google_word/letter6.png + AssetGenImage get letter6 => + const AssetGenImage('assets/images/google_word/letter6.png'); +} + class $AssetsImagesKickerGen { const $AssetsImagesKickerGen(); + /// File path: assets/images/kicker/left.png AssetGenImage get left => const AssetGenImage('assets/images/kicker/left.png'); + + /// File path: assets/images/kicker/right.png AssetGenImage get right => const AssetGenImage('assets/images/kicker/right.png'); } @@ -103,8 +162,11 @@ class $AssetsImagesKickerGen { class $AssetsImagesLaunchRampGen { const $AssetsImagesLaunchRampGen(); + /// File path: assets/images/launch_ramp/foreground-railing.png AssetGenImage get foregroundRailing => const AssetGenImage('assets/images/launch_ramp/foreground-railing.png'); + + /// File path: assets/images/launch_ramp/ramp.png AssetGenImage get ramp => const AssetGenImage('assets/images/launch_ramp/ramp.png'); } @@ -112,12 +174,19 @@ class $AssetsImagesLaunchRampGen { class $AssetsImagesSlingshotGen { const $AssetsImagesSlingshotGen(); + /// File path: assets/images/slingshot/left_lower.png AssetGenImage get leftLower => const AssetGenImage('assets/images/slingshot/left_lower.png'); + + /// File path: assets/images/slingshot/left_upper.png AssetGenImage get leftUpper => const AssetGenImage('assets/images/slingshot/left_upper.png'); + + /// File path: assets/images/slingshot/right_lower.png AssetGenImage get rightLower => const AssetGenImage('assets/images/slingshot/right_lower.png'); + + /// File path: assets/images/slingshot/right_upper.png AssetGenImage get rightUpper => const AssetGenImage('assets/images/slingshot/right_upper.png'); } @@ -125,12 +194,16 @@ class $AssetsImagesSlingshotGen { class $AssetsImagesSpaceshipGen { const $AssetsImagesSpaceshipGen(); + /// File path: assets/images/spaceship/bridge.png AssetGenImage get bridge => const AssetGenImage('assets/images/spaceship/bridge.png'); + $AssetsImagesSpaceshipRailGen get rail => const $AssetsImagesSpaceshipRailGen(); $AssetsImagesSpaceshipRampGen get ramp => const $AssetsImagesSpaceshipRampGen(); + + /// File path: assets/images/spaceship/saucer.png AssetGenImage get saucer => const AssetGenImage('assets/images/spaceship/saucer.png'); } @@ -147,8 +220,11 @@ class $AssetsImagesSparkyGen { class $AssetsImagesDashBumperAGen { const $AssetsImagesDashBumperAGen(); + /// File path: assets/images/dash_bumper/a/active.png AssetGenImage get active => const AssetGenImage('assets/images/dash_bumper/a/active.png'); + + /// File path: assets/images/dash_bumper/a/inactive.png AssetGenImage get inactive => const AssetGenImage('assets/images/dash_bumper/a/inactive.png'); } @@ -156,8 +232,11 @@ class $AssetsImagesDashBumperAGen { class $AssetsImagesDashBumperBGen { const $AssetsImagesDashBumperBGen(); + /// File path: assets/images/dash_bumper/b/active.png AssetGenImage get active => const AssetGenImage('assets/images/dash_bumper/b/active.png'); + + /// File path: assets/images/dash_bumper/b/inactive.png AssetGenImage get inactive => const AssetGenImage('assets/images/dash_bumper/b/inactive.png'); } @@ -165,8 +244,11 @@ class $AssetsImagesDashBumperBGen { class $AssetsImagesDashBumperMainGen { const $AssetsImagesDashBumperMainGen(); + /// File path: assets/images/dash_bumper/main/active.png AssetGenImage get active => const AssetGenImage('assets/images/dash_bumper/main/active.png'); + + /// File path: assets/images/dash_bumper/main/inactive.png AssetGenImage get inactive => const AssetGenImage('assets/images/dash_bumper/main/inactive.png'); } @@ -174,8 +256,11 @@ class $AssetsImagesDashBumperMainGen { class $AssetsImagesSpaceshipRailGen { const $AssetsImagesSpaceshipRailGen(); + /// File path: assets/images/spaceship/rail/foreground.png AssetGenImage get foreground => const AssetGenImage('assets/images/spaceship/rail/foreground.png'); + + /// File path: assets/images/spaceship/rail/main.png AssetGenImage get main => const AssetGenImage('assets/images/spaceship/rail/main.png'); } @@ -183,10 +268,15 @@ class $AssetsImagesSpaceshipRailGen { class $AssetsImagesSpaceshipRampGen { const $AssetsImagesSpaceshipRampGen(); + /// File path: assets/images/spaceship/ramp/main.png AssetGenImage get main => const AssetGenImage('assets/images/spaceship/ramp/main.png'); + + /// File path: assets/images/spaceship/ramp/railing-background.png AssetGenImage get railingBackground => const AssetGenImage( 'assets/images/spaceship/ramp/railing-background.png'); + + /// File path: assets/images/spaceship/ramp/railing-foreground.png AssetGenImage get railingForeground => const AssetGenImage( 'assets/images/spaceship/ramp/railing-foreground.png'); } diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index 4b2b41e7..8dca7549 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -11,6 +11,7 @@ export 'dino_walls.dart'; export 'fire_effect.dart'; export 'flipper.dart'; export 'flutter_sign_post.dart'; +export 'google_letter.dart'; export 'initial_position.dart'; export 'joint_anchor.dart'; export 'kicker.dart'; diff --git a/packages/pinball_components/lib/src/components/google_letter.dart b/packages/pinball_components/lib/src/components/google_letter.dart new file mode 100644 index 00000000..9e9e2dec --- /dev/null +++ b/packages/pinball_components/lib/src/components/google_letter.dart @@ -0,0 +1,95 @@ +import 'package:flame/components.dart'; +import 'package:flame/effects.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; + +/// {@template google_letter} +/// Circular sensor that represents a letter in "GOOGLE" for a given index. +/// {@endtemplate} +class GoogleLetter extends BodyComponent with InitialPosition { + /// {@macro google_letter} + GoogleLetter(int index) + : _sprite = _GoogleLetterSprite( + _GoogleLetterSprite.spritePaths[index], + ); + + final _GoogleLetterSprite _sprite; + + /// Activates this [GoogleLetter]. + // TODO(alestiago): Improve doc comment once activate and deactivate + // are implemented with the actual assets. + Future activate() => _sprite.activate(); + + /// Deactivates this [GoogleLetter]. + Future deactivate() => _sprite.deactivate(); + + @override + Future onLoad() async { + await super.onLoad(); + await add(_sprite); + } + + @override + Body createBody() { + final shape = CircleShape()..radius = 1.85; + final fixtureDef = FixtureDef(shape)..isSensor = true; + + final bodyDef = BodyDef() + ..position = initialPosition + ..userData = this + ..type = BodyType.static; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } +} + +class _GoogleLetterSprite extends SpriteComponent with HasGameRef { + _GoogleLetterSprite(String path) : _path = path; + + static final spritePaths = [ + 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, + ]; + + final String _path; + + // TODO(alestiago): Correctly implement activate and deactivate once the + // assets are provided. + Future activate() async { + await add( + _GoogleLetterColorEffect(color: Colors.green), + ); + } + + Future deactivate() async { + await add( + _GoogleLetterColorEffect(color: Colors.red), + ); + } + + @override + Future onLoad() async { + await super.onLoad(); + + final sprite = await gameRef.loadSprite(_path); + this.sprite = sprite; + // TODO(alestiago): Size correctly once the assets are provided. + size = sprite.originalSize / 5; + anchor = Anchor.center; + } +} + +class _GoogleLetterColorEffect extends ColorEffect { + _GoogleLetterColorEffect({ + required Color color, + }) : super( + color, + const Offset(0, 1), + EffectController(duration: 0.25), + ); +} diff --git a/packages/pinball_components/pubspec.yaml b/packages/pinball_components/pubspec.yaml index 7a5d3e49..72263d1d 100644 --- a/packages/pinball_components/pubspec.yaml +++ b/packages/pinball_components/pubspec.yaml @@ -55,6 +55,7 @@ flutter: - assets/images/sparky/bumper/b/ - assets/images/sparky/bumper/c/ - assets/images/backboard/ + - assets/images/google_word/ flutter_gen: line_length: 80 diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart index 1c9c9c25..193a0d8f 100644 --- a/packages/pinball_components/sandbox/lib/main.dart +++ b/packages/pinball_components/sandbox/lib/main.dart @@ -25,6 +25,7 @@ void main() { addSparkyBumperStories(dashbook); addZoomStories(dashbook); addBoundariesStories(dashbook); + addGoogleWordStories(dashbook); addSpaceshipRampStories(dashbook); addSpaceshipRailStories(dashbook); addLaunchRampStories(dashbook); diff --git a/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart b/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart index bfc7a9b0..4fbeae1b 100644 --- a/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart +++ b/packages/pinball_components/sandbox/lib/stories/ball/basic_ball_game.dart @@ -13,7 +13,7 @@ class BasicBallGame extends BasicGame with TapDetector, Traceable { static const info = ''' Shows how a Ball works. - Tap anywhere on the screen to spawn a ball into the game. + - Tap anywhere on the screen to spawn a ball into the game. '''; final Color color; diff --git a/packages/pinball_components/sandbox/lib/stories/google_word/google_letter_game.dart b/packages/pinball_components/sandbox/lib/stories/google_word/google_letter_game.dart new file mode 100644 index 00000000..ad6e556b --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/google_word/google_letter_game.dart @@ -0,0 +1,36 @@ +import 'dart:ui'; + +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flutter/material.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:sandbox/stories/ball/basic_ball_game.dart'; + +class GoogleLetterGame extends BasicBallGame { + GoogleLetterGame() : super(color: const Color(0xFF009900)); + + static const info = ''' + Shows how a GoogleLetter is rendered. + + - Tap anywhere on the screen to spawn a ball into the game. +'''; + + @override + Future onLoad() async { + await super.onLoad(); + addContactCallback(_BallGoogleLetterContactCallback()); + + camera.followVector2(Vector2.zero()); + await add(GoogleLetter(0)); + + await traceAllBodies(); + } +} + +class _BallGoogleLetterContactCallback + extends ContactCallback { + @override + void begin(Ball a, GoogleLetter b, Contact contact) { + super.begin(a, b, contact); + b.activate(); + } +} diff --git a/packages/pinball_components/sandbox/lib/stories/google_word/stories.dart b/packages/pinball_components/sandbox/lib/stories/google_word/stories.dart new file mode 100644 index 00000000..290bf9dd --- /dev/null +++ b/packages/pinball_components/sandbox/lib/stories/google_word/stories.dart @@ -0,0 +1,15 @@ +import 'package:dashbook/dashbook.dart'; +import 'package:flame/game.dart'; +import 'package:sandbox/common/common.dart'; +import 'package:sandbox/stories/google_word/google_letter_game.dart'; + +void addGoogleWordStories(Dashbook dashbook) { + dashbook.storiesOf('Google Word').add( + 'Letter', + (context) => GameWidget( + game: GoogleLetterGame()..trace = context.boolProperty('Trace', true), + ), + codeLink: buildSourceLink('google_word/letter.dart'), + info: GoogleLetterGame.info, + ); +} diff --git a/packages/pinball_components/sandbox/lib/stories/stories.dart b/packages/pinball_components/sandbox/lib/stories/stories.dart index b4400500..0a795ec7 100644 --- a/packages/pinball_components/sandbox/lib/stories/stories.dart +++ b/packages/pinball_components/sandbox/lib/stories/stories.dart @@ -5,6 +5,7 @@ export 'chrome_dino/stories.dart'; export 'effects/stories.dart'; export 'flipper/stories.dart'; export 'flutter_forest/stories.dart'; +export 'google_word/stories.dart'; export 'launch_ramp/stories.dart'; export 'layer/stories.dart'; export 'score_text/stories.dart'; diff --git a/packages/pinball_components/test/src/components/google_letter_test.dart b/packages/pinball_components/test/src/components/google_letter_test.dart new file mode 100644 index 00000000..cdfd3c4a --- /dev/null +++ b/packages/pinball_components/test/src/components/google_letter_test.dart @@ -0,0 +1,126 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame/effects.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() { + TestWidgetsFlutterBinding.ensureInitialized(); + final flameTester = FlameTester(TestGame.new); + + group('Google Letter', () { + flameTester.test( + '0th loads correctly', + (game) async { + final googleLetter = GoogleLetter(0); + await game.ready(); + await game.ensureAdd(googleLetter); + + expect(game.contains(googleLetter), isTrue); + }, + ); + + flameTester.test( + '1st loads correctly', + (game) async { + final googleLetter = GoogleLetter(1); + await game.ready(); + await game.ensureAdd(googleLetter); + + expect(game.contains(googleLetter), isTrue); + }, + ); + + flameTester.test( + '2nd loads correctly', + (game) async { + final googleLetter = GoogleLetter(2); + await game.ready(); + await game.ensureAdd(googleLetter); + + expect(game.contains(googleLetter), isTrue); + }, + ); + + flameTester.test( + '3d loads correctly', + (game) async { + final googleLetter = GoogleLetter(3); + await game.ready(); + await game.ensureAdd(googleLetter); + + expect(game.contains(googleLetter), isTrue); + }, + ); + + flameTester.test( + '4th loads correctly', + (game) async { + final googleLetter = GoogleLetter(4); + await game.ready(); + await game.ensureAdd(googleLetter); + + expect(game.contains(googleLetter), isTrue); + }, + ); + + flameTester.test( + '5th loads correctly', + (game) async { + final googleLetter = GoogleLetter(5); + await game.ready(); + await game.ensureAdd(googleLetter); + + expect(game.contains(googleLetter), isTrue); + }, + ); + + test('throws error when index out of range', () { + expect(() => GoogleLetter(-1), throwsA(isA())); + expect(() => GoogleLetter(6), throwsA(isA())); + }); + + group('activate', () { + flameTester.test('returns normally', (game) async { + final googleLetter = GoogleLetter(0); + await game.ensureAdd(googleLetter); + await expectLater(googleLetter.activate, returnsNormally); + }); + + flameTester.test('adds an Effect', (game) async { + final googleLetter = GoogleLetter(0); + await game.ensureAdd(googleLetter); + await googleLetter.activate(); + await game.ready(); + + expect( + googleLetter.descendants().whereType().length, + equals(1), + ); + }); + }); + + group('deactivate', () { + flameTester.test('returns normally', (game) async { + final googleLetter = GoogleLetter(0); + await game.ensureAdd(googleLetter); + await expectLater(googleLetter.deactivate, returnsNormally); + }); + + flameTester.test('adds an Effect', (game) async { + final googleLetter = GoogleLetter(0); + await game.ensureAdd(googleLetter); + await googleLetter.deactivate(); + await game.ready(); + + expect( + googleLetter.descendants().whereType().length, + equals(1), + ); + }); + }); + }); +}