refactor: removed `mocks.dart` (#307)

* refactor: removed mocks.dart

* refactor(pinball_audio): removed callable classes
pull/310/head
Alejandro Santiago 3 years ago committed by GitHub
parent 9784091f84
commit 36f7886f63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -3,9 +3,9 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
class MockFirebaseAuth extends Mock implements FirebaseAuth {} class _MockFirebaseAuth extends Mock implements FirebaseAuth {}
class MockUserCredential extends Mock implements UserCredential {} class _MockUserCredential extends Mock implements UserCredential {}
void main() { void main() {
late FirebaseAuth firebaseAuth; late FirebaseAuth firebaseAuth;
@ -14,8 +14,8 @@ void main() {
group('AuthenticationRepository', () { group('AuthenticationRepository', () {
setUp(() { setUp(() {
firebaseAuth = MockFirebaseAuth(); firebaseAuth = _MockFirebaseAuth();
userCredential = MockUserCredential(); userCredential = _MockUserCredential();
authenticationRepository = AuthenticationRepository(firebaseAuth); authenticationRepository = AuthenticationRepository(firebaseAuth);
}); });

@ -5,23 +5,23 @@ import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
class MockFirebaseFirestore extends Mock implements FirebaseFirestore {} class _MockFirebaseFirestore extends Mock implements FirebaseFirestore {}
class MockCollectionReference extends Mock class _MockCollectionReference extends Mock
implements CollectionReference<Map<String, dynamic>> {} implements CollectionReference<Map<String, dynamic>> {}
class MockQuery extends Mock implements Query<Map<String, dynamic>> {} class _MockQuery extends Mock implements Query<Map<String, dynamic>> {}
class MockQuerySnapshot extends Mock class _MockQuerySnapshot extends Mock
implements QuerySnapshot<Map<String, dynamic>> {} implements QuerySnapshot<Map<String, dynamic>> {}
class MockQueryDocumentSnapshot extends Mock class _MockQueryDocumentSnapshot extends Mock
implements QueryDocumentSnapshot<Map<String, dynamic>> {} implements QueryDocumentSnapshot<Map<String, dynamic>> {}
class MockDocumentReference extends Mock class _MockDocumentReference extends Mock
implements DocumentReference<Map<String, dynamic>> {} implements DocumentReference<Map<String, dynamic>> {}
class MockDocumentSnapshot extends Mock class _MockDocumentSnapshot extends Mock
implements DocumentSnapshot<Map<String, dynamic>> {} implements DocumentSnapshot<Map<String, dynamic>> {}
void main() { void main() {
@ -29,7 +29,7 @@ void main() {
late FirebaseFirestore firestore; late FirebaseFirestore firestore;
setUp(() { setUp(() {
firestore = MockFirebaseFirestore(); firestore = _MockFirebaseFirestore();
}); });
test('can be instantiated', () { test('can be instantiated', () {
@ -70,11 +70,11 @@ void main() {
setUp(() { setUp(() {
leaderboardRepository = LeaderboardRepository(firestore); leaderboardRepository = LeaderboardRepository(firestore);
collectionReference = MockCollectionReference(); collectionReference = _MockCollectionReference();
query = MockQuery(); query = _MockQuery();
querySnapshot = MockQuerySnapshot(); querySnapshot = _MockQuerySnapshot();
queryDocumentSnapshots = top10Scores.map((score) { queryDocumentSnapshots = top10Scores.map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'user$score', 'playerInitials': 'user$score',
@ -119,7 +119,7 @@ void main() {
'playerInitials': 'ABC', 'playerInitials': 'ABC',
'score': 1500, 'score': 1500,
}; };
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(() => querySnapshot.docs).thenReturn([queryDocumentSnapshot]); when(() => querySnapshot.docs).thenReturn([queryDocumentSnapshot]);
when(queryDocumentSnapshot.data) when(queryDocumentSnapshot.data)
.thenReturn(top10LeaderboardDataMalformed); .thenReturn(top10LeaderboardDataMalformed);
@ -156,12 +156,12 @@ void main() {
setUp(() { setUp(() {
leaderboardRepository = LeaderboardRepository(firestore); leaderboardRepository = LeaderboardRepository(firestore);
collectionReference = MockCollectionReference(); collectionReference = _MockCollectionReference();
documentReference = MockDocumentReference(); documentReference = _MockDocumentReference();
query = MockQuery(); query = _MockQuery();
querySnapshot = MockQuerySnapshot(); querySnapshot = _MockQuerySnapshot();
queryDocumentSnapshots = leaderboardScores.map((score) { queryDocumentSnapshots = leaderboardScores.map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'AAA', 'playerInitials': 'AAA',
@ -228,7 +228,7 @@ void main() {
5000 5000
]; ];
final queryDocumentSnapshots = leaderboardScores.map((score) { final queryDocumentSnapshots = leaderboardScores.map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'AAA', 'playerInitials': 'AAA',
@ -248,8 +248,8 @@ void main() {
test( test(
'throws DeleteLeaderboardException ' 'throws DeleteLeaderboardException '
'when deleting scores outside the top 10 fails', () async { 'when deleting scores outside the top 10 fails', () async {
final deleteQuery = MockQuery(); final deleteQuery = _MockQuery();
final deleteQuerySnapshot = MockQuerySnapshot(); final deleteQuerySnapshot = _MockQuerySnapshot();
final newScore = LeaderboardEntryData( final newScore = LeaderboardEntryData(
playerInitials: 'ABC', playerInitials: 'ABC',
score: 15000, score: 15000,
@ -269,7 +269,7 @@ void main() {
5000, 5000,
]; ];
final deleteDocumentSnapshots = [5500, 5000].map((score) { final deleteDocumentSnapshots = [5500, 5000].map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'AAA', 'playerInitials': 'AAA',
@ -284,7 +284,7 @@ void main() {
when(() => deleteQuerySnapshot.docs) when(() => deleteQuerySnapshot.docs)
.thenReturn(deleteDocumentSnapshots); .thenReturn(deleteDocumentSnapshots);
final queryDocumentSnapshots = leaderboardScores.map((score) { final queryDocumentSnapshots = leaderboardScores.map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'AAA', 'playerInitials': 'AAA',
@ -310,8 +310,8 @@ void main() {
'saves the new score when there are more than 10 scores in the ' 'saves the new score when there are more than 10 scores in the '
'leaderboard and the new score is higher than the lowest top 10, and ' 'leaderboard and the new score is higher than the lowest top 10, and '
'deletes the scores that are not in the top 10 anymore', () async { 'deletes the scores that are not in the top 10 anymore', () async {
final deleteQuery = MockQuery(); final deleteQuery = _MockQuery();
final deleteQuerySnapshot = MockQuerySnapshot(); final deleteQuerySnapshot = _MockQuerySnapshot();
final newScore = LeaderboardEntryData( final newScore = LeaderboardEntryData(
playerInitials: 'ABC', playerInitials: 'ABC',
score: 15000, score: 15000,
@ -331,7 +331,7 @@ void main() {
5000, 5000,
]; ];
final deleteDocumentSnapshots = [5500, 5000].map((score) { final deleteDocumentSnapshots = [5500, 5000].map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'AAA', 'playerInitials': 'AAA',
@ -346,7 +346,7 @@ void main() {
when(() => deleteQuerySnapshot.docs) when(() => deleteQuerySnapshot.docs)
.thenReturn(deleteDocumentSnapshots); .thenReturn(deleteDocumentSnapshots);
final queryDocumentSnapshots = leaderboardScores.map((score) { final queryDocumentSnapshots = leaderboardScores.map((score) {
final queryDocumentSnapshot = MockQueryDocumentSnapshot(); final queryDocumentSnapshot = _MockQueryDocumentSnapshot();
when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{ when(queryDocumentSnapshot.data).thenReturn(<String, dynamic>{
'character': 'dash', 'character': 'dash',
'playerInitials': 'AAA', 'playerInitials': 'AAA',
@ -376,9 +376,9 @@ void main() {
late DocumentSnapshot<Map<String, dynamic>> documentSnapshot; late DocumentSnapshot<Map<String, dynamic>> documentSnapshot;
setUp(() async { setUp(() async {
collectionReference = MockCollectionReference(); collectionReference = _MockCollectionReference();
documentReference = MockDocumentReference(); documentReference = _MockDocumentReference();
documentSnapshot = MockDocumentSnapshot(); documentSnapshot = _MockDocumentSnapshot();
leaderboardRepository = LeaderboardRepository(firestore); leaderboardRepository = LeaderboardRepository(firestore);
when(() => firestore.collection('prohibitedInitials')) when(() => firestore.collection('prohibitedInitials'))

@ -1,47 +0,0 @@
// ignore_for_file: one_member_abstracts
import 'package:audioplayers/audioplayers.dart';
import 'package:flame_audio/audio_pool.dart';
import 'package:mocktail/mocktail.dart';
abstract class _CreateAudioPoolStub {
Future<AudioPool> onCall(
String sound, {
bool? repeating,
int? maxPlayers,
int? minPlayers,
String? prefix,
});
}
class CreateAudioPoolStub extends Mock implements _CreateAudioPoolStub {}
abstract class _ConfigureAudioCacheStub {
void onCall(AudioCache cache);
}
class ConfigureAudioCacheStub extends Mock implements _ConfigureAudioCacheStub {
}
abstract class _PlaySingleAudioStub {
Future<void> onCall(String url);
}
class PlaySingleAudioStub extends Mock implements _PlaySingleAudioStub {}
abstract class _LoopSingleAudioStub {
Future<void> onCall(String url);
}
class LoopSingleAudioStub extends Mock implements _LoopSingleAudioStub {}
abstract class _PreCacheSingleAudioStub {
Future<void> onCall(String url);
}
class PreCacheSingleAudioStub extends Mock implements _PreCacheSingleAudioStub {
}
class MockAudioPool extends Mock implements AudioPool {}
class MockAudioCache extends Mock implements AudioCache {}

@ -1,49 +1,77 @@
// ignore_for_file: prefer_const_constructors // ignore_for_file: prefer_const_constructors, one_member_abstracts
import 'package:audioplayers/audioplayers.dart';
import 'package:flame_audio/audio_pool.dart';
import 'package:flame_audio/flame_audio.dart'; import 'package:flame_audio/flame_audio.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_audio/gen/assets.gen.dart'; import 'package:pinball_audio/gen/assets.gen.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import '../helpers/helpers.dart'; class _MockAudioPool extends Mock implements AudioPool {}
class _MockAudioCache extends Mock implements AudioCache {}
class _MockCreateAudioPool extends Mock {
Future<AudioPool> onCall(
String sound, {
bool? repeating,
int? maxPlayers,
int? minPlayers,
String? prefix,
});
}
class _MockConfigureAudioCache extends Mock {
void onCall(AudioCache cache);
}
class _MockPlaySingleAudio extends Mock {
Future<void> onCall(String url);
}
class _MockLoopSingleAudio extends Mock {
Future<void> onCall(String url);
}
abstract class _PreCacheSingleAudio {
Future<void> onCall(String url);
}
class _MockPreCacheSingleAudio extends Mock implements _PreCacheSingleAudio {}
void main() { void main() {
group('PinballAudio', () { group('PinballAudio', () {
test('can be instantiated', () { late _MockCreateAudioPool createAudioPool;
expect(PinballAudio(), isNotNull); late _MockConfigureAudioCache configureAudioCache;
}); late _MockPlaySingleAudio playSingleAudio;
late _MockLoopSingleAudio loopSingleAudio;
late CreateAudioPoolStub createAudioPool; late _PreCacheSingleAudio preCacheSingleAudio;
late ConfigureAudioCacheStub configureAudioCache;
late PlaySingleAudioStub playSingleAudio;
late LoopSingleAudioStub loopSingleAudio;
late PreCacheSingleAudioStub preCacheSingleAudio;
late PinballAudio audio; late PinballAudio audio;
setUpAll(() { setUpAll(() {
registerFallbackValue(MockAudioCache()); registerFallbackValue(_MockAudioCache());
}); });
setUp(() { setUp(() {
createAudioPool = CreateAudioPoolStub(); createAudioPool = _MockCreateAudioPool();
when( when(
() => createAudioPool.onCall( () => createAudioPool.onCall(
any(), any(),
maxPlayers: any(named: 'maxPlayers'), maxPlayers: any(named: 'maxPlayers'),
prefix: any(named: 'prefix'), prefix: any(named: 'prefix'),
), ),
).thenAnswer((_) async => MockAudioPool()); ).thenAnswer((_) async => _MockAudioPool());
configureAudioCache = ConfigureAudioCacheStub(); configureAudioCache = _MockConfigureAudioCache();
when(() => configureAudioCache.onCall(any())).thenAnswer((_) {}); when(() => configureAudioCache.onCall(any())).thenAnswer((_) {});
playSingleAudio = PlaySingleAudioStub(); playSingleAudio = _MockPlaySingleAudio();
when(() => playSingleAudio.onCall(any())).thenAnswer((_) async {}); when(() => playSingleAudio.onCall(any())).thenAnswer((_) async {});
loopSingleAudio = LoopSingleAudioStub(); loopSingleAudio = _MockLoopSingleAudio();
when(() => loopSingleAudio.onCall(any())).thenAnswer((_) async {}); when(() => loopSingleAudio.onCall(any())).thenAnswer((_) async {});
preCacheSingleAudio = PreCacheSingleAudioStub(); preCacheSingleAudio = _MockPreCacheSingleAudio();
when(() => preCacheSingleAudio.onCall(any())).thenAnswer((_) async {}); when(() => preCacheSingleAudio.onCall(any())).thenAnswer((_) async {});
audio = PinballAudio( audio = PinballAudio(
@ -55,6 +83,10 @@ void main() {
); );
}); });
test('can be instantiated', () {
expect(PinballAudio(), isNotNull);
});
group('load', () { group('load', () {
test('creates the score pool', () async { test('creates the score pool', () async {
await audio.load(); await audio.load();
@ -102,7 +134,7 @@ void main() {
group('score', () { group('score', () {
test('plays the score sound pool', () async { test('plays the score sound pool', () async {
final audioPool = MockAudioPool(); final audioPool = _MockAudioPool();
when(audioPool.start).thenAnswer((_) async => () {}); when(audioPool.start).thenAnswer((_) async => () {});
when( when(
() => createAudioPool.onCall( () => createAudioPool.onCall(

@ -1,2 +1 @@
export 'mocks.dart';
export 'test_game.dart'; export 'test_game.dart';

@ -1,32 +0,0 @@
import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball_components/pinball_components.dart';
class MockFilter extends Mock implements Filter {}
class MockFixture extends Mock implements Fixture {}
class MockBody extends Mock implements Body {}
class MockBall extends Mock implements Ball {}
class MockGame extends Mock implements Forge2DGame {}
class MockContact extends Mock implements Contact {}
class MockComponent extends Mock implements Component {}
class MockAndroidBumperCubit extends Mock implements AndroidBumperCubit {}
class MockGoogleLetterCubit extends Mock implements GoogleLetterCubit {}
class MockSparkyBumperCubit extends Mock implements SparkyBumperCubit {}
class MockDashNestBumperCubit extends Mock implements DashNestBumperCubit {}
class MockMultiballCubit extends Mock implements MultiballCubit {}
class MockMultiplierCubit extends Mock implements MultiplierCubit {}
class MockChromeDinoCubit extends Mock implements ChromeDinoCubit {}

@ -11,6 +11,8 @@ import 'package:pinball_components/src/components/bumping_behavior.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockAndroidBumperCubit extends Mock implements AndroidBumperCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -46,7 +48,7 @@ void main() {
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async { flameTester.test('closes bloc when removed', (game) async {
final bloc = MockAndroidBumperCubit(); final bloc = _MockAndroidBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<AndroidBumperState>.empty(), const Stream<AndroidBumperState>.empty(),

@ -1,6 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.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:mocktail/mocktail.dart';
@ -9,6 +10,12 @@ import 'package:pinball_components/src/components/android_bumper/behaviors/behav
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockBall extends Mock implements Ball {}
class _MockContact extends Mock implements Contact {}
class _MockAndroidBumperCubit extends Mock implements AndroidBumperCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -27,7 +34,7 @@ void main() {
'beginContact emits onBallContacted when contacts with a ball', 'beginContact emits onBallContacted when contacts with a ball',
(game) async { (game) async {
final behavior = AndroidBumperBallContactBehavior(); final behavior = AndroidBumperBallContactBehavior();
final bloc = MockAndroidBumperCubit(); final bloc = _MockAndroidBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<AndroidBumperState>.empty(), const Stream<AndroidBumperState>.empty(),
@ -38,7 +45,7 @@ void main() {
await androidBumper.add(behavior); await androidBumper.add(behavior);
await game.ensureAdd(androidBumper); await game.ensureAdd(androidBumper);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(_MockBall(), _MockContact());
verify(androidBumper.bloc.onBallContacted).called(1); verify(androidBumper.bloc.onBallContacted).called(1);
}, },

@ -9,6 +9,8 @@ import 'package:pinball_components/src/components/android_bumper/behaviors/behav
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockAndroidBumperCubit extends Mock implements AndroidBumperCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -20,7 +22,7 @@ void main() {
'calls onBlinked after 0.05 seconds when dimmed', 'calls onBlinked after 0.05 seconds when dimmed',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = AndroidBumperBlinkingBehavior(); final behavior = AndroidBumperBlinkingBehavior();
final bloc = MockAndroidBumperCubit(); final bloc = _MockAndroidBumperCubit();
final streamController = StreamController<AndroidBumperState>(); final streamController = StreamController<AndroidBumperState>();
whenListen( whenListen(
bloc, bloc,

@ -1,6 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.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:mocktail/mocktail.dart';
@ -12,6 +13,10 @@ import '../../../../helpers/helpers.dart';
class _MockAndroidSpaceshipCubit extends Mock implements AndroidSpaceshipCubit { class _MockAndroidSpaceshipCubit extends Mock implements AndroidSpaceshipCubit {
} }
class _MockBall extends Mock implements Ball {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -45,7 +50,7 @@ void main() {
await entrance.add(behavior); await entrance.add(behavior);
await game.ensureAdd(androidSpaceship); await game.ensureAdd(androidSpaceship);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(_MockBall(), _MockContact());
verify(androidSpaceship.bloc.onBallEntered).called(1); verify(androidSpaceship.bloc.onBallEntered).called(1);
}, },

@ -2,6 +2,7 @@
import 'package:bloc_test/bloc_test.dart'; 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/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
@ -11,6 +12,12 @@ import 'package:pinball_components/src/components/chrome_dino/behaviors/behavior
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockChromeDinoCubit extends Mock implements ChromeDinoCubit {}
class _MockContact extends Mock implements Contact {}
class _MockFixture extends Mock implements Fixture {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -30,7 +37,7 @@ void main() {
(game) async { (game) async {
final ball = Ball(baseColor: Colors.red); final ball = Ball(baseColor: Colors.red);
final behavior = ChromeDinoChompingBehavior(); final behavior = ChromeDinoChompingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),
@ -44,8 +51,8 @@ void main() {
await chromeDino.add(behavior); await chromeDino.add(behavior);
await game.ensureAddAll([chromeDino, ball]); await game.ensureAddAll([chromeDino, ball]);
final contact = MockContact(); final contact = _MockContact();
final fixture = MockFixture(); final fixture = _MockFixture();
when(() => contact.fixtureA).thenReturn(fixture); when(() => contact.fixtureA).thenReturn(fixture);
when(() => fixture.userData).thenReturn('inside_mouth'); when(() => fixture.userData).thenReturn('inside_mouth');

@ -10,6 +10,14 @@ import 'package:pinball_components/src/components/chrome_dino/behaviors/behavior
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockChromeDinoCubit extends Mock implements ChromeDinoCubit {}
class _MockContact extends Mock implements Contact {}
class _MockFixture extends Mock implements Fixture {}
class _MockBall extends Mock implements Ball {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -29,7 +37,7 @@ void main() {
'and there is not ball in the mouth', 'and there is not ball in the mouth',
(game) async { (game) async {
final behavior = ChromeDinoMouthOpeningBehavior(); final behavior = ChromeDinoMouthOpeningBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),
@ -43,12 +51,12 @@ void main() {
await chromeDino.add(behavior); await chromeDino.add(behavior);
await game.ensureAdd(chromeDino); await game.ensureAdd(chromeDino);
final contact = MockContact(); final contact = _MockContact();
final fixture = MockFixture(); final fixture = _MockFixture();
when(() => contact.fixtureA).thenReturn(fixture); when(() => contact.fixtureA).thenReturn(fixture);
when(() => fixture.userData).thenReturn('mouth_opening'); when(() => fixture.userData).thenReturn('mouth_opening');
behavior.preSolve(MockBall(), contact, Manifold()); behavior.preSolve(_MockBall(), contact, Manifold());
verify(() => contact.setEnabled(false)).called(1); verify(() => contact.setEnabled(false)).called(1);
}, },

@ -13,6 +13,8 @@ import 'package:pinball_components/src/components/chrome_dino/behaviors/behavior
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockChromeDinoCubit extends Mock implements ChromeDinoCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -33,7 +35,7 @@ void main() {
(game) async { (game) async {
final ball = Ball(baseColor: Colors.red); final ball = Ball(baseColor: Colors.red);
final behavior = ChromeDinoSpittingBehavior(); final behavior = ChromeDinoSpittingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
final streamController = StreamController<ChromeDinoState>(); final streamController = StreamController<ChromeDinoState>();
final chompingState = ChromeDinoState( final chompingState = ChromeDinoState(
status: ChromeDinoStatus.chomping, status: ChromeDinoStatus.chomping,
@ -71,7 +73,7 @@ void main() {
(game) async { (game) async {
final ball = Ball(baseColor: Colors.red); final ball = Ball(baseColor: Colors.red);
final behavior = ChromeDinoSpittingBehavior(); final behavior = ChromeDinoSpittingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
final streamController = StreamController<ChromeDinoState>(); final streamController = StreamController<ChromeDinoState>();
final chompingState = ChromeDinoState( final chompingState = ChromeDinoState(
status: ChromeDinoStatus.chomping, status: ChromeDinoStatus.chomping,

@ -10,6 +10,8 @@ import 'package:pinball_components/src/components/chrome_dino/behaviors/behavior
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockChromeDinoCubit extends Mock implements ChromeDinoCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -30,7 +32,7 @@ void main() {
'creates a RevoluteJoint', 'creates a RevoluteJoint',
(game) async { (game) async {
final behavior = ChromeDinoSwivelingBehavior(); final behavior = ChromeDinoSwivelingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),
@ -52,7 +54,7 @@ void main() {
'reverses swivel direction on each timer tick', 'reverses swivel direction on each timer tick',
(game) async { (game) async {
final behavior = ChromeDinoSwivelingBehavior(); final behavior = ChromeDinoSwivelingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),
@ -84,7 +86,7 @@ void main() {
'and mouth is open', 'and mouth is open',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = ChromeDinoSwivelingBehavior(); final behavior = ChromeDinoSwivelingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),
@ -113,7 +115,7 @@ void main() {
'and mouth is closed', 'and mouth is closed',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = ChromeDinoSwivelingBehavior(); final behavior = ChromeDinoSwivelingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),
@ -141,7 +143,7 @@ void main() {
'and mouth is closed', 'and mouth is closed',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = ChromeDinoSwivelingBehavior(); final behavior = ChromeDinoSwivelingBehavior();
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),

@ -10,6 +10,8 @@ import 'package:pinball_components/src/components/chrome_dino/behaviors/behavior
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockChromeDinoCubit extends Mock implements ChromeDinoCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -73,7 +75,7 @@ void main() {
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async { flameTester.test('closes bloc when removed', (game) async {
final bloc = MockChromeDinoCubit(); final bloc = _MockChromeDinoCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<ChromeDinoState>.empty(), const Stream<ChromeDinoState>.empty(),

@ -1,6 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.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:mocktail/mocktail.dart';
@ -9,6 +10,12 @@ import 'package:pinball_components/src/components/dash_nest_bumper/behaviors/beh
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockDashNestBumperCubit extends Mock implements DashNestBumperCubit {}
class _MockBall extends Mock implements Ball {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -27,7 +34,7 @@ void main() {
'beginContact emits onBallContacted when contacts with a ball', 'beginContact emits onBallContacted when contacts with a ball',
(game) async { (game) async {
final behavior = DashNestBumperBallContactBehavior(); final behavior = DashNestBumperBallContactBehavior();
final bloc = MockDashNestBumperCubit(); final bloc = _MockDashNestBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<DashNestBumperState>.empty(), const Stream<DashNestBumperState>.empty(),
@ -38,7 +45,7 @@ void main() {
await dashNestBumper.add(behavior); await dashNestBumper.add(behavior);
await game.ensureAdd(dashNestBumper); await game.ensureAdd(dashNestBumper);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(_MockBall(), _MockContact());
verify(dashNestBumper.bloc.onBallContacted).called(1); verify(dashNestBumper.bloc.onBallContacted).called(1);
}, },

@ -11,6 +11,8 @@ import 'package:pinball_components/src/components/dash_nest_bumper/behaviors/beh
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockDashNestBumperCubit extends Mock implements DashNestBumperCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
@ -48,7 +50,7 @@ void main() {
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async { flameTester.test('closes bloc when removed', (game) async {
final bloc = MockDashNestBumperCubit(); final bloc = _MockDashNestBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<DashNestBumperState>.empty(), const Stream<DashNestBumperState>.empty(),

@ -1,6 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.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:mocktail/mocktail.dart';
@ -9,6 +10,12 @@ import 'package:pinball_components/src/components/google_letter/behaviors/behavi
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGoogleLetterCubit extends Mock implements GoogleLetterCubit {}
class _MockBall extends Mock implements Ball {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -27,7 +34,7 @@ void main() {
'beginContact emits onBallContacted when contacts with a ball', 'beginContact emits onBallContacted when contacts with a ball',
(game) async { (game) async {
final behavior = GoogleLetterBallContactBehavior(); final behavior = GoogleLetterBallContactBehavior();
final bloc = MockGoogleLetterCubit(); final bloc = _MockGoogleLetterCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<GoogleLetterState>.empty(), const Stream<GoogleLetterState>.empty(),
@ -38,7 +45,7 @@ void main() {
await googleLetter.add(behavior); await googleLetter.add(behavior);
await game.ensureAdd(googleLetter); await game.ensureAdd(googleLetter);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(_MockBall(), _MockContact());
verify(googleLetter.bloc.onBallContacted).called(1); verify(googleLetter.bloc.onBallContacted).called(1);
}, },

@ -10,6 +10,8 @@ import 'package:pinball_components/src/components/google_letter/behaviors/behavi
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockGoogleLetterCubit extends Mock implements GoogleLetterCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -104,7 +106,7 @@ void main() {
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async { flameTester.test('closes bloc when removed', (game) async {
final bloc = MockGoogleLetterCubit(); final bloc = _MockGoogleLetterCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<GoogleLetterState>.empty(), const Stream<GoogleLetterState>.empty(),

@ -1,6 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.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:mocktail/mocktail.dart';
@ -11,6 +12,10 @@ import '../../../../helpers/helpers.dart';
class _MockKickerCubit extends Mock implements KickerCubit {} class _MockKickerCubit extends Mock implements KickerCubit {}
class _MockBall extends Mock implements Ball {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -43,7 +48,7 @@ void main() {
await kicker.add(behavior); await kicker.add(behavior);
await game.ensureAdd(kicker); await game.ensureAdd(kicker);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(_MockBall(), _MockContact());
verify(kicker.bloc.onBallContacted).called(1); verify(kicker.bloc.onBallContacted).called(1);
}, },

@ -7,6 +7,12 @@ import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockBall extends Mock implements Ball {}
class _MockBody extends Mock implements Body {}
class _MockContact extends Mock implements Contact {}
class TestLayerSensor extends LayerSensor { class TestLayerSensor extends LayerSensor {
TestLayerSensor({ TestLayerSensor({
required LayerEntranceOrientation orientation, required LayerEntranceOrientation orientation,
@ -115,8 +121,8 @@ void main() {
late Layer insideLayer; late Layer insideLayer;
setUp(() { setUp(() {
ball = MockBall(); ball = _MockBall();
body = MockBody(); body = _MockBody();
insideZIndex = 1; insideZIndex = 1;
insideLayer = Layer.spaceshipEntranceRamp; insideLayer = Layer.spaceshipEntranceRamp;
@ -136,13 +142,13 @@ void main() {
when(() => body.linearVelocity).thenReturn(Vector2(0, -1)); when(() => body.linearVelocity).thenReturn(Vector2(0, -1));
sensor.beginContact(ball, MockContact()); sensor.beginContact(ball, _MockContact());
verify(() => ball.layer = insideLayer).called(1); verify(() => ball.layer = insideLayer).called(1);
verify(() => ball.zIndex = insideZIndex).called(1); verify(() => ball.zIndex = insideZIndex).called(1);
when(() => ball.layer).thenReturn(insideLayer); when(() => ball.layer).thenReturn(insideLayer);
sensor.beginContact(ball, MockContact()); sensor.beginContact(ball, _MockContact());
verify(() => ball.layer = Layer.board); verify(() => ball.layer = Layer.board);
verify(() => ball.zIndex = ZIndexes.ballOnBoard).called(1); verify(() => ball.zIndex = ZIndexes.ballOnBoard).called(1);
}); });
@ -159,13 +165,13 @@ void main() {
when(() => body.linearVelocity).thenReturn(Vector2(0, 1)); when(() => body.linearVelocity).thenReturn(Vector2(0, 1));
sensor.beginContact(ball, MockContact()); sensor.beginContact(ball, _MockContact());
verify(() => ball.layer = insideLayer).called(1); verify(() => ball.layer = insideLayer).called(1);
verify(() => ball.zIndex = insidePriority).called(1); verify(() => ball.zIndex = insidePriority).called(1);
when(() => ball.layer).thenReturn(insideLayer); when(() => ball.layer).thenReturn(insideLayer);
sensor.beginContact(ball, MockContact()); sensor.beginContact(ball, _MockContact());
verify(() => ball.layer = Layer.board); verify(() => ball.layer = Layer.board);
verify(() => ball.zIndex = ZIndexes.ballOnBoard).called(1); verify(() => ball.zIndex = ZIndexes.ballOnBoard).called(1);
}); });

@ -11,6 +11,8 @@ import 'package:pinball_components/src/components/multiball/behaviors/behaviors.
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockMultiballCubit extends Mock implements MultiballCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -22,7 +24,7 @@ void main() {
'calls onBlink every 0.1 seconds when animation state is animated', 'calls onBlink every 0.1 seconds when animation state is animated',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = MultiballBlinkingBehavior(); final behavior = MultiballBlinkingBehavior();
final bloc = MockMultiballCubit(); final bloc = _MockMultiballCubit();
final streamController = StreamController<MultiballState>(); final streamController = StreamController<MultiballState>();
whenListen( whenListen(
bloc, bloc,
@ -57,7 +59,7 @@ void main() {
'calls onStop when animation state is stopped', 'calls onStop when animation state is stopped',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = MultiballBlinkingBehavior(); final behavior = MultiballBlinkingBehavior();
final bloc = MockMultiballCubit(); final bloc = _MockMultiballCubit();
final streamController = StreamController<MultiballState>(); final streamController = StreamController<MultiballState>();
whenListen( whenListen(
bloc, bloc,
@ -94,7 +96,7 @@ void main() {
'onTick stops when there is no animation', 'onTick stops when there is no animation',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = MultiballBlinkingBehavior(); final behavior = MultiballBlinkingBehavior();
final bloc = MockMultiballCubit(); final bloc = _MockMultiballCubit();
final streamController = StreamController<MultiballState>(); final streamController = StreamController<MultiballState>();
whenListen( whenListen(
bloc, bloc,
@ -125,7 +127,7 @@ void main() {
'onTick stops after 10 blinks repetitions', 'onTick stops after 10 blinks repetitions',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = MultiballBlinkingBehavior(); final behavior = MultiballBlinkingBehavior();
final bloc = MockMultiballCubit(); final bloc = _MockMultiballCubit();
final streamController = StreamController<MultiballState>(); final streamController = StreamController<MultiballState>();
whenListen( whenListen(
bloc, bloc,

@ -10,6 +10,8 @@ import 'package:pinball_components/src/components/multiball/behaviors/behaviors.
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockMultiballCubit extends Mock implements MultiballCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -50,7 +52,7 @@ void main() {
flameTester.test( flameTester.test(
'closes bloc when removed', 'closes bloc when removed',
(game) async { (game) async {
final bloc = MockMultiballCubit(); final bloc = _MockMultiballCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<MultiballLightState>.empty(), const Stream<MultiballLightState>.empty(),

@ -9,9 +9,9 @@ import 'package:pinball_components/pinball_components.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
void main() { class _MockMultiplierCubit extends Mock implements MultiplierCubit {}
final bloc = MockMultiplierCubit();
void main() {
group('Multiplier', () { group('Multiplier', () {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -27,6 +27,11 @@ void main() {
Assets.images.multiplier.x6.dimmed.keyName, Assets.images.multiplier.x6.dimmed.keyName,
]; ];
final flameTester = FlameTester(() => TestGame(assets)); final flameTester = FlameTester(() => TestGame(assets));
late MultiplierCubit bloc;
setUp(() {
bloc = _MockMultiplierCubit();
});
flameTester.test('"x2" loads correctly', (game) async { flameTester.test('"x2" loads correctly', (game) async {
final multiplier = Multiplier.x2( final multiplier = Multiplier.x2(

@ -1,6 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.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:mocktail/mocktail.dart';
@ -9,6 +10,12 @@ import 'package:pinball_components/src/components/sparky_bumper/behaviors/behavi
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockSparkyBumperCubit extends Mock implements SparkyBumperCubit {}
class _MockBall extends Mock implements Ball {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -27,7 +34,7 @@ void main() {
'beginContact emits onBallContacted when contacts with a ball', 'beginContact emits onBallContacted when contacts with a ball',
(game) async { (game) async {
final behavior = SparkyBumperBallContactBehavior(); final behavior = SparkyBumperBallContactBehavior();
final bloc = MockSparkyBumperCubit(); final bloc = _MockSparkyBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<SparkyBumperState>.empty(), const Stream<SparkyBumperState>.empty(),
@ -38,7 +45,7 @@ void main() {
await sparkyBumper.add(behavior); await sparkyBumper.add(behavior);
await game.ensureAdd(sparkyBumper); await game.ensureAdd(sparkyBumper);
behavior.beginContact(MockBall(), MockContact()); behavior.beginContact(_MockBall(), _MockContact());
verify(sparkyBumper.bloc.onBallContacted).called(1); verify(sparkyBumper.bloc.onBallContacted).called(1);
}, },

@ -9,6 +9,8 @@ import 'package:pinball_components/src/components/sparky_bumper/behaviors/behavi
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockSparkyBumperCubit extends Mock implements SparkyBumperCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -20,7 +22,7 @@ void main() {
'calls onBlinked after 0.05 seconds when dimmed', 'calls onBlinked after 0.05 seconds when dimmed',
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = SparkyBumperBlinkingBehavior(); final behavior = SparkyBumperBlinkingBehavior();
final bloc = MockSparkyBumperCubit(); final bloc = _MockSparkyBumperCubit();
final streamController = StreamController<SparkyBumperState>(); final streamController = StreamController<SparkyBumperState>();
whenListen( whenListen(
bloc, bloc,

@ -11,6 +11,8 @@ import 'package:pinball_components/src/components/sparky_bumper/behaviors/behavi
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockSparkyBumperCubit extends Mock implements SparkyBumperCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -46,7 +48,7 @@ void main() {
// https://github.com/flame-engine/flame/pull/1538 // https://github.com/flame-engine/flame/pull/1538
// ignore: public_member_api_docs // ignore: public_member_api_docs
flameTester.test('closes bloc when removed', (game) async { flameTester.test('closes bloc when removed', (game) async {
final bloc = MockSparkyBumperCubit(); final bloc = _MockSparkyBumperCubit();
whenListen( whenListen(
bloc, bloc,
const Stream<SparkyBumperState>.empty(), const Stream<SparkyBumperState>.empty(),

@ -1,7 +0,0 @@
import 'package:flame/components.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:mocktail/mocktail.dart';
class MockForge2DGame extends Mock implements Forge2DGame {}
class MockComponent extends Mock implements Component {}

@ -6,13 +6,13 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
abstract class _KeyCallStub { abstract class _KeyCall {
bool onCall(); bool onCall();
} }
class KeyCallStub extends Mock implements _KeyCallStub {} class _MockKeyCall extends Mock implements _KeyCall {}
class MockRawKeyUpEvent extends Mock implements RawKeyUpEvent { class _MockRawKeyUpEvent extends Mock implements RawKeyUpEvent {
@override @override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return super.toString(); return super.toString();
@ -20,7 +20,7 @@ class MockRawKeyUpEvent extends Mock implements RawKeyUpEvent {
} }
RawKeyUpEvent _mockKeyUp(LogicalKeyboardKey key) { RawKeyUpEvent _mockKeyUp(LogicalKeyboardKey key) {
final event = MockRawKeyUpEvent(); final event = _MockRawKeyUpEvent();
when(() => event.logicalKey).thenReturn(key); when(() => event.logicalKey).thenReturn(key);
return event; return event;
} }
@ -28,7 +28,7 @@ RawKeyUpEvent _mockKeyUp(LogicalKeyboardKey key) {
void main() { void main() {
group('KeyboardInputController', () { group('KeyboardInputController', () {
test('calls registered handlers', () { test('calls registered handlers', () {
final stub = KeyCallStub(); final stub = _MockKeyCall();
when(stub.onCall).thenReturn(true); when(stub.onCall).thenReturn(true);
final input = KeyboardInputController( final input = KeyboardInputController(
@ -44,7 +44,7 @@ void main() {
test( test(
'returns false the handler return value', 'returns false the handler return value',
() { () {
final stub = KeyCallStub(); final stub = _MockKeyCall();
when(stub.onCall).thenReturn(false); when(stub.onCall).thenReturn(false);
final input = KeyboardInputController( final input = KeyboardInputController(
@ -63,7 +63,7 @@ void main() {
test( test(
'returns true (allowing event to bubble) when no handler is registered', 'returns true (allowing event to bubble) when no handler is registered',
() { () {
final stub = KeyCallStub(); final stub = _MockKeyCall();
when(stub.onCall).thenReturn(true); when(stub.onCall).thenReturn(true);
final input = KeyboardInputController(); final input = KeyboardInputController();

@ -3,12 +3,12 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_flame/pinball_flame.dart';
class MockSpriteAnimationController extends Mock class _MockSpriteAnimationController extends Mock
implements SpriteAnimationController {} implements SpriteAnimationController {}
class MockSpriteAnimation extends Mock implements SpriteAnimation {} class _MockSpriteAnimation extends Mock implements SpriteAnimation {}
class MockSprite extends Mock implements Sprite {} class _MockSprite extends Mock implements Sprite {}
// TODO(arturplaczek): Remove when this PR will be merged. // TODO(arturplaczek): Remove when this PR will be merged.
// https://github.com/flame-engine/flame/pull/1552 // https://github.com/flame-engine/flame/pull/1552
@ -20,9 +20,9 @@ void main() {
late Sprite sprite; late Sprite sprite;
setUp(() { setUp(() {
controller = MockSpriteAnimationController(); controller = _MockSpriteAnimationController();
animation = MockSpriteAnimation(); animation = _MockSpriteAnimation();
sprite = MockSprite(); sprite = _MockSprite();
when(() => controller.animation).thenAnswer((_) => animation); when(() => controller.animation).thenAnswer((_) => animation);

@ -3,7 +3,7 @@ import 'package:mocktail/mocktail.dart';
import 'package:pinball_ui/pinball_ui.dart'; import 'package:pinball_ui/pinball_ui.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart';
class MockUrlLauncher extends Mock class _MockUrlLauncher extends Mock
with MockPlatformInterfaceMixin with MockPlatformInterfaceMixin
implements UrlLauncherPlatform {} implements UrlLauncherPlatform {}
@ -11,7 +11,7 @@ void main() {
late UrlLauncherPlatform urlLauncher; late UrlLauncherPlatform urlLauncher;
setUp(() { setUp(() {
urlLauncher = MockUrlLauncher(); urlLauncher = _MockUrlLauncher();
UrlLauncherPlatform.instance = urlLauncher; UrlLauncherPlatform.instance = urlLauncher;
}); });

@ -13,7 +13,13 @@ import 'package:pinball/app/app.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import '../../helpers/mocks.dart'; class _MockAuthenticationRepository extends Mock
implements AuthenticationRepository {}
class _MockPinballAudio extends Mock implements PinballAudio {}
class _MockLeaderboardRepository extends Mock implements LeaderboardRepository {
}
void main() { void main() {
group('App', () { group('App', () {
@ -22,9 +28,9 @@ void main() {
late PinballAudio pinballAudio; late PinballAudio pinballAudio;
setUp(() { setUp(() {
authenticationRepository = MockAuthenticationRepository(); authenticationRepository = _MockAuthenticationRepository();
leaderboardRepository = MockLeaderboardRepository(); leaderboardRepository = _MockLeaderboardRepository();
pinballAudio = MockPinballAudio(); pinballAudio = _MockPinballAudio();
when(pinballAudio.load).thenAnswer((_) => Future.value()); when(pinballAudio.load).thenAnswer((_) => Future.value());
}); });

@ -3,15 +3,20 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball/footer/footer.dart'; import 'package:pinball/footer/footer.dart';
import 'package:pinball_ui/pinball_ui.dart'; import 'package:pinball_ui/pinball_ui.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import '../helpers/helpers.dart'; import '../helpers/helpers.dart';
class _MockUrlLauncher extends Mock
with MockPlatformInterfaceMixin
implements UrlLauncherPlatform {}
void main() { void main() {
group('Footer', () { group('Footer', () {
late UrlLauncherPlatform urlLauncher; late UrlLauncherPlatform urlLauncher;
setUp(() async { setUp(() async {
urlLauncher = MockUrlLauncher(); urlLauncher = _MockUrlLauncher();
UrlLauncherPlatform.instance = urlLauncher; UrlLauncherPlatform.instance = urlLauncher;
}); });
testWidgets('renders "Made with..." and "Google I/O"', (tester) async { testWidgets('renders "Made with..." and "Google I/O"', (tester) async {

@ -11,6 +11,8 @@ import 'package:pinball_components/pinball_components.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -41,7 +43,7 @@ void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),

@ -14,8 +14,8 @@ import '../../helpers/helpers.dart';
// TODO(allisonryan0002): remove once // TODO(allisonryan0002): remove once
// https://github.com/flame-engine/flame/pull/1520 is merged // https://github.com/flame-engine/flame/pull/1520 is merged
class WrappedBallController extends BallController { class _WrappedBallController extends BallController {
WrappedBallController(Ball<Forge2DGame> ball, this._gameRef) : super(ball); _WrappedBallController(Ball<Forge2DGame> ball, this._gameRef) : super(ball);
final PinballGame _gameRef; final PinballGame _gameRef;
@ -23,6 +23,14 @@ class WrappedBallController extends BallController {
PinballGame get gameRef => _gameRef; PinballGame get gameRef => _gameRef;
} }
class _MockGameBloc extends Mock implements GameBloc {}
class _MockPinballGame extends Mock implements PinballGame {}
class _MockControlledBall extends Mock implements ControlledBall {}
class _MockBall extends Mock implements Ball {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
@ -32,7 +40,7 @@ void main() {
setUp(() { setUp(() {
ball = Ball(baseColor: const Color(0xFF00FFFF)); ball = Ball(baseColor: const Color(0xFF00FFFF));
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),
@ -47,7 +55,7 @@ void main() {
test('can be instantiated', () { test('can be instantiated', () {
expect( expect(
BallController(MockBall()), BallController(_MockBall()),
isA<BallController>(), isA<BallController>(),
); );
}); });
@ -112,9 +120,9 @@ void main() {
flameBlocTester.test( flameBlocTester.test(
'initially stops the ball', 'initially stops the ball',
(game) async { (game) async {
final gameRef = MockPinballGame(); final gameRef = _MockPinballGame();
final ball = MockControlledBall(); final ball = _MockControlledBall();
final controller = WrappedBallController(ball, gameRef); final controller = _WrappedBallController(ball, gameRef);
when(() => gameRef.read<GameBloc>()).thenReturn(gameBloc); when(() => gameRef.read<GameBloc>()).thenReturn(gameBloc);
when(() => ball.controller).thenReturn(controller); when(() => ball.controller).thenReturn(controller);
when(() => ball.boost(any())).thenAnswer((_) async {}); when(() => ball.boost(any())).thenAnswer((_) async {});
@ -128,9 +136,9 @@ void main() {
flameBlocTester.test( flameBlocTester.test(
'resumes the ball', 'resumes the ball',
(game) async { (game) async {
final gameRef = MockPinballGame(); final gameRef = _MockPinballGame();
final ball = MockControlledBall(); final ball = _MockControlledBall();
final controller = WrappedBallController(ball, gameRef); final controller = _WrappedBallController(ball, gameRef);
when(() => gameRef.read<GameBloc>()).thenReturn(gameBloc); when(() => gameRef.read<GameBloc>()).thenReturn(gameBloc);
when(() => ball.controller).thenReturn(controller); when(() => ball.controller).thenReturn(controller);
when(() => ball.boost(any())).thenAnswer((_) async {}); when(() => ball.boost(any())).thenAnswer((_) async {});
@ -144,9 +152,9 @@ void main() {
flameBlocTester.test( flameBlocTester.test(
'boosts the ball', 'boosts the ball',
(game) async { (game) async {
final gameRef = MockPinballGame(); final gameRef = _MockPinballGame();
final ball = MockControlledBall(); final ball = _MockControlledBall();
final controller = WrappedBallController(ball, gameRef); final controller = _WrappedBallController(ball, gameRef);
when(() => gameRef.read<GameBloc>()).thenReturn(gameBloc); when(() => gameRef.read<GameBloc>()).thenReturn(gameBloc);
when(() => ball.controller).thenReturn(controller); when(() => ball.controller).thenReturn(controller);
when(() => ball.boost(any())).thenAnswer((_) async {}); when(() => ball.boost(any())).thenAnswer((_) async {});

@ -4,11 +4,14 @@ import 'package:bloc_test/bloc_test.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -22,7 +25,7 @@ void main() {
final flameBlocTester = FlameBlocTester<EmptyPinballTestGame, GameBloc>( final flameBlocTester = FlameBlocTester<EmptyPinballTestGame, GameBloc>(
gameBuilder: EmptyPinballTestGame.new, gameBuilder: EmptyPinballTestGame.new,
blocBuilder: () { blocBuilder: () {
final bloc = MockGameBloc(); final bloc = _MockGameBloc();
const state = GameState( const state = GameState(
score: 0, score: 0,
multiplier: 1, multiplier: 1,

@ -5,11 +5,14 @@ import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(EmptyPinballTestGame.new); final flameTester = FlameTester(EmptyPinballTestGame.new);
@ -17,7 +20,7 @@ void main() {
final flameBlocTester = FlameBlocTester<EmptyPinballTestGame, GameBloc>( final flameBlocTester = FlameBlocTester<EmptyPinballTestGame, GameBloc>(
gameBuilder: EmptyPinballTestGame.new, gameBuilder: EmptyPinballTestGame.new,
blocBuilder: () { blocBuilder: () {
final bloc = MockGameBloc(); final bloc = _MockGameBloc();
const state = GameState( const state = GameState(
score: 0, score: 0,
multiplier: 1, multiplier: 1,

@ -10,6 +10,10 @@ import 'package:pinball_components/pinball_components.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
class _MockBall extends Mock implements Ball {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -25,7 +29,7 @@ void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),
@ -51,7 +55,7 @@ void main() {
await game.ensureAdd(parent); await game.ensureAdd(parent);
await parent.ensureAdd(behavior); await parent.ensureAdd(behavior);
chromeDino.bloc.onChomp(MockBall()); chromeDino.bloc.onChomp(_MockBall());
await tester.pump(); await tester.pump();
verify( verify(

@ -8,6 +8,12 @@ import 'package:pinball/game/game.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockControlledBall extends Mock implements ControlledBall {}
class _MockBallController extends Mock implements BallController {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final flameTester = FlameTester(TestGame.new); final flameTester = FlameTester(TestGame.new);
@ -18,7 +24,6 @@ void main() {
(game) async { (game) async {
final drain = Drain(); final drain = Drain();
await game.ensureAdd(drain); await game.ensureAdd(drain);
expect(game.contains(drain), isTrue); expect(game.contains(drain), isTrue);
}, },
); );
@ -28,7 +33,6 @@ void main() {
(game) async { (game) async {
final drain = Drain(); final drain = Drain();
await game.ensureAdd(drain); await game.ensureAdd(drain);
expect(drain.body.bodyType, equals(BodyType.static)); expect(drain.body.bodyType, equals(BodyType.static));
}, },
); );
@ -38,7 +42,6 @@ void main() {
(game) async { (game) async {
final drain = Drain(); final drain = Drain();
await game.ensureAdd(drain); await game.ensureAdd(drain);
expect(drain.body.fixtures.first.isSensor, isTrue); expect(drain.body.fixtures.first.isSensor, isTrue);
}, },
); );
@ -47,11 +50,11 @@ void main() {
'calls lost on contact with ball', 'calls lost on contact with ball',
() async { () async {
final drain = Drain(); final drain = Drain();
final ball = MockControlledBall(); final ball = _MockControlledBall();
final controller = MockBallController(); final controller = _MockBallController();
when(() => ball.controller).thenReturn(controller); when(() => ball.controller).thenReturn(controller);
drain.beginContact(ball, MockContact()); drain.beginContact(ball, _MockContact());
verify(controller.lost).called(1); verify(controller.lost).called(1);
}, },

@ -13,13 +13,15 @@ import 'package:pinball_flame/pinball_flame.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
group('FlutterForestBonusBehavior', () { group('FlutterForestBonusBehavior', () {
late GameBloc gameBloc; late GameBloc gameBloc;
final assets = [Assets.images.dash.animatronic.keyName]; final assets = [Assets.images.dash.animatronic.keyName];
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),

@ -8,7 +8,16 @@ import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
import '../../helpers/helpers.dart'; class _MockPinballGame extends Mock implements PinballGame {}
class _MockBackboard extends Mock implements Backboard {}
class _MockCameraController extends Mock implements CameraController {}
class _MockActiveOverlaysNotifier extends Mock
implements ActiveOverlaysNotifier {}
class _MockPinballAudio extends Mock implements PinballAudio {}
void main() { void main() {
group('GameFlowController', () { group('GameFlowController', () {
@ -23,7 +32,7 @@ void main() {
final previous = GameState.initial(); final previous = GameState.initial();
expect( expect(
GameFlowController(MockPinballGame()).listenWhen(previous, state), GameFlowController(_MockPinballGame()).listenWhen(previous, state),
isTrue, isTrue,
); );
}); });
@ -38,12 +47,12 @@ void main() {
late ActiveOverlaysNotifier overlays; late ActiveOverlaysNotifier overlays;
setUp(() { setUp(() {
game = MockPinballGame(); game = _MockPinballGame();
backboard = MockBackboard(); backboard = _MockBackboard();
cameraController = MockCameraController(); cameraController = _MockCameraController();
gameFlowController = GameFlowController(game); gameFlowController = GameFlowController(game);
overlays = MockActiveOverlaysNotifier(); overlays = _MockActiveOverlaysNotifier();
pinballAudio = MockPinballAudio(); pinballAudio = _MockPinballAudio();
when( when(
() => backboard.gameOverMode( () => backboard.gameOverMode(

@ -10,6 +10,8 @@ import 'package:pinball_components/pinball_components.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -31,7 +33,7 @@ void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),

@ -12,6 +12,10 @@ import 'package:pinball_components/pinball_components.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
class _MockMultiballCubit extends Mock implements MultiballCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -23,7 +27,7 @@ void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),
@ -89,8 +93,8 @@ void main() {
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = MultiballsBehavior(); final behavior = MultiballsBehavior();
final parent = Multiballs.test(); final parent = Multiballs.test();
final multiballCubit = MockMultiballCubit(); final multiballCubit = _MockMultiballCubit();
final otherMultiballCubit = MockMultiballCubit(); final otherMultiballCubit = _MockMultiballCubit();
final multiballs = [ final multiballs = [
Multiball.test( Multiball.test(
bloc: multiballCubit, bloc: multiballCubit,

@ -3,6 +3,7 @@
import 'dart:async'; import 'dart:async';
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flame/components.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:mocktail/mocktail.dart';
@ -12,6 +13,12 @@ import 'package:pinball_components/pinball_components.dart';
import '../../../../helpers/helpers.dart'; import '../../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
class _MockComponent extends Mock implements Component {}
class _MockMultiplierCubit extends Mock implements MultiplierCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -31,8 +38,8 @@ void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() { setUp(() {
registerFallbackValue(MockComponent()); registerFallbackValue(_MockComponent());
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),
@ -84,8 +91,8 @@ void main() {
setUp: (game, tester) async { setUp: (game, tester) async {
final behavior = MultipliersBehavior(); final behavior = MultipliersBehavior();
final parent = Multipliers.test(); final parent = Multipliers.test();
final multiplierX2Cubit = MockMultiplierCubit(); final multiplierX2Cubit = _MockMultiplierCubit();
final multiplierX3Cubit = MockMultiplierCubit(); final multiplierX3Cubit = _MockMultiplierCubit();
final multipliers = [ final multipliers = [
Multiplier.test( Multiplier.test(
value: MultiplierValue.x2, value: MultiplierValue.x2,

@ -17,6 +17,16 @@ class _TestBodyComponent extends BodyComponent {
Body createBody() => world.createBody(BodyDef()); Body createBody() => world.createBody(BodyDef());
} }
class _MockPinballAudio extends Mock implements PinballAudio {}
class _MockBall extends Mock implements Ball {}
class _MockBody extends Mock implements Body {}
class _MockGameBloc extends Mock implements GameBloc {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -34,10 +44,9 @@ void main() {
late BodyComponent parent; late BodyComponent parent;
setUp(() { setUp(() {
audio = MockPinballAudio(); audio = _MockPinballAudio();
ball = _MockBall();
ball = MockBall(); final ballBody = _MockBody();
final ballBody = MockBody();
when(() => ball.body).thenReturn(ballBody); when(() => ball.body).thenReturn(ballBody);
when(() => ballBody.position).thenReturn(Vector2.all(4)); when(() => ballBody.position).thenReturn(Vector2.all(4));
@ -49,7 +58,7 @@ void main() {
audio: audio, audio: audio,
), ),
blocBuilder: () { blocBuilder: () {
bloc = MockGameBloc(); bloc = _MockGameBloc();
const state = GameState( const state = GameState(
score: 0, score: 0,
multiplier: 1, multiplier: 1,
@ -71,7 +80,7 @@ void main() {
final canvas = ZCanvasComponent(children: [parent]); final canvas = ZCanvasComponent(children: [parent]);
await game.ensureAdd(canvas); await game.ensureAdd(canvas);
scoringBehavior.beginContact(ball, MockContact()); scoringBehavior.beginContact(ball, _MockContact());
verify( verify(
() => bloc.add( () => bloc.add(
@ -89,7 +98,7 @@ void main() {
final canvas = ZCanvasComponent(children: [parent]); final canvas = ZCanvasComponent(children: [parent]);
await game.ensureAdd(canvas); await game.ensureAdd(canvas);
scoringBehavior.beginContact(ball, MockContact()); scoringBehavior.beginContact(ball, _MockContact());
verify(audio.score).called(1); verify(audio.score).called(1);
}, },
@ -104,7 +113,7 @@ void main() {
final canvas = ZCanvasComponent(children: [parent]); final canvas = ZCanvasComponent(children: [parent]);
await game.ensureAdd(canvas); await game.ensureAdd(canvas);
scoringBehavior.beginContact(ball, MockContact()); scoringBehavior.beginContact(ball, _MockContact());
await game.ready(); await game.ready();
final scoreText = game.descendants().whereType<ScoreComponent>(); final scoreText = game.descendants().whereType<ScoreComponent>();

@ -1,5 +1,6 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
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:mocktail/mocktail.dart';
@ -8,6 +9,12 @@ import 'package:pinball_components/pinball_components.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockControlledBall extends Mock implements ControlledBall {}
class _MockBallController extends Mock implements BallController {}
class _MockContact extends Mock implements Contact {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -73,8 +80,8 @@ void main() {
group('SparkyComputerSensor', () { group('SparkyComputerSensor', () {
flameTester.test('calls turboCharge', (game) async { flameTester.test('calls turboCharge', (game) async {
final sensor = SparkyComputerSensor(); final sensor = SparkyComputerSensor();
final ball = MockControlledBall(); final ball = _MockControlledBall();
final controller = MockBallController(); final controller = _MockBallController();
when(() => ball.controller).thenReturn(controller); when(() => ball.controller).thenReturn(controller);
when(controller.turboCharge).thenAnswer((_) async {}); when(controller.turboCharge).thenAnswer((_) async {});
@ -83,7 +90,7 @@ void main() {
SparkyAnimatronic(), SparkyAnimatronic(),
]); ]);
sensor.beginContact(ball, MockContact()); sensor.beginContact(ball, _MockContact());
verify(() => ball.controller.turboCharge()).called(1); verify(() => ball.controller.turboCharge()).called(1);
}); });
@ -91,8 +98,8 @@ void main() {
flameTester.test('plays SparkyAnimatronic', (game) async { flameTester.test('plays SparkyAnimatronic', (game) async {
final sensor = SparkyComputerSensor(); final sensor = SparkyComputerSensor();
final sparkyAnimatronic = SparkyAnimatronic(); final sparkyAnimatronic = SparkyAnimatronic();
final ball = MockControlledBall(); final ball = _MockControlledBall();
final controller = MockBallController(); final controller = _MockBallController();
when(() => ball.controller).thenReturn(controller); when(() => ball.controller).thenReturn(controller);
when(controller.turboCharge).thenAnswer((_) async {}); when(controller.turboCharge).thenAnswer((_) async {});
await game.ensureAddAll([ await game.ensureAddAll([
@ -101,7 +108,7 @@ void main() {
]); ]);
expect(sparkyAnimatronic.playing, isFalse); expect(sparkyAnimatronic.playing, isFalse);
sensor.beginContact(ball, MockContact()); sensor.beginContact(ball, _MockContact());
expect(sparkyAnimatronic.playing, isTrue); expect(sparkyAnimatronic.playing, isTrue);
}); });
}); });

@ -1,8 +1,7 @@
// ignore_for_file: cascade_invocations // ignore_for_file: cascade_invocations
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flame/components.dart'; import 'package:flame/input.dart';
import 'package:flame/game.dart';
import 'package:flame_test/flame_test.dart'; import 'package:flame_test/flame_test.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
@ -12,6 +11,20 @@ import 'package:pinball_components/pinball_components.dart';
import '../helpers/helpers.dart'; import '../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
class _MockGameState extends Mock implements GameState {}
class _MockEventPosition extends Mock implements EventPosition {}
class _MockTapDownDetails extends Mock implements TapDownDetails {}
class _MockTapDownInfo extends Mock implements TapDownInfo {}
class _MockTapUpDetails extends Mock implements TapUpDetails {}
class _MockTapUpInfo extends Mock implements TapUpInfo {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
final assets = [ final assets = [
@ -115,7 +128,7 @@ void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,
const Stream<GameState>.empty(), const Stream<GameState>.empty(),
@ -210,7 +223,7 @@ void main() {
setUp: (game, tester) async { setUp: (game, tester) async {
// TODO(ruimiguel): check why testGameWidget doesn't add any ball // TODO(ruimiguel): check why testGameWidget doesn't add any ball
// to the game. Test needs to have no balls, so fortunately works. // to the game. Test needs to have no balls, so fortunately works.
final newState = MockGameState(); final newState = _MockGameState();
when(() => newState.isGameOver).thenReturn(false); when(() => newState.isGameOver).thenReturn(false);
game.descendants().whereType<ControlledBall>().forEach( game.descendants().whereType<ControlledBall>().forEach(
(ball) => ball.controller.lost(), (ball) => ball.controller.lost(),
@ -218,7 +231,7 @@ void main() {
await game.ready(); await game.ready();
expect( expect(
game.controller.listenWhen(MockGameState(), newState), game.controller.listenWhen(_MockGameState(), newState),
isTrue, isTrue,
); );
}, },
@ -227,7 +240,7 @@ void main() {
flameTester.test( flameTester.test(
"doesn't listen when some balls are left", "doesn't listen when some balls are left",
(game) async { (game) async {
final newState = MockGameState(); final newState = _MockGameState();
when(() => newState.isGameOver).thenReturn(false); when(() => newState.isGameOver).thenReturn(false);
expect( expect(
@ -235,7 +248,7 @@ void main() {
greaterThan(0), greaterThan(0),
); );
expect( expect(
game.controller.listenWhen(MockGameState(), newState), game.controller.listenWhen(_MockGameState(), newState),
isFalse, isFalse,
); );
}, },
@ -246,7 +259,7 @@ void main() {
setUp: (game, tester) async { setUp: (game, tester) async {
// TODO(ruimiguel): check why testGameWidget doesn't add any ball // TODO(ruimiguel): check why testGameWidget doesn't add any ball
// to the game. Test needs to have no balls, so fortunately works. // to the game. Test needs to have no balls, so fortunately works.
final newState = MockGameState(); final newState = _MockGameState();
when(() => newState.isGameOver).thenReturn(true); when(() => newState.isGameOver).thenReturn(true);
game.descendants().whereType<ControlledBall>().forEach( game.descendants().whereType<ControlledBall>().forEach(
(ball) => ball.controller.lost(), (ball) => ball.controller.lost(),
@ -258,7 +271,7 @@ void main() {
isTrue, isTrue,
); );
expect( expect(
game.controller.listenWhen(MockGameState(), newState), game.controller.listenWhen(_MockGameState(), newState),
isFalse, isFalse,
); );
}, },
@ -274,7 +287,7 @@ void main() {
final previousBalls = final previousBalls =
game.descendants().whereType<ControlledBall>().toList(); game.descendants().whereType<ControlledBall>().toList();
game.controller.onNewState(MockGameState()); game.controller.onNewState(_MockGameState());
await game.ready(); await game.ready();
final currentBalls = final currentBalls =
game.descendants().whereType<ControlledBall>().toList(); game.descendants().whereType<ControlledBall>().toList();
@ -294,14 +307,14 @@ void main() {
flameTester.test('tap down moves left flipper up', (game) async { flameTester.test('tap down moves left flipper up', (game) async {
await game.ready(); await game.ready();
final eventPosition = MockEventPosition(); final eventPosition = _MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2.zero()); when(() => eventPosition.game).thenReturn(Vector2.zero());
when(() => eventPosition.widget).thenReturn(Vector2.zero()); when(() => eventPosition.widget).thenReturn(Vector2.zero());
final raw = MockTapDownDetails(); final raw = _MockTapDownDetails();
when(() => raw.kind).thenReturn(PointerDeviceKind.touch); when(() => raw.kind).thenReturn(PointerDeviceKind.touch);
final tapDownEvent = MockTapDownInfo(); final tapDownEvent = _MockTapDownInfo();
when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); when(() => tapDownEvent.eventPosition).thenReturn(eventPosition);
when(() => tapDownEvent.raw).thenReturn(raw); when(() => tapDownEvent.raw).thenReturn(raw);
@ -317,14 +330,14 @@ void main() {
flameTester.test('tap down moves right flipper up', (game) async { flameTester.test('tap down moves right flipper up', (game) async {
await game.ready(); await game.ready();
final eventPosition = MockEventPosition(); final eventPosition = _MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2.zero()); when(() => eventPosition.game).thenReturn(Vector2.zero());
when(() => eventPosition.widget).thenReturn(game.canvasSize); when(() => eventPosition.widget).thenReturn(game.canvasSize);
final raw = MockTapDownDetails(); final raw = _MockTapDownDetails();
when(() => raw.kind).thenReturn(PointerDeviceKind.touch); when(() => raw.kind).thenReturn(PointerDeviceKind.touch);
final tapDownEvent = MockTapDownInfo(); final tapDownEvent = _MockTapDownInfo();
when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); when(() => tapDownEvent.eventPosition).thenReturn(eventPosition);
when(() => tapDownEvent.raw).thenReturn(raw); when(() => tapDownEvent.raw).thenReturn(raw);
@ -340,14 +353,14 @@ void main() {
flameTester.test('tap up moves flipper down', (game) async { flameTester.test('tap up moves flipper down', (game) async {
await game.ready(); await game.ready();
final eventPosition = MockEventPosition(); final eventPosition = _MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2.zero()); when(() => eventPosition.game).thenReturn(Vector2.zero());
when(() => eventPosition.widget).thenReturn(Vector2.zero()); when(() => eventPosition.widget).thenReturn(Vector2.zero());
final raw = MockTapDownDetails(); final raw = _MockTapDownDetails();
when(() => raw.kind).thenReturn(PointerDeviceKind.touch); when(() => raw.kind).thenReturn(PointerDeviceKind.touch);
final tapDownEvent = MockTapDownInfo(); final tapDownEvent = _MockTapDownInfo();
when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); when(() => tapDownEvent.eventPosition).thenReturn(eventPosition);
when(() => tapDownEvent.raw).thenReturn(raw); when(() => tapDownEvent.raw).thenReturn(raw);
@ -359,7 +372,7 @@ void main() {
expect(flippers.first.body.linearVelocity.y, isNegative); expect(flippers.first.body.linearVelocity.y, isNegative);
final tapUpEvent = MockTapUpInfo(); final tapUpEvent = _MockTapUpInfo();
when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); when(() => tapUpEvent.eventPosition).thenReturn(eventPosition);
game.onTapUp(tapUpEvent); game.onTapUp(tapUpEvent);
@ -371,14 +384,14 @@ void main() {
flameTester.test('tap cancel moves flipper down', (game) async { flameTester.test('tap cancel moves flipper down', (game) async {
await game.ready(); await game.ready();
final eventPosition = MockEventPosition(); final eventPosition = _MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2.zero()); when(() => eventPosition.game).thenReturn(Vector2.zero());
when(() => eventPosition.widget).thenReturn(Vector2.zero()); when(() => eventPosition.widget).thenReturn(Vector2.zero());
final raw = MockTapDownDetails(); final raw = _MockTapDownDetails();
when(() => raw.kind).thenReturn(PointerDeviceKind.touch); when(() => raw.kind).thenReturn(PointerDeviceKind.touch);
final tapDownEvent = MockTapDownInfo(); final tapDownEvent = _MockTapDownInfo();
when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); when(() => tapDownEvent.eventPosition).thenReturn(eventPosition);
when(() => tapDownEvent.raw).thenReturn(raw); when(() => tapDownEvent.raw).thenReturn(raw);
@ -400,13 +413,13 @@ void main() {
flameTester.test('tap down moves plunger down', (game) async { flameTester.test('tap down moves plunger down', (game) async {
await game.ready(); await game.ready();
final eventPosition = MockEventPosition(); final eventPosition = _MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2(40, 60)); when(() => eventPosition.game).thenReturn(Vector2(40, 60));
final raw = MockTapDownDetails(); final raw = _MockTapDownDetails();
when(() => raw.kind).thenReturn(PointerDeviceKind.touch); when(() => raw.kind).thenReturn(PointerDeviceKind.touch);
final tapDownEvent = MockTapDownInfo(); final tapDownEvent = _MockTapDownInfo();
when(() => tapDownEvent.eventPosition).thenReturn(eventPosition); when(() => tapDownEvent.eventPosition).thenReturn(eventPosition);
when(() => tapDownEvent.raw).thenReturn(raw); when(() => tapDownEvent.raw).thenReturn(raw);
@ -425,13 +438,13 @@ void main() {
debugModeFlameTester.test( debugModeFlameTester.test(
'adds a ball on tap up', 'adds a ball on tap up',
(game) async { (game) async {
final eventPosition = MockEventPosition(); final eventPosition = _MockEventPosition();
when(() => eventPosition.game).thenReturn(Vector2.all(10)); when(() => eventPosition.game).thenReturn(Vector2.all(10));
final raw = MockTapUpDetails(); final raw = _MockTapUpDetails();
when(() => raw.kind).thenReturn(PointerDeviceKind.mouse); when(() => raw.kind).thenReturn(PointerDeviceKind.mouse);
final tapUpEvent = MockTapUpInfo(); final tapUpEvent = _MockTapUpInfo();
when(() => tapUpEvent.eventPosition).thenReturn(eventPosition); when(() => tapUpEvent.eventPosition).thenReturn(eventPosition);
when(() => tapUpEvent.raw).thenReturn(raw); when(() => tapUpEvent.raw).thenReturn(raw);

@ -4,12 +4,21 @@ import 'package:bloc_test/bloc_test.dart';
import 'package:flame/game.dart'; import 'package:flame/game.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball/start_game/start_game.dart'; import 'package:pinball/start_game/start_game.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
class _MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {}
class _MockAssetsManagerCubit extends Mock implements AssetsManagerCubit {}
class _MockStartGameBloc extends Mock implements StartGameBloc {}
void main() { void main() {
final game = PinballTestGame(); final game = PinballTestGame();
@ -19,8 +28,8 @@ void main() {
setUp(() async { setUp(() async {
await Future.wait<void>(game.preLoadAssets()); await Future.wait<void>(game.preLoadAssets());
characterThemeCubit = MockCharacterThemeCubit(); characterThemeCubit = _MockCharacterThemeCubit();
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
characterThemeCubit, characterThemeCubit,
@ -47,7 +56,7 @@ void main() {
testWidgets( testWidgets(
'renders the loading indicator while the assets load', 'renders the loading indicator while the assets load',
(tester) async { (tester) async {
final assetsManagerCubit = MockAssetsManagerCubit(); final assetsManagerCubit = _MockAssetsManagerCubit();
final initialAssetsState = AssetsManagerState( final initialAssetsState = AssetsManagerState(
loadables: [Future<void>.value()], loadables: [Future<void>.value()],
loaded: const [], loaded: const [],
@ -79,8 +88,8 @@ void main() {
testWidgets( testWidgets(
'renders PinballGameLoadedView after resources have been loaded', 'renders PinballGameLoadedView after resources have been loaded',
(tester) async { (tester) async {
final assetsManagerCubit = MockAssetsManagerCubit(); final assetsManagerCubit = _MockAssetsManagerCubit();
final startGameBloc = MockStartGameBloc(); final startGameBloc = _MockStartGameBloc();
final loadedAssetsState = AssetsManagerState( final loadedAssetsState = AssetsManagerState(
loadables: [Future<void>.value()], loadables: [Future<void>.value()],
@ -168,8 +177,8 @@ void main() {
}); });
group('PinballGameView', () { group('PinballGameView', () {
final gameBloc = MockGameBloc(); final gameBloc = _MockGameBloc();
final startGameBloc = MockStartGameBloc(); final startGameBloc = _MockStartGameBloc();
setUp(() async { setUp(() async {
await Future.wait<void>(game.preLoadAssets()); await Future.wait<void>(game.preLoadAssets());

@ -1,7 +1,6 @@
// ignore_for_file: invalid_use_of_protected_member // ignore_for_file: invalid_use_of_protected_member
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flame/assets.dart'; import 'package:flame/assets.dart';
import 'package:flame/flame.dart'; import 'package:flame/flame.dart';
@ -14,11 +13,9 @@ import 'package:pinball_flame/pinball_flame.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class MockImages extends Mock implements Images {} class _MockImages extends Mock implements Images {}
class MockImage extends Mock implements ui.Image {} class _MockCallback extends Mock {
class MockCallback extends Mock {
void call(); void call();
} }
@ -30,7 +27,7 @@ void main() {
// TODO(arturplaczek): need to find for a better solution for loading image // TODO(arturplaczek): need to find for a better solution for loading image
// or use original images from BonusAnimation.loadAssets() // or use original images from BonusAnimation.loadAssets()
final image = await decodeImageFromList(Uint8List.fromList(fakeImage)); final image = await decodeImageFromList(Uint8List.fromList(fakeImage));
final images = MockImages(); final images = _MockImages();
when(() => images.fromCache(any())).thenReturn(image); when(() => images.fromCache(any())).thenReturn(image);
when(() => images.load(any())).thenAnswer((_) => Future.value(image)); when(() => images.load(any())).thenAnswer((_) => Future.value(image));
Flame.images = images; Flame.images = images;
@ -88,7 +85,7 @@ void main() {
// https://github.com/flame-engine/flame/issues/1543 // https://github.com/flame-engine/flame/issues/1543
testWidgets('called onCompleted callback at the end of animation ', testWidgets('called onCompleted callback at the end of animation ',
(tester) async { (tester) async {
final callback = MockCallback(); final callback = _MockCallback();
await tester.runAsync(() async { await tester.runAsync(() async {
await tester.pumpWidget( await tester.pumpWidget(
@ -112,7 +109,7 @@ void main() {
}); });
testWidgets('called onCompleted once when animation changed', (tester) async { testWidgets('called onCompleted once when animation changed', (tester) async {
final callback = MockCallback(); final callback = _MockCallback();
final secondAnimation = BonusAnimation.sparkyTurboCharge( final secondAnimation = BonusAnimation.sparkyTurboCharge(
onCompleted: callback.call, onCompleted: callback.call,
); );

@ -2,7 +2,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flame/assets.dart'; import 'package:flame/assets.dart';
@ -19,9 +18,9 @@ import 'package:pinball_ui/pinball_ui.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class MockImages extends Mock implements Images {} class _MockImages extends Mock implements Images {}
class MockImage extends Mock implements ui.Image {} class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
group('GameHud', () { group('GameHud', () {
@ -35,12 +34,12 @@ void main() {
); );
setUp(() async { setUp(() async {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
// TODO(arturplaczek): need to find for a better solution for loading // TODO(arturplaczek): need to find for a better solution for loading
// image or use original images from BonusAnimation.loadAssets() // image or use original images from BonusAnimation.loadAssets()
final image = await decodeImageFromList(Uint8List.fromList(fakeImage)); final image = await decodeImageFromList(Uint8List.fromList(fakeImage));
final images = MockImages(); final images = _MockImages();
when(() => images.fromCache(any())).thenReturn(image); when(() => images.fromCache(any())).thenReturn(image);
when(() => images.load(any())).thenAnswer((_) => Future.value(image)); when(() => images.load(any())).thenAnswer((_) => Future.value(image));
Flame.images = images; Flame.images = images;

@ -8,6 +8,12 @@ import 'package:pinball_theme/pinball_theme.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockPinballGame extends Mock implements PinballGame {}
class _MockGameFlowController extends Mock implements GameFlowController {}
class _MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {}
void main() { void main() {
group('PlayButtonOverlay', () { group('PlayButtonOverlay', () {
late PinballGame game; late PinballGame game;
@ -20,9 +26,9 @@ void main() {
await Flame.images.load(const AndroidTheme().animation.keyName); await Flame.images.load(const AndroidTheme().animation.keyName);
await Flame.images.load(const DinoTheme().animation.keyName); await Flame.images.load(const DinoTheme().animation.keyName);
await Flame.images.load(const SparkyTheme().animation.keyName); await Flame.images.load(const SparkyTheme().animation.keyName);
game = MockPinballGame(); game = _MockPinballGame();
gameFlowController = MockGameFlowController(); gameFlowController = _MockGameFlowController();
characterThemeCubit = MockCharacterThemeCubit(); characterThemeCubit = _MockCharacterThemeCubit();
whenListen( whenListen(
characterThemeCubit, characterThemeCubit,
const Stream<CharacterThemeState>.empty(), const Stream<CharacterThemeState>.empty(),

@ -1,11 +1,14 @@
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_ui/pinball_ui.dart'; import 'package:pinball_ui/pinball_ui.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
group('RoundCountDisplay renders', () { group('RoundCountDisplay renders', () {
late GameBloc gameBloc; late GameBloc gameBloc;
@ -17,7 +20,7 @@ void main() {
); );
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
whenListen( whenListen(
gameBloc, gameBloc,

@ -3,12 +3,15 @@ import 'dart:async';
import 'package:bloc_test/bloc_test.dart'; import 'package:bloc_test/bloc_test.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/l10n/l10n.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';
class _MockGameBloc extends Mock implements GameBloc {}
void main() { void main() {
late GameBloc gameBloc; late GameBloc gameBloc;
late StreamController<GameState> stateController; late StreamController<GameState> stateController;
@ -21,7 +24,7 @@ void main() {
); );
setUp(() { setUp(() {
gameBloc = MockGameBloc(); gameBloc = _MockGameBloc();
stateController = StreamController<GameState>()..add(initialState); stateController = StreamController<GameState>()..add(initialState);
whenListen( whenListen(

@ -8,7 +8,6 @@ export 'builders.dart';
export 'fakes.dart'; export 'fakes.dart';
export 'forge2d.dart'; export 'forge2d.dart';
export 'key_testers.dart'; export 'key_testers.dart';
export 'mocks.dart';
export 'pump_app.dart'; export 'pump_app.dart';
export 'test_games.dart'; export 'test_games.dart';
export 'text_span.dart'; export 'text_span.dart';

@ -1,8 +1,21 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'helpers.dart'; class _MockRawKeyDownEvent extends Mock implements RawKeyDownEvent {
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return super.toString();
}
}
class _MockRawKeyUpEvent extends Mock implements RawKeyUpEvent {
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return super.toString();
}
}
@isTest @isTest
void testRawKeyUpEvents( void testRawKeyUpEvents(
@ -15,7 +28,7 @@ void testRawKeyUpEvents(
} }
RawKeyUpEvent _mockKeyUpEvent(LogicalKeyboardKey key) { RawKeyUpEvent _mockKeyUpEvent(LogicalKeyboardKey key) {
final event = MockRawKeyUpEvent(); final event = _MockRawKeyUpEvent();
when(() => event.logicalKey).thenReturn(key); when(() => event.logicalKey).thenReturn(key);
return event; return event;
} }
@ -31,7 +44,7 @@ void testRawKeyDownEvents(
} }
RawKeyDownEvent _mockKeyDownEvent(LogicalKeyboardKey key) { RawKeyDownEvent _mockKeyDownEvent(LogicalKeyboardKey key) {
final event = MockRawKeyDownEvent(); final event = _MockRawKeyDownEvent();
when(() => event.logicalKey).thenReturn(key); when(() => event.logicalKey).thenReturn(key);
return event; return event;
} }

@ -1,104 +0,0 @@
import 'package:authentication_repository/authentication_repository.dart';
import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame/input.dart';
import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball/select_character/select_character.dart';
import 'package:pinball/start_game/start_game.dart';
import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_components/pinball_components.dart';
import 'package:pinball_ui/pinball_ui.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
class MockPinballGame extends Mock implements PinballGame {}
class MockDrain extends Mock implements Drain {}
class MockBody extends Mock implements Body {}
class MockBall extends Mock implements Ball {}
class MockControlledBall extends Mock implements ControlledBall {}
class MockBallController extends Mock implements BallController {}
class MockContact extends Mock implements Contact {}
class MockGameBloc extends Mock implements GameBloc {}
class MockStartGameBloc extends Mock implements StartGameBloc {}
class MockGameState extends Mock implements GameState {}
class MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {}
class MockAuthenticationRepository extends Mock
implements AuthenticationRepository {}
class MockLeaderboardRepository extends Mock implements LeaderboardRepository {}
class MockRawKeyDownEvent extends Mock implements RawKeyDownEvent {
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return super.toString();
}
}
class MockRawKeyUpEvent extends Mock implements RawKeyUpEvent {
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return super.toString();
}
}
class MockTapDownInfo extends Mock implements TapDownInfo {}
class MockTapDownDetails extends Mock implements TapDownDetails {}
class MockTapUpInfo extends Mock implements TapUpInfo {}
class MockTapUpDetails extends Mock implements TapUpDetails {}
class MockEventPosition extends Mock implements EventPosition {}
class MockFilter extends Mock implements Filter {}
class MockFixture extends Mock implements Fixture {}
class MockComponent extends Mock implements Component {}
class MockComponentSet extends Mock implements ComponentSet {}
class MockDashNestBumper extends Mock implements DashNestBumper {}
class MockPinballAudio extends Mock implements PinballAudio {}
class MockSparkyComputerSensor extends Mock implements SparkyComputerSensor {}
class MockAssetsManagerCubit extends Mock implements AssetsManagerCubit {}
class MockBackboard extends Mock implements Backboard {}
class MockCameraController extends Mock implements CameraController {}
class MockActiveOverlaysNotifier extends Mock
implements ActiveOverlaysNotifier {}
class MockGameFlowController extends Mock implements GameFlowController {}
class MockAndroidBumper extends Mock implements AndroidBumper {}
class MockSparkyBumper extends Mock implements SparkyBumper {}
class MockMultiballCubit extends Mock implements MultiballCubit {}
class MockMultiplierCubit extends Mock implements MultiplierCubit {}
class MockUrlLauncher extends Mock
with MockPlatformInterfaceMixin
implements UrlLauncherPlatform {}

@ -19,26 +19,31 @@ import 'package:pinball/start_game/start_game.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_ui/pinball_ui.dart'; import 'package:pinball_ui/pinball_ui.dart';
import 'helpers.dart'; class _MockAssetsManagerCubit extends Mock implements AssetsManagerCubit {}
PinballAudio _buildDefaultPinballAudio() { class _MockLeaderboardRepository extends Mock implements LeaderboardRepository {
final audio = MockPinballAudio(); }
when(audio.load).thenAnswer((_) => Future.value()); class _MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {}
class _MockGameBloc extends Mock implements GameBloc {}
class _MockStartGameBloc extends Mock implements StartGameBloc {}
class _MockPinballAudio extends Mock implements PinballAudio {}
PinballAudio _buildDefaultPinballAudio() {
final audio = _MockPinballAudio();
when(audio.load).thenAnswer((_) => Future.value());
return audio; return audio;
} }
MockAssetsManagerCubit _buildDefaultAssetsManagerCubit() { AssetsManagerCubit _buildDefaultAssetsManagerCubit() {
final cubit = MockAssetsManagerCubit(); final cubit = _MockAssetsManagerCubit();
final state = AssetsManagerState( final state = AssetsManagerState(
loadables: [Future<void>.value()], loadables: [Future<void>.value()],
loaded: [ loaded: [Future<void>.value()],
Future<void>.value(),
],
); );
whenListen( whenListen(
cubit, cubit,
Stream.value(state), Stream.value(state),
@ -63,7 +68,7 @@ extension PumpApp on WidgetTester {
MultiRepositoryProvider( MultiRepositoryProvider(
providers: [ providers: [
RepositoryProvider.value( RepositoryProvider.value(
value: leaderboardRepository ?? MockLeaderboardRepository(), value: leaderboardRepository ?? _MockLeaderboardRepository(),
), ),
RepositoryProvider.value( RepositoryProvider.value(
value: pinballAudio ?? _buildDefaultPinballAudio(), value: pinballAudio ?? _buildDefaultPinballAudio(),
@ -72,13 +77,13 @@ extension PumpApp on WidgetTester {
child: MultiBlocProvider( child: MultiBlocProvider(
providers: [ providers: [
BlocProvider.value( BlocProvider.value(
value: characterThemeCubit ?? MockCharacterThemeCubit(), value: characterThemeCubit ?? _MockCharacterThemeCubit(),
), ),
BlocProvider.value( BlocProvider.value(
value: gameBloc ?? MockGameBloc(), value: gameBloc ?? _MockGameBloc(),
), ),
BlocProvider.value( BlocProvider.value(
value: startGameBloc ?? MockStartGameBloc(), value: startGameBloc ?? _MockStartGameBloc(),
), ),
BlocProvider.value( BlocProvider.value(
value: assetsManagerCubit ?? _buildDefaultAssetsManagerCubit(), value: assetsManagerCubit ?? _buildDefaultAssetsManagerCubit(),

@ -4,11 +4,12 @@ import 'dart:async';
import 'package:flame_bloc/flame_bloc.dart'; import 'package:flame_bloc/flame_bloc.dart';
import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_forge2d/flame_forge2d.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
import 'helpers.dart'; class _MockPinballAudio extends Mock implements PinballAudio {}
class TestGame extends Forge2DGame with FlameBloc { class TestGame extends Forge2DGame with FlameBloc {
TestGame() { TestGame() {
@ -23,7 +24,7 @@ class PinballTestGame extends PinballGame {
CharacterTheme? theme, CharacterTheme? theme,
}) : _assets = assets, }) : _assets = assets,
super( super(
audio: audio ?? MockPinballAudio(), audio: audio ?? _MockPinballAudio(),
characterTheme: theme ?? const DashTheme(), characterTheme: theme ?? const DashTheme(),
); );
final List<String>? _assets; final List<String>? _assets;
@ -44,7 +45,7 @@ class DebugPinballTestGame extends DebugPinballGame {
CharacterTheme? theme, CharacterTheme? theme,
}) : _assets = assets, }) : _assets = assets,
super( super(
audio: audio ?? MockPinballAudio(), audio: audio ?? _MockPinballAudio(),
characterTheme: theme ?? const DashTheme(), characterTheme: theme ?? const DashTheme(),
); );

@ -7,7 +7,7 @@ import 'package:platform_helper/platform_helper.dart';
import '../helpers/helpers.dart'; import '../helpers/helpers.dart';
class MockPlatformHelper extends Mock implements PlatformHelper {} class _MockPlatformHelper extends Mock implements PlatformHelper {}
void main() { void main() {
group('HowToPlayDialog', () { group('HowToPlayDialog', () {
@ -16,7 +16,7 @@ void main() {
setUp(() async { setUp(() async {
l10n = await AppLocalizations.delegate.load(const Locale('en')); l10n = await AppLocalizations.delegate.load(const Locale('en'));
platformHelper = MockPlatformHelper(); platformHelper = _MockPlatformHelper();
}); });
testWidgets( testWidgets(

@ -10,6 +10,8 @@ import 'package:pinball_ui/pinball_ui.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
class _MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {}
void main() { void main() {
TestWidgetsFlutterBinding.ensureInitialized(); TestWidgetsFlutterBinding.ensureInitialized();
late CharacterThemeCubit characterThemeCubit; late CharacterThemeCubit characterThemeCubit;
@ -20,7 +22,7 @@ void main() {
await Flame.images.load(const AndroidTheme().animation.keyName); await Flame.images.load(const AndroidTheme().animation.keyName);
await Flame.images.load(const DinoTheme().animation.keyName); await Flame.images.load(const DinoTheme().animation.keyName);
await Flame.images.load(const SparkyTheme().animation.keyName); await Flame.images.load(const SparkyTheme().animation.keyName);
characterThemeCubit = MockCharacterThemeCubit(); characterThemeCubit = _MockCharacterThemeCubit();
whenListen( whenListen(
characterThemeCubit, characterThemeCubit,
const Stream<CharacterThemeState>.empty(), const Stream<CharacterThemeState>.empty(),

@ -4,18 +4,20 @@ import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball/start_game/bloc/start_game_bloc.dart'; import 'package:pinball/start_game/bloc/start_game_bloc.dart';
import '../../helpers/helpers.dart'; class _MockPinballGame extends Mock implements PinballGame {}
class _MockGameFlowController extends Mock implements GameFlowController {}
void main() { void main() {
late PinballGame pinballGame; late PinballGame pinballGame;
setUp(() { setUp(() {
pinballGame = MockPinballGame(); pinballGame = _MockPinballGame();
when( when(
() => pinballGame.gameFlowController, () => pinballGame.gameFlowController,
).thenReturn( ).thenReturn(
MockGameFlowController(), _MockGameFlowController(),
); );
}); });

Loading…
Cancel
Save