refactor: alien to android (#246)

Co-authored-by: Alejandro Santiago <dev@alestiago.com>
pull/249/head
Allison Ryan 3 years ago committed by GitHub
parent 46e9152225
commit c33d34e42f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -5,25 +5,30 @@ import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template alien_zone}
/// Area positioned below [Spaceship] where the [Ball]
/// can bounce off [AlienBumper]s.
/// {@template android_acres}
/// Area positioned on the left side of the board containing the [Spaceship],
/// [SpaceshipRamp], [SpaceshipRail], and [AndroidBumper]s.
/// {@endtemplate}
class AlienZone extends Blueprint {
/// {@macro alien_zone}
AlienZone()
class AndroidAcres extends Blueprint {
/// {@macro android_acres}
AndroidAcres()
: super(
components: [
AlienBumper.a(
AndroidBumper.a(
children: [
ScoringBehavior(points: 20),
],
)..initialPosition = Vector2(-32.52, -9.1),
AlienBumper.b(
AndroidBumper.b(
children: [
ScoringBehavior(points: 20),
],
)..initialPosition = Vector2(-22.89, -17.35),
],
blueprints: [
SpaceshipRamp(),
Spaceship(position: Vector2(-26.5, -28.5)),
SpaceshipRail(),
],
);
}

@ -1,4 +1,4 @@
export 'alien_zone.dart';
export 'android_acres.dart';
export 'board.dart';
export 'camera_controller.dart';
export 'controlled_ball.dart';

@ -77,10 +77,10 @@ extension PinballGameAssetsX on PinballGame {
),
images.load(components.Assets.images.spaceship.rail.main.keyName),
images.load(components.Assets.images.spaceship.rail.foreground.keyName),
images.load(components.Assets.images.alienBumper.a.active.keyName),
images.load(components.Assets.images.alienBumper.a.inactive.keyName),
images.load(components.Assets.images.alienBumper.b.active.keyName),
images.load(components.Assets.images.alienBumper.b.inactive.keyName),
images.load(components.Assets.images.androidBumper.a.lit.keyName),
images.load(components.Assets.images.androidBumper.a.dimmed.keyName),
images.load(components.Assets.images.androidBumper.b.lit.keyName),
images.load(components.Assets.images.androidBumper.b.dimmed.keyName),
images.load(components.Assets.images.chromeDino.mouth.keyName),
images.load(components.Assets.images.chromeDino.head.keyName),
images.load(components.Assets.images.sparky.computer.top.keyName),

@ -53,20 +53,10 @@ class PinballGame extends Forge2DGame
final launcher = Launcher();
unawaited(addFromBlueprint(launcher));
unawaited(add(Board()));
await addFromBlueprint(AlienZone());
await addFromBlueprint(SparkyFireZone());
await addFromBlueprint(AndroidAcres());
unawaited(addFromBlueprint(Slingshots()));
unawaited(addFromBlueprint(DinoWalls()));
unawaited(addFromBlueprint(SpaceshipRamp()));
unawaited(
addFromBlueprint(
Spaceship(
position: Vector2(-26.5, -28.5),
),
),
);
unawaited(addFromBlueprint(SpaceshipRail()));
await add(
GoogleWord(
position: Vector2(

@ -10,8 +10,8 @@ import 'package:flutter/widgets.dart';
class $AssetsImagesGen {
const $AssetsImagesGen();
$AssetsImagesAlienBumperGen get alienBumper =>
const $AssetsImagesAlienBumperGen();
$AssetsImagesAndroidBumperGen get androidBumper =>
const $AssetsImagesAndroidBumperGen();
$AssetsImagesBackboardGen get backboard => const $AssetsImagesBackboardGen();
$AssetsImagesBallGen get ball => const $AssetsImagesBallGen();
$AssetsImagesBaseboardGen get baseboard => const $AssetsImagesBaseboardGen();
@ -33,11 +33,13 @@ class $AssetsImagesGen {
$AssetsImagesSparkyGen get sparky => const $AssetsImagesSparkyGen();
}
class $AssetsImagesAlienBumperGen {
const $AssetsImagesAlienBumperGen();
class $AssetsImagesAndroidBumperGen {
const $AssetsImagesAndroidBumperGen();
$AssetsImagesAlienBumperAGen get a => const $AssetsImagesAlienBumperAGen();
$AssetsImagesAlienBumperBGen get b => const $AssetsImagesAlienBumperBGen();
$AssetsImagesAndroidBumperAGen get a =>
const $AssetsImagesAndroidBumperAGen();
$AssetsImagesAndroidBumperBGen get b =>
const $AssetsImagesAndroidBumperBGen();
}
class $AssetsImagesBackboardGen {
@ -269,28 +271,28 @@ class $AssetsImagesSparkyGen {
const $AssetsImagesSparkyComputerGen();
}
class $AssetsImagesAlienBumperAGen {
const $AssetsImagesAlienBumperAGen();
class $AssetsImagesAndroidBumperAGen {
const $AssetsImagesAndroidBumperAGen();
/// File path: assets/images/alien_bumper/a/active.png
AssetGenImage get active =>
const AssetGenImage('assets/images/alien_bumper/a/active.png');
/// File path: assets/images/android_bumper/a/dimmed.png
AssetGenImage get dimmed =>
const AssetGenImage('assets/images/android_bumper/a/dimmed.png');
/// File path: assets/images/alien_bumper/a/inactive.png
AssetGenImage get inactive =>
const AssetGenImage('assets/images/alien_bumper/a/inactive.png');
/// File path: assets/images/android_bumper/a/lit.png
AssetGenImage get lit =>
const AssetGenImage('assets/images/android_bumper/a/lit.png');
}
class $AssetsImagesAlienBumperBGen {
const $AssetsImagesAlienBumperBGen();
class $AssetsImagesAndroidBumperBGen {
const $AssetsImagesAndroidBumperBGen();
/// File path: assets/images/alien_bumper/b/active.png
AssetGenImage get active =>
const AssetGenImage('assets/images/alien_bumper/b/active.png');
/// File path: assets/images/android_bumper/b/dimmed.png
AssetGenImage get dimmed =>
const AssetGenImage('assets/images/android_bumper/b/dimmed.png');
/// File path: assets/images/alien_bumper/b/inactive.png
AssetGenImage get inactive =>
const AssetGenImage('assets/images/alien_bumper/b/inactive.png');
/// File path: assets/images/android_bumper/b/lit.png
AssetGenImage get lit =>
const AssetGenImage('assets/images/android_bumper/b/lit.png');
}
class $AssetsImagesDashBumperGen {

@ -1,2 +0,0 @@
export 'alien_bumper_ball_contact_behavior.dart';
export 'alien_bumper_blinking_behavior.dart';

@ -1,17 +0,0 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'alien_bumper_state.dart';
class AlienBumperCubit extends Cubit<AlienBumperState> {
AlienBumperCubit() : super(AlienBumperState.active);
void onBallContacted() {
emit(AlienBumperState.inactive);
}
void onBlinked() {
emit(AlienBumperState.active);
}
}

@ -1,10 +0,0 @@
part of 'alien_bumper_cubit.dart';
/// Indicates the [AlienBumperCubit]'s current state.
enum AlienBumperState {
/// A lit up bumper.
active,
/// A dimmed bumper.
inactive,
}

@ -4,71 +4,71 @@ import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart';
import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import 'package:pinball_flame/pinball_flame.dart';
export 'cubit/alien_bumper_cubit.dart';
export 'cubit/android_bumper_cubit.dart';
/// {@template alien_bumper}
/// {@template android_bumper}
/// Bumper for area under the [Spaceship].
/// {@endtemplate}
class AlienBumper extends BodyComponent with InitialPosition {
/// {@macro alien_bumper}
AlienBumper._({
class AndroidBumper extends BodyComponent with InitialPosition {
/// {@macro android_bumper}
AndroidBumper._({
required double majorRadius,
required double minorRadius,
required String onAssetPath,
required String offAssetPath,
required String litAssetPath,
required String dimmedAssetPath,
Iterable<Component>? children,
required this.bloc,
}) : _majorRadius = majorRadius,
_minorRadius = minorRadius,
super(
priority: RenderPriority.alienBumper,
priority: RenderPriority.androidBumper,
renderBody: false,
children: [
AlienBumperBallContactBehavior(),
AlienBumperBlinkingBehavior(),
_AlienBumperSpriteGroupComponent(
offAssetPath: offAssetPath,
onAssetPath: onAssetPath,
AndroidBumperBallContactBehavior(),
AndroidBumperBlinkingBehavior(),
_AndroidBumperSpriteGroupComponent(
dimmedAssetPath: dimmedAssetPath,
litAssetPath: litAssetPath,
state: bloc.state,
),
...?children,
],
);
/// {@macro alien_bumper}
AlienBumper.a({
/// {@macro android_bumper}
AndroidBumper.a({
Iterable<Component>? children,
}) : this._(
majorRadius: 3.52,
minorRadius: 2.97,
onAssetPath: Assets.images.alienBumper.a.active.keyName,
offAssetPath: Assets.images.alienBumper.a.inactive.keyName,
bloc: AlienBumperCubit(),
litAssetPath: Assets.images.androidBumper.a.lit.keyName,
dimmedAssetPath: Assets.images.androidBumper.a.dimmed.keyName,
bloc: AndroidBumperCubit(),
children: children,
);
/// {@macro alien_bumper}
AlienBumper.b({
/// {@macro android_bumper}
AndroidBumper.b({
Iterable<Component>? children,
}) : this._(
majorRadius: 3.19,
minorRadius: 2.79,
onAssetPath: Assets.images.alienBumper.b.active.keyName,
offAssetPath: Assets.images.alienBumper.b.inactive.keyName,
bloc: AlienBumperCubit(),
litAssetPath: Assets.images.androidBumper.b.lit.keyName,
dimmedAssetPath: Assets.images.androidBumper.b.dimmed.keyName,
bloc: AndroidBumperCubit(),
children: children,
);
/// Creates an [AlienBumper] without any children.
/// Creates an [AndroidBumper] without any children.
///
/// This can be used for testing [AlienBumper]'s behaviors in isolation.
/// This can be used for testing [AndroidBumper]'s behaviors in isolation.
// TODO(alestiago): Refactor injecting bloc once the following is merged:
// https://github.com/flame-engine/flame/pull/1538
@visibleForTesting
AlienBumper.test({
AndroidBumper.test({
required this.bloc,
}) : _majorRadius = 3.52,
_minorRadius = 2.97;
@ -80,7 +80,7 @@ class AlienBumper extends BodyComponent with InitialPosition {
// TODO(alestiago): Consider refactoring once the following is merged:
// https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs
final AlienBumperCubit bloc;
final AndroidBumperCubit bloc;
@override
void onRemove() {
@ -107,23 +107,23 @@ class AlienBumper extends BodyComponent with InitialPosition {
}
}
class _AlienBumperSpriteGroupComponent
extends SpriteGroupComponent<AlienBumperState>
with HasGameRef, ParentIsA<AlienBumper> {
_AlienBumperSpriteGroupComponent({
required String onAssetPath,
required String offAssetPath,
required AlienBumperState state,
}) : _onAssetPath = onAssetPath,
_offAssetPath = offAssetPath,
class _AndroidBumperSpriteGroupComponent
extends SpriteGroupComponent<AndroidBumperState>
with HasGameRef, ParentIsA<AndroidBumper> {
_AndroidBumperSpriteGroupComponent({
required String litAssetPath,
required String dimmedAssetPath,
required AndroidBumperState state,
}) : _litAssetPath = litAssetPath,
_dimmedAssetPath = dimmedAssetPath,
super(
anchor: Anchor.center,
position: Vector2(0, -0.1),
current: state,
);
final String _onAssetPath;
final String _offAssetPath;
final String _litAssetPath;
final String _dimmedAssetPath;
@override
Future<void> onLoad() async {
@ -131,11 +131,11 @@ class _AlienBumperSpriteGroupComponent
parent.bloc.stream.listen((state) => current = state);
final sprites = {
AlienBumperState.active: Sprite(
gameRef.images.fromCache(_onAssetPath),
AndroidBumperState.lit: Sprite(
gameRef.images.fromCache(_litAssetPath),
),
AlienBumperState.inactive:
Sprite(gameRef.images.fromCache(_offAssetPath)),
AndroidBumperState.dimmed:
Sprite(gameRef.images.fromCache(_dimmedAssetPath)),
};
this.sprites = sprites;
size = sprites[current]!.originalSize / 10;

@ -4,7 +4,7 @@ import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
class AlienBumperBallContactBehavior extends ContactBehavior<AlienBumper> {
class AndroidBumperBallContactBehavior extends ContactBehavior<AndroidBumper> {
@override
void beginContact(Object other, Contact contact) {
super.beginContact(other, contact);

@ -2,20 +2,20 @@ import 'package:flame/components.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
/// {@template alien_bumper_blinking_behavior}
/// Makes a [AlienBumper] blink back to [AlienBumperState.active] when
/// [AlienBumperState.inactive].
/// {@template android_bumper_blinking_behavior}
/// Makes an [AndroidBumper] blink back to [AndroidBumperState.lit] when
/// [AndroidBumperState.dimmed].
/// {@endtemplate}
class AlienBumperBlinkingBehavior extends TimerComponent
with ParentIsA<AlienBumper> {
/// {@macro alien_bumper_blinking_behavior}
AlienBumperBlinkingBehavior() : super(period: 0.05);
class AndroidBumperBlinkingBehavior extends TimerComponent
with ParentIsA<AndroidBumper> {
/// {@macro android_bumper_blinking_behavior}
AndroidBumperBlinkingBehavior() : super(period: 0.05);
void _onNewState(AlienBumperState state) {
void _onNewState(AndroidBumperState state) {
switch (state) {
case AlienBumperState.active:
case AndroidBumperState.lit:
break;
case AlienBumperState.inactive:
case AndroidBumperState.dimmed:
timer
..reset()
..start();

@ -0,0 +1,2 @@
export 'android_bumper_ball_contact_behavior.dart';
export 'android_bumper_blinking_behavior.dart';

@ -0,0 +1,17 @@
// ignore_for_file: public_member_api_docs
import 'package:bloc/bloc.dart';
part 'android_bumper_state.dart';
class AndroidBumperCubit extends Cubit<AndroidBumperState> {
AndroidBumperCubit() : super(AndroidBumperState.dimmed);
void onBallContacted() {
emit(AndroidBumperState.dimmed);
}
void onBlinked() {
emit(AndroidBumperState.lit);
}
}

@ -0,0 +1,8 @@
// ignore_for_file: public_member_api_docs
part of 'android_bumper_cubit.dart';
enum AndroidBumperState {
lit,
dimmed,
}

@ -1,4 +1,4 @@
export 'alien_bumper/alien_bumper.dart';
export 'android_bumper/android_bumper.dart';
export 'backboard/backboard.dart';
export 'ball.dart';
export 'baseboard.dart';

@ -83,7 +83,7 @@ abstract class RenderPriority {
static const int turboChargeFlame = _above + ballOnBoard;
// Android Spaceship
// Android Acres
static const int spaceshipRail = _above + bottomGroup;
@ -106,7 +106,7 @@ abstract class RenderPriority {
static const int spaceshipRampBoardOpening = _below + ballOnBoard;
static const int alienBumper = _above + ballOnBoard;
static const int androidBumper = _above + ballOnBoard;
// Score Text

@ -64,8 +64,8 @@ flutter:
- assets/images/kicker/
- assets/images/plunger/
- assets/images/slingshot/
- assets/images/alien_bumper/a/
- assets/images/alien_bumper/b/
- assets/images/android_bumper/a/
- assets/images/android_bumper/b/
- assets/images/sparky/
- assets/images/sparky/computer/
- assets/images/sparky/bumper/a/

@ -23,7 +23,7 @@ void main() {
addPlungerStories(dashbook);
addSlingshotStories(dashbook);
addSparkyBumperStories(dashbook);
addAlienZoneStories(dashbook);
addAndroidAcresStories(dashbook);
addBoundariesStories(dashbook);
addGoogleWordStories(dashbook);
addLaunchRampStories(dashbook);

@ -1,36 +0,0 @@
import 'package:dashbook/dashbook.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/alien_zone/alien_bumper_a_game.dart';
import 'package:sandbox/stories/alien_zone/alien_bumper_b_game.dart';
import 'package:sandbox/stories/alien_zone/spaceship_game.dart';
import 'package:sandbox/stories/alien_zone/spaceship_rail_game.dart';
import 'package:sandbox/stories/alien_zone/spaceship_ramp_game.dart';
void addAlienZoneStories(Dashbook dashbook) {
dashbook.storiesOf('Alien Zone')
..addGame(
title: 'Alien Bumper A',
description: AlienBumperAGame.description,
gameBuilder: (_) => AlienBumperAGame(),
)
..addGame(
title: 'Alien Bumper B',
description: AlienBumperBGame.description,
gameBuilder: (_) => AlienBumperBGame(),
)
..addGame(
title: 'Spaceship',
description: SpaceshipGame.description,
gameBuilder: (_) => SpaceshipGame(),
)
..addGame(
title: 'Spaceship Rail',
description: SpaceshipRailGame.description,
gameBuilder: (_) => SpaceshipRailGame(),
)
..addGame(
title: 'Spaceship Ramp',
description: SpaceshipRampGame.description,
gameBuilder: (_) => SpaceshipRampGame(),
);
}

@ -4,18 +4,18 @@ import 'package:flame/extensions.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class AlienBumperAGame extends BallGame {
AlienBumperAGame()
class AndroidBumperAGame extends BallGame {
AndroidBumperAGame()
: super(
color: const Color(0xFF0000FF),
imagesFileNames: [
Assets.images.alienBumper.a.active.keyName,
Assets.images.alienBumper.a.inactive.keyName,
Assets.images.androidBumper.a.lit.keyName,
Assets.images.androidBumper.a.dimmed.keyName,
],
);
static const description = '''
Shows how a AlienBumperA is rendered.
Shows how a AndroidBumperA is rendered.
- Activate the "trace" parameter to overlay the body.
''';
@ -26,7 +26,7 @@ class AlienBumperAGame extends BallGame {
camera.followVector2(Vector2.zero());
await add(
AlienBumper.a()..priority = 1,
AndroidBumper.a()..priority = 1,
);
await traceAllBodies();

@ -4,18 +4,18 @@ import 'package:flame/extensions.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:sandbox/stories/ball/basic_ball_game.dart';
class AlienBumperBGame extends BallGame {
AlienBumperBGame()
class AndroidBumperBGame extends BallGame {
AndroidBumperBGame()
: super(
color: const Color(0xFF0000FF),
imagesFileNames: [
Assets.images.alienBumper.b.active.keyName,
Assets.images.alienBumper.b.inactive.keyName,
Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName,
],
);
static const description = '''
Shows how a AlienBumperB is rendered.
Shows how a AndroidBumperB is rendered.
- Activate the "trace" parameter to overlay the body.
''';
@ -26,7 +26,7 @@ class AlienBumperBGame extends BallGame {
camera.followVector2(Vector2.zero());
await add(
AlienBumper.b()..priority = 1,
AndroidBumper.b()..priority = 1,
);
await traceAllBodies();

@ -0,0 +1,36 @@
import 'package:dashbook/dashbook.dart';
import 'package:sandbox/common/common.dart';
import 'package:sandbox/stories/android_acres/android_bumper_a_game.dart';
import 'package:sandbox/stories/android_acres/android_bumper_b_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_rail_game.dart';
import 'package:sandbox/stories/android_acres/spaceship_ramp_game.dart';
void addAndroidAcresStories(Dashbook dashbook) {
dashbook.storiesOf('Android Acres')
..addGame(
title: 'Android Bumper A',
description: AndroidBumperAGame.description,
gameBuilder: (_) => AndroidBumperAGame(),
)
..addGame(
title: 'Android Bumper B',
description: AndroidBumperBGame.description,
gameBuilder: (_) => AndroidBumperBGame(),
)
..addGame(
title: 'Spaceship',
description: SpaceshipGame.description,
gameBuilder: (_) => SpaceshipGame(),
)
..addGame(
title: 'Spaceship Rail',
description: SpaceshipRailGame.description,
gameBuilder: (_) => SpaceshipRailGame(),
)
..addGame(
title: 'Spaceship Ramp',
description: SpaceshipRampGame.description,
gameBuilder: (_) => SpaceshipRampGame(),
);
}

@ -1,4 +1,4 @@
export 'alien_zone/stories.dart';
export 'android_acres/stories.dart';
export 'backboard/stories.dart';
export 'ball/stories.dart';
export 'baseboard/stories.dart';

@ -17,7 +17,7 @@ class MockContact extends Mock implements Contact {}
class MockComponent extends Mock implements Component {}
class MockAlienBumperCubit extends Mock implements AlienBumperCubit {}
class MockAndroidBumperCubit extends Mock implements AndroidBumperCubit {}
class MockGoogleLetterCubit extends Mock implements GoogleLetterCubit {}

@ -1,24 +0,0 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
void main() {
group(
'AlienBumperCubit',
() {
blocTest<AlienBumperCubit, AlienBumperState>(
'onBallContacted emits inactive',
build: AlienBumperCubit.new,
act: (bloc) => bloc.onBallContacted(),
expect: () => [AlienBumperState.inactive],
);
blocTest<AlienBumperCubit, AlienBumperState>(
'onBlinked emits active',
build: AlienBumperCubit.new,
act: (bloc) => bloc.onBlinked(),
expect: () => [AlienBumperState.active],
);
},
);
}

@ -6,48 +6,48 @@ 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';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart';
import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import '../../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final assets = [
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.androidBumper.a.lit.keyName,
Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName,
];
final flameTester = FlameTester(() => TestGame(assets));
group('AlienBumper', () {
group('AndroidBumper', () {
flameTester.test('"a" loads correctly', (game) async {
final alienBumper = AlienBumper.a();
await game.ensureAdd(alienBumper);
expect(game.contains(alienBumper), isTrue);
final androidBumper = AndroidBumper.a();
await game.ensureAdd(androidBumper);
expect(game.contains(androidBumper), isTrue);
});
flameTester.test('"b" loads correctly', (game) async {
final alienBumper = AlienBumper.b();
await game.ensureAdd(alienBumper);
expect(game.contains(alienBumper), isTrue);
final androidBumper = AndroidBumper.b();
await game.ensureAdd(androidBumper);
expect(game.contains(androidBumper), isTrue);
});
// TODO(alestiago): Consider refactoring once the following is merged:
// https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async {
final bloc = MockAlienBumperCubit();
final bloc = MockAndroidBumperCubit();
whenListen(
bloc,
const Stream<AlienBumperState>.empty(),
initialState: AlienBumperState.active,
const Stream<AndroidBumperState>.empty(),
initialState: AndroidBumperState.lit,
);
when(bloc.close).thenAnswer((_) async {});
final alienBumper = AlienBumper.test(bloc: bloc);
final androidBumper = AndroidBumper.test(bloc: bloc);
await game.ensureAdd(alienBumper);
game.remove(alienBumper);
await game.ensureAdd(androidBumper);
game.remove(androidBumper);
await game.ready();
verify(bloc.close).called(1);
@ -56,19 +56,19 @@ void main() {
group('adds', () {
flameTester.test('new children', (game) async {
final component = Component();
final alienBumper = AlienBumper.a(
final androidBumper = AndroidBumper.a(
children: [component],
);
await game.ensureAdd(alienBumper);
expect(alienBumper.children, contains(component));
await game.ensureAdd(androidBumper);
expect(androidBumper.children, contains(component));
});
flameTester.test('an AlienBumperBallContactBehavior', (game) async {
final alienBumper = AlienBumper.a();
await game.ensureAdd(alienBumper);
flameTester.test('an AndroidBumperBallContactBehavior', (game) async {
final androidBumper = AndroidBumper.a();
await game.ensureAdd(androidBumper);
expect(
alienBumper.children
.whereType<AlienBumperBallContactBehavior>()
androidBumper.children
.whereType<AndroidBumperBallContactBehavior>()
.single,
isNotNull,
);

@ -5,7 +5,7 @@ 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';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart';
import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import '../../../../helpers/helpers.dart';
@ -14,33 +14,33 @@ void main() {
final flameTester = FlameTester(TestGame.new);
group(
'AlienBumperBallContactBehavior',
'AndroidBumperBallContactBehavior',
() {
test('can be instantiated', () {
expect(
AlienBumperBallContactBehavior(),
isA<AlienBumperBallContactBehavior>(),
AndroidBumperBallContactBehavior(),
isA<AndroidBumperBallContactBehavior>(),
);
});
flameTester.test(
'beginContact emits onBallContacted when contacts with a ball',
(game) async {
final behavior = AlienBumperBallContactBehavior();
final bloc = MockAlienBumperCubit();
final behavior = AndroidBumperBallContactBehavior();
final bloc = MockAndroidBumperCubit();
whenListen(
bloc,
const Stream<AlienBumperState>.empty(),
initialState: AlienBumperState.active,
const Stream<AndroidBumperState>.empty(),
initialState: AndroidBumperState.lit,
);
final alienBumper = AlienBumper.test(bloc: bloc);
await alienBumper.add(behavior);
await game.ensureAdd(alienBumper);
final androidBumper = AndroidBumper.test(bloc: bloc);
await androidBumper.add(behavior);
await game.ensureAdd(androidBumper);
behavior.beginContact(MockBall(), MockContact());
verify(alienBumper.bloc.onBallContacted).called(1);
verify(androidBumper.bloc.onBallContacted).called(1);
},
);
},

@ -5,7 +5,7 @@ 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';
import 'package:pinball_components/src/components/alien_bumper/behaviors/behaviors.dart';
import 'package:pinball_components/src/components/android_bumper/behaviors/behaviors.dart';
import '../../../../helpers/helpers.dart';
@ -14,25 +14,25 @@ void main() {
final flameTester = FlameTester(TestGame.new);
group(
'AlienBumperBlinkingBehavior',
'AndroidBumperBlinkingBehavior',
() {
flameTester.testGameWidget(
'calls onBlinked after 0.05 seconds when inactive',
'calls onBlinked after 0.05 seconds when dimmed',
setUp: (game, tester) async {
final behavior = AlienBumperBlinkingBehavior();
final bloc = MockAlienBumperCubit();
final streamController = StreamController<AlienBumperState>();
final behavior = AndroidBumperBlinkingBehavior();
final bloc = MockAndroidBumperCubit();
final streamController = StreamController<AndroidBumperState>();
whenListen(
bloc,
streamController.stream,
initialState: AlienBumperState.active,
initialState: AndroidBumperState.lit,
);
final alienBumper = AlienBumper.test(bloc: bloc);
await alienBumper.add(behavior);
await game.ensureAdd(alienBumper);
final androidBumper = AndroidBumper.test(bloc: bloc);
await androidBumper.add(behavior);
await game.ensureAdd(androidBumper);
streamController.add(AlienBumperState.inactive);
streamController.add(AndroidBumperState.dimmed);
await tester.pump();
game.update(0.05);

@ -0,0 +1,24 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_components/pinball_components.dart';
void main() {
group(
'AndroidBumperCubit',
() {
blocTest<AndroidBumperCubit, AndroidBumperState>(
'onBallContacted emits dimmed',
build: AndroidBumperCubit.new,
act: (bloc) => bloc.onBallContacted(),
expect: () => [AndroidBumperState.dimmed],
);
blocTest<AndroidBumperCubit, AndroidBumperState>(
'onBlinked emits lit',
build: AndroidBumperCubit.new,
act: (bloc) => bloc.onBlinked(),
expect: () => [AndroidBumperState.lit],
);
},
);
}

@ -1,48 +0,0 @@
// ignore_for_file: cascade_invocations
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import '../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final assets = [
Assets.images.alienBumper.a.active.keyName,
Assets.images.alienBumper.a.inactive.keyName,
Assets.images.alienBumper.b.active.keyName,
Assets.images.alienBumper.b.inactive.keyName,
];
final flameTester = FlameTester(
() => EmptyPinballTestGame(assets: assets),
);
group('AlienZone', () {
flameTester.test(
'loads correctly',
(game) async {
await game.addFromBlueprint(AlienZone());
await game.ready();
},
);
group('loads', () {
flameTester.test(
'two AlienBumper',
(game) async {
final alienZone = AlienZone();
await game.addFromBlueprint(alienZone);
await game.ready();
expect(
game.descendants().whereType<AlienBumper>().length,
equals(2),
);
},
);
});
});
}

@ -0,0 +1,88 @@
// ignore_for_file: cascade_invocations
import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_flame/pinball_flame.dart';
import '../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final assets = [
Assets.images.spaceship.ramp.boardOpening.keyName,
Assets.images.spaceship.ramp.railingForeground.keyName,
Assets.images.spaceship.ramp.railingBackground.keyName,
Assets.images.spaceship.ramp.main.keyName,
Assets.images.spaceship.ramp.arrow.inactive.keyName,
Assets.images.spaceship.ramp.arrow.active1.keyName,
Assets.images.spaceship.ramp.arrow.active2.keyName,
Assets.images.spaceship.ramp.arrow.active3.keyName,
Assets.images.spaceship.ramp.arrow.active4.keyName,
Assets.images.spaceship.ramp.arrow.active5.keyName,
Assets.images.androidBumper.a.lit.keyName,
Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName,
];
final flameTester = FlameTester(
() => EmptyPinballTestGame(assets: assets),
);
group('AndroidAcres', () {
flameTester.test(
'loads correctly',
(game) async {
await game.addFromBlueprint(AndroidAcres());
await game.ready();
},
);
group('loads', () {
flameTester.test(
'a Spaceship',
(game) async {
expect(
AndroidAcres().blueprints.whereType<Spaceship>().single,
isNotNull,
);
},
);
flameTester.test(
'a SpaceshipRamp',
(game) async {
expect(
AndroidAcres().blueprints.whereType<SpaceshipRamp>().single,
isNotNull,
);
},
);
flameTester.test(
'a SpaceshipRail',
(game) async {
expect(
AndroidAcres().blueprints.whereType<SpaceshipRail>().single,
isNotNull,
);
},
);
flameTester.test(
'two AndroidBumper',
(game) async {
final androidZone = AndroidAcres();
await game.addFromBlueprint(androidZone);
await game.ready();
expect(
game.descendants().whereType<AndroidBumper>().length,
equals(2),
);
},
);
});
});
}

@ -24,10 +24,10 @@ void main() {
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.androidBumper.a.lit.keyName,
Assets.images.androidBumper.a.dimmed.keyName,
Assets.images.androidBumper.b.lit.keyName,
Assets.images.androidBumper.b.dimmed.keyName,
Assets.images.sparky.bumper.a.active.keyName,
Assets.images.sparky.bumper.a.inactive.keyName,
Assets.images.sparky.bumper.b.active.keyName,

@ -82,6 +82,6 @@ class MockActiveOverlaysNotifier extends Mock
class MockGameFlowController extends Mock implements GameFlowController {}
class MockAlienBumper extends Mock implements AlienBumper {}
class MockAndroidBumper extends Mock implements AndroidBumper {}
class MockSparkyBumper extends Mock implements SparkyBumper {}

Loading…
Cancel
Save