test: blinking and asset updates

pull/283/head
Allison Ryan 3 years ago
parent a346419694
commit 296add890f

@ -26,3 +26,5 @@ class MockSparkyBumperCubit extends Mock implements SparkyBumperCubit {}
class MockDashNestBumperCubit extends Mock implements DashNestBumperCubit {} class MockDashNestBumperCubit extends Mock implements DashNestBumperCubit {}
class MockMultiplierCubit extends Mock implements MultiplierCubit {} class MockMultiplierCubit extends Mock implements MultiplierCubit {}
class MockKickerCubit extends Mock implements KickerCubit {}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 70 KiB

@ -0,0 +1,48 @@
// ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.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';
import 'package:pinball_components/src/components/kicker/behaviors/behaviors.dart';
import '../../../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new);
group(
'KickerBallContactBehavior',
() {
test('can be instantiated', () {
expect(
KickerBallContactBehavior(),
isA<KickerBallContactBehavior>(),
);
});
flameTester.test(
'beginContact emits onBallContacted when contacts with a ball',
(game) async {
final behavior = KickerBallContactBehavior();
final bloc = MockKickerCubit();
whenListen(
bloc,
const Stream<KickerState>.empty(),
initialState: KickerState.lit,
);
final kicker = Kicker.test(bloc: bloc);
await kicker.add(behavior);
await game.ensureAdd(kicker);
behavior.beginContact(MockBall(), MockContact());
verify(kicker.bloc.onBallContacted).called(1);
},
);
},
);
}

@ -0,0 +1,45 @@
import 'dart:async';
import 'package:bloc_test/bloc_test.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';
import 'package:pinball_components/src/components/kicker/behaviors/behaviors.dart';
import '../../../../helpers/helpers.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new);
group(
'KickerBlinkingBehavior',
() {
flameTester.testGameWidget(
'calls onBlinked after 0.05 seconds when dimmed',
setUp: (game, tester) async {
final behavior = KickerBlinkingBehavior();
final bloc = MockKickerCubit();
final streamController = StreamController<KickerState>();
whenListen(
bloc,
streamController.stream,
initialState: KickerState.lit,
);
final kicker = Kicker.test(bloc: bloc);
await kicker.add(behavior);
await game.ensureAdd(kicker);
streamController.add(KickerState.dimmed);
await tester.pump();
game.update(0.05);
await streamController.close();
verify(bloc.onBlinked).called(1);
},
);
},
);
}

@ -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(
'KickerCubit',
() {
blocTest<KickerCubit, KickerState>(
'onBallContacted emits dimmed',
build: KickerCubit.new,
act: (bloc) => bloc.onBallContacted(),
expect: () => [KickerState.dimmed],
);
blocTest<KickerCubit, KickerState>(
'onBlinked emits lit',
build: KickerCubit.new,
act: (bloc) => bloc.onBlinked(),
expect: () => [KickerState.lit],
);
},
);
}

@ -1,29 +1,42 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart';
import 'package:flame/components.dart'; import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';
import 'package:flutter_test/flutter_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/pinball_components.dart';
import 'package:pinball_components/src/components/bumping_behavior.dart';
import 'package:pinball_components/src/components/kicker/behaviors/behaviors.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
void main() { void main() {
group('Kicker', () { group('Kicker', () {
final flameTester = FlameTester(TestGame.new); final assets = [
Assets.images.kicker.left.lit.keyName,
Assets.images.kicker.left.dimmed.keyName,
Assets.images.kicker.right.lit.keyName,
Assets.images.kicker.right.dimmed.keyName,
];
final flameTester = FlameTester(() => TestGame(assets));
flameTester.testGameWidget( flameTester.testGameWidget(
'renders correctly', 'renders correctly',
setUp: (game, tester) async { setUp: (game, tester) async {
await game.images.loadAll(assets);
final leftKicker = Kicker( final leftKicker = Kicker(
side: BoardSide.left, side: BoardSide.left,
bloc: KickerCubit(),
)..initialPosition = Vector2(-20, 0); )..initialPosition = Vector2(-20, 0);
final rightKicker = Kicker( final rightKicker = Kicker(
side: BoardSide.right, side: BoardSide.right,
bloc: KickerCubit(),
)..initialPosition = Vector2(20, 0); )..initialPosition = Vector2(20, 0);
await game.ensureAddAll([leftKicker, rightKicker]); await game.ensureAddAll([leftKicker, rightKicker]);
game.camera.followVector2(Vector2.zero()); game.camera.followVector2(Vector2.zero());
await tester.pump();
}, },
verify: (game, tester) async { verify: (game, tester) async {
await expectLater( await expectLater(
@ -38,6 +51,7 @@ void main() {
(game) async { (game) async {
final kicker = Kicker( final kicker = Kicker(
side: BoardSide.left, side: BoardSide.left,
bloc: KickerCubit(),
); );
await game.ensureAdd(kicker); await game.ensureAdd(kicker);
@ -45,58 +59,73 @@ void main() {
}, },
); );
flameTester.test('adds new children', (game) async { // TODO(alestiago): Consider refactoring once the following is merged:
final component = Component(); // https://github.com/flame-engine/flame/pull/1538
final kicker = Kicker( // ignore: public_member_api_docs
side: BoardSide.left, flameTester.test('closes bloc when removed', (game) async {
children: [component], final bloc = MockKickerCubit();
whenListen(
bloc,
const Stream<KickerState>.empty(),
initialState: KickerState.lit,
); );
when(bloc.close).thenAnswer((_) async {});
final kicker = Kicker.test(bloc: bloc);
await game.ensureAdd(kicker); await game.ensureAdd(kicker);
expect(kicker.children, contains(component)); game.remove(kicker);
await game.ready();
verify(bloc.close).called(1);
}); });
flameTester.test( group('adds', () {
'body is static', flameTester.test('new children', (game) async {
(game) async { final component = Component();
final kicker = Kicker( final kicker = Kicker(
side: BoardSide.left, side: BoardSide.left,
children: [component],
bloc: KickerCubit(),
); );
await game.ensureAdd(kicker); await game.ensureAdd(kicker);
expect(kicker.children, contains(component));
});
expect(kicker.body.bodyType, equals(BodyType.static)); flameTester.test('a BumpingBehavior', (game) async {
},
);
flameTester.test(
'has restitution',
(game) async {
final kicker = Kicker( final kicker = Kicker(
side: BoardSide.left, side: BoardSide.left,
bloc: KickerCubit(),
); );
await game.ensureAdd(kicker); await game.ensureAdd(kicker);
expect(
final totalRestitution = kicker.body.fixtures.fold<double>( kicker.children.whereType<BumpingBehavior>().single,
0, isNotNull,
(total, fixture) => total + fixture.restitution,
); );
expect(totalRestitution, greaterThan(0)); });
},
);
flameTester.test( flameTester.test('a KickerBallContactBehavior', (game) async {
'has no friction',
(game) async {
final kicker = Kicker( final kicker = Kicker(
side: BoardSide.left, side: BoardSide.left,
bloc: KickerCubit(),
); );
await game.ensureAdd(kicker); await game.ensureAdd(kicker);
expect(
kicker.children.whereType<KickerBallContactBehavior>().single,
isNotNull,
);
});
final totalFriction = kicker.body.fixtures.fold<double>( flameTester.test('a KickerBlinkingBehavior', (game) async {
0, final kicker = Kicker(
(total, fixture) => total + fixture.friction, side: BoardSide.left,
bloc: KickerCubit(),
); );
expect(totalFriction, equals(0)); await game.ensureAdd(kicker);
}, expect(
); kicker.children.whereType<KickerBlinkingBehavior>().single,
isNotNull,
);
});
});
}); });
} }

@ -10,6 +10,10 @@ import '../../helpers/helpers.dart';
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
Assets.images.kicker.left.lit.keyName,
Assets.images.kicker.left.dimmed.keyName,
Assets.images.kicker.right.lit.keyName,
Assets.images.kicker.right.dimmed.keyName,
Assets.images.baseboard.left.keyName, Assets.images.baseboard.left.keyName,
Assets.images.baseboard.right.keyName, Assets.images.baseboard.right.keyName,
Assets.images.flipper.left.keyName, Assets.images.flipper.left.keyName,

@ -51,8 +51,10 @@ void main() {
Assets.images.googleWord.letter4.keyName, Assets.images.googleWord.letter4.keyName,
Assets.images.googleWord.letter5.keyName, Assets.images.googleWord.letter5.keyName,
Assets.images.googleWord.letter6.keyName, Assets.images.googleWord.letter6.keyName,
Assets.images.kicker.left.keyName, Assets.images.kicker.left.lit.keyName,
Assets.images.kicker.right.keyName, Assets.images.kicker.left.dimmed.keyName,
Assets.images.kicker.right.lit.keyName,
Assets.images.kicker.right.dimmed.keyName,
Assets.images.launchRamp.ramp.keyName, Assets.images.launchRamp.ramp.keyName,
Assets.images.launchRamp.foregroundRailing.keyName, Assets.images.launchRamp.foregroundRailing.keyName,
Assets.images.launchRamp.backgroundRailing.keyName, Assets.images.launchRamp.backgroundRailing.keyName,

Loading…
Cancel
Save