@ -0,0 +1,62 @@
|
|||||||
|
// ignore_for_file: prefer_const_constructors
|
||||||
|
|
||||||
|
import 'package:bloc_test/bloc_test.dart';
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:pinball_components/pinball_components.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
group(
|
||||||
|
'MultiplierCubit',
|
||||||
|
() {
|
||||||
|
blocTest<MultiplierCubit, MultiplierState>(
|
||||||
|
'emits [lit] when toggle dimmed with same multiplier value',
|
||||||
|
build: () => MultiplierCubit(MultiplierValue.x2),
|
||||||
|
act: (bloc) => bloc.toggle(2),
|
||||||
|
expect: () => [
|
||||||
|
isA<MultiplierState>()
|
||||||
|
..having(
|
||||||
|
(state) => state.spriteState,
|
||||||
|
'spriteState',
|
||||||
|
MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
blocTest<MultiplierCubit, MultiplierState>(
|
||||||
|
'emits [dimmed] when toggle lit with different multiplier value',
|
||||||
|
build: () => MultiplierCubit(MultiplierValue.x2),
|
||||||
|
seed: () => MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
act: (bloc) => bloc.toggle(3),
|
||||||
|
expect: () => [
|
||||||
|
isA<MultiplierState>()
|
||||||
|
..having(
|
||||||
|
(state) => state.spriteState,
|
||||||
|
'spriteState',
|
||||||
|
MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
blocTest<MultiplierCubit, MultiplierState>(
|
||||||
|
'emits nothing when toggle lit with same multiplier value',
|
||||||
|
build: () => MultiplierCubit(MultiplierValue.x2),
|
||||||
|
seed: () => MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
act: (bloc) => bloc.toggle(2),
|
||||||
|
expect: () => <MultiplierState>[],
|
||||||
|
);
|
||||||
|
|
||||||
|
blocTest<MultiplierCubit, MultiplierState>(
|
||||||
|
'emits nothing when toggle dimmed with different multiplier value',
|
||||||
|
build: () => MultiplierCubit(MultiplierValue.x2),
|
||||||
|
act: (bloc) => bloc.toggle(3),
|
||||||
|
expect: () => <MultiplierState>[],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,75 @@
|
|||||||
|
// ignore_for_file: prefer_const_constructors
|
||||||
|
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:pinball_components/src/pinball_components.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
group('MultiplierState', () {
|
||||||
|
test('supports value equality', () {
|
||||||
|
expect(
|
||||||
|
MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
equals(
|
||||||
|
MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('constructor', () {
|
||||||
|
test('can be instantiated', () {
|
||||||
|
expect(
|
||||||
|
MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
isNotNull,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
group('copyWith', () {
|
||||||
|
test(
|
||||||
|
'copies correctly '
|
||||||
|
'when no argument specified',
|
||||||
|
() {
|
||||||
|
const multiplierState = MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
multiplierState.copyWith(),
|
||||||
|
equals(multiplierState),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
test(
|
||||||
|
'copies correctly '
|
||||||
|
'when all arguments specified',
|
||||||
|
() {
|
||||||
|
const multiplierState = MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
final otherMultiplierState = MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
);
|
||||||
|
expect(multiplierState, isNot(equals(otherMultiplierState)));
|
||||||
|
|
||||||
|
expect(
|
||||||
|
multiplierState.copyWith(
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
equals(otherMultiplierState),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 26 KiB |
@ -0,0 +1,472 @@
|
|||||||
|
// ignore_for_file: cascade_invocations, prefer_const_constructors
|
||||||
|
|
||||||
|
import 'package:bloc_test/bloc_test.dart';
|
||||||
|
import 'package:flame/components.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 '../../../helpers/helpers.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
final bloc = MockMultiplierCubit();
|
||||||
|
|
||||||
|
group('MultiplierSpriteGroupComponent', () {
|
||||||
|
TestWidgetsFlutterBinding.ensureInitialized();
|
||||||
|
final assets = [
|
||||||
|
Assets.images.multiplier.x2.lit.keyName,
|
||||||
|
Assets.images.multiplier.x2.dimmed.keyName,
|
||||||
|
Assets.images.multiplier.x3.lit.keyName,
|
||||||
|
Assets.images.multiplier.x3.dimmed.keyName,
|
||||||
|
Assets.images.multiplier.x4.lit.keyName,
|
||||||
|
Assets.images.multiplier.x4.dimmed.keyName,
|
||||||
|
Assets.images.multiplier.x5.lit.keyName,
|
||||||
|
Assets.images.multiplier.x5.dimmed.keyName,
|
||||||
|
Assets.images.multiplier.x6.lit.keyName,
|
||||||
|
Assets.images.multiplier.x6.dimmed.keyName,
|
||||||
|
];
|
||||||
|
final flameTester = FlameTester(() => TestGame(assets));
|
||||||
|
|
||||||
|
group('renders correctly', () {
|
||||||
|
group('x2', () {
|
||||||
|
const multiplierValue = MultiplierValue.x2;
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'lit when bloc state is lit',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x2-lit.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'dimmed when bloc state is dimmed',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.dimmed,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x2-dimmed.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('x3', () {
|
||||||
|
const multiplierValue = MultiplierValue.x3;
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'lit when bloc state is lit',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x3-lit.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'dimmed when bloc state is dimmed',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.dimmed,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x3-dimmed.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('x4', () {
|
||||||
|
const multiplierValue = MultiplierValue.x4;
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'lit when bloc state is lit',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x4-lit.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'dimmed when bloc state is dimmed',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.dimmed,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x4-dimmed.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('x5', () {
|
||||||
|
const multiplierValue = MultiplierValue.x5;
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'lit when bloc state is lit',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x5-lit.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'dimmed when bloc state is dimmed',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.dimmed,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x5-dimmed.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
group('x6', () {
|
||||||
|
const multiplierValue = MultiplierValue.x6;
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'lit when bloc state is lit',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.lit,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.lit,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x6-lit.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
flameTester.testGameWidget(
|
||||||
|
'dimmed when bloc state is dimmed',
|
||||||
|
setUp: (game, tester) async {
|
||||||
|
await game.images.loadAll(assets);
|
||||||
|
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: multiplierValue,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final multiplier = Multiplier.test(
|
||||||
|
value: multiplierValue,
|
||||||
|
bloc: bloc,
|
||||||
|
);
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
await tester.pump();
|
||||||
|
|
||||||
|
game.camera.followVector2(Vector2.zero());
|
||||||
|
},
|
||||||
|
verify: (game, tester) async {
|
||||||
|
expect(
|
||||||
|
game
|
||||||
|
.descendants()
|
||||||
|
.whereType<MultiplierSpriteGroupComponent>()
|
||||||
|
.first
|
||||||
|
.current,
|
||||||
|
MultiplierSpriteState.dimmed,
|
||||||
|
);
|
||||||
|
|
||||||
|
await expectLater(
|
||||||
|
find.byGame<TestGame>(),
|
||||||
|
matchesGoldenFile('golden/multipliers/x6-dimmed.png'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
flameTester.test('closes bloc when removed', (game) async {
|
||||||
|
whenListen(
|
||||||
|
bloc,
|
||||||
|
const Stream<MultiplierState>.empty(),
|
||||||
|
initialState: MultiplierState(
|
||||||
|
value: MultiplierValue.x2,
|
||||||
|
spriteState: MultiplierSpriteState.dimmed,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
when(bloc.close).thenAnswer((_) async {});
|
||||||
|
final multiplier = Multiplier.test(value: MultiplierValue.x2, bloc: bloc);
|
||||||
|
|
||||||
|
await game.ensureAdd(multiplier);
|
||||||
|
game.remove(multiplier);
|
||||||
|
await game.ready();
|
||||||
|
|
||||||
|
verify(bloc.close).called(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -1,483 +0,0 @@
|
|||||||
// ignore_for_file: cascade_invocations
|
|
||||||
|
|
||||||
import 'package:flame/components.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() {
|
|
||||||
group('MultiplierSpriteGroupComponent', () {
|
|
||||||
TestWidgetsFlutterBinding.ensureInitialized();
|
|
||||||
final assets = [
|
|
||||||
Assets.images.multiplier.x2.lit.keyName,
|
|
||||||
Assets.images.multiplier.x2.dimmed.keyName,
|
|
||||||
Assets.images.multiplier.x3.lit.keyName,
|
|
||||||
Assets.images.multiplier.x3.dimmed.keyName,
|
|
||||||
Assets.images.multiplier.x4.lit.keyName,
|
|
||||||
Assets.images.multiplier.x4.dimmed.keyName,
|
|
||||||
Assets.images.multiplier.x5.lit.keyName,
|
|
||||||
Assets.images.multiplier.x5.dimmed.keyName,
|
|
||||||
Assets.images.multiplier.x6.lit.keyName,
|
|
||||||
Assets.images.multiplier.x6.dimmed.keyName,
|
|
||||||
];
|
|
||||||
final flameTester = FlameTester(() => TestGame(assets));
|
|
||||||
|
|
||||||
group('renders correctly', () {
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x2 active',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x2,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
|
|
||||||
multiplier.toggle(2);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.lit,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x2-active.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x2 inactive',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x2,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x2-inactive.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x2 deactivated when different multiply value',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x2,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
multiplier.toggle(1);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x3 active',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x3,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
|
|
||||||
multiplier.toggle(3);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.lit,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x3-active.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x3 inactive',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x3,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x3-inactive.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x3 deactivated when different multiply value',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x3,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
multiplier.toggle(1);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x4 active',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x4,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
|
|
||||||
multiplier.toggle(4);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.lit,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x4-active.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x4 inactive',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x4,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x4-inactive.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x4 deactivated when different multiply value',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x4,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
multiplier.toggle(1);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x5 active',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x5,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
|
|
||||||
multiplier.toggle(5);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.lit,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x5-active.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x5 inactive',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x5,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x5-inactive.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x5 deactivated when different multiply value',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x5,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
multiplier.toggle(1);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x6 active',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x6,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
|
|
||||||
multiplier.toggle(6);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.lit,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x6-active.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x6 inactive',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x6,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
|
|
||||||
await expectLater(
|
|
||||||
find.byGame<TestGame>(),
|
|
||||||
matchesGoldenFile('golden/multipliers/x6-inactive.png'),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
flameTester.testGameWidget(
|
|
||||||
'x6 deactivated when different multiply value',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.images.loadAll(assets);
|
|
||||||
|
|
||||||
final multiplier = Multiplier(
|
|
||||||
value: MultiplierValue.x6,
|
|
||||||
position: Vector2.zero(),
|
|
||||||
);
|
|
||||||
await game.ensureAdd(multiplier);
|
|
||||||
multiplier.toggle(1);
|
|
||||||
await tester.pump();
|
|
||||||
|
|
||||||
game.camera.followVector2(Vector2.zero());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(
|
|
||||||
game
|
|
||||||
.descendants()
|
|
||||||
.whereType<MultiplierSpriteGroupComponent>()
|
|
||||||
.first
|
|
||||||
.current,
|
|
||||||
MultiplierSpriteState.dimmed,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|