From be299bcd51a68d3993e814be39519a71aef84f61 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Wed, 2 Mar 2022 09:40:37 +0000 Subject: [PATCH 1/2] chore: included dependecy on flame_test (#5) --- pubspec.lock | 7 +++++++ pubspec.yaml | 1 + 2 files changed, 8 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index 55901a4e..cff109ca 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -148,6 +148,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.9.0-releasecandidate.1" + flame_test: + dependency: "direct dev" + description: + name: flame_test + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 2bd5be03..3730daa3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,7 @@ dependencies: dev_dependencies: bloc_test: ^9.0.2 + flame_test: ^1.1.0 flutter_test: sdk: flutter mockingjay: ^0.2.0 From 0d27b7f762955f9f7738e095a048fe7362e3e443 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Wed, 2 Mar 2022 13:47:46 +0000 Subject: [PATCH 2/2] feat: included initial Ball body component (#6) * feat: included initial ball body component * feat: included loads correctly test * chore: moved test to correct directory * refactor: replaced vector instances * refactor: modified exists test * refactor: reused flameTester --- lib/game/components/ball.dart | 28 ++++++++++ lib/game/components/components.dart | 1 + lib/game/game.dart | 1 + test/game/components/ball_test.dart | 83 +++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 lib/game/components/ball.dart create mode 100644 lib/game/components/components.dart create mode 100644 test/game/components/ball_test.dart diff --git a/lib/game/components/ball.dart b/lib/game/components/ball.dart new file mode 100644 index 00000000..ce2e4335 --- /dev/null +++ b/lib/game/components/ball.dart @@ -0,0 +1,28 @@ +import 'package:flame_forge2d/body_component.dart'; +import 'package:flutter/material.dart'; +import 'package:forge2d/forge2d.dart'; + +class Ball extends BodyComponent { + Ball({ + required Vector2 position, + }) : _position = position { + // TODO(alestiago): Use asset instead of color when provided. + paint = Paint()..color = const Color(0xFFFFFFFF); + } + + final Vector2 _position; + + @override + Body createBody() { + final shape = CircleShape()..radius = 2; + + final fixtureDef = FixtureDef(shape)..density = 1; + + final bodyDef = BodyDef() + ..userData = this + ..position = _position + ..type = BodyType.dynamic; + + return world.createBody(bodyDef)..createFixture(fixtureDef); + } +} diff --git a/lib/game/components/components.dart b/lib/game/components/components.dart new file mode 100644 index 00000000..6a26208c --- /dev/null +++ b/lib/game/components/components.dart @@ -0,0 +1 @@ +export 'ball.dart'; diff --git a/lib/game/game.dart b/lib/game/game.dart index ec8e0824..0a8dac1b 100644 --- a/lib/game/game.dart +++ b/lib/game/game.dart @@ -1,2 +1,3 @@ +export 'components/components.dart'; export 'pinball_game.dart'; export 'view/pinball_game_page.dart'; diff --git a/test/game/components/ball_test.dart b/test/game/components/ball_test.dart new file mode 100644 index 00000000..c4576c68 --- /dev/null +++ b/test/game/components/ball_test.dart @@ -0,0 +1,83 @@ +// 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/game/game.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('Ball', () { + final flameTester = FlameTester(PinballGame.new); + + flameTester.test( + 'loads correctly', + (game) async { + final ball = Ball(position: Vector2.zero()); + await game.ensureAdd(ball); + + expect(game.contains(ball), isTrue); + }, + ); + + group('body', () { + flameTester.test( + 'positions correctly', + (game) async { + final position = Vector2.all(10); + final ball = Ball(position: position); + await game.ensureAdd(ball); + game.contains(ball); + + expect(ball.body.position, position); + }, + ); + + flameTester.test( + 'is dynamic', + (game) async { + final ball = Ball(position: Vector2.zero()); + await game.ensureAdd(ball); + + expect(ball.body.bodyType, equals(BodyType.dynamic)); + }, + ); + }); + + group('first fixture', () { + flameTester.test( + 'exists', + (game) async { + final ball = Ball(position: Vector2.zero()); + await game.ensureAdd(ball); + + expect(ball.body.fixtures[0], isA()); + }, + ); + + flameTester.test( + 'is dense', + (game) async { + final ball = Ball(position: Vector2.zero()); + await game.ensureAdd(ball); + + final fixture = ball.body.fixtures[0]; + expect(fixture.density, greaterThan(0)); + }, + ); + + flameTester.test( + 'shape is circular', + (game) async { + final ball = Ball(position: Vector2.zero()); + await game.ensureAdd(ball); + + final fixture = ball.body.fixtures[0]; + expect(fixture.shape.shapeType, equals(ShapeType.circle)); + expect(fixture.shape.radius, equals(2)); + }, + ); + }); + }); +}