test: coverage

pull/345/head
alestiago 3 years ago
parent b4b15f1514
commit 094ff34f33

@ -27,7 +27,6 @@ enum GameStatus {
}
extension GameStatusX on GameStatus {
bool get isWaiting => this == GameStatus.waiting;
bool get isPlaying => this == GameStatus.playing;
bool get isGameOver => this == GameStatus.gameOver;
}

@ -24,6 +24,20 @@ void main() {
],
);
blocTest<GameBloc, GameState>(
'GameOver finishes the game',
build: GameBloc.new,
act: (bloc) => bloc.add(const GameOver()),
expect: () => [
isA<GameState>()
..having(
(state) => state.status,
'status',
GameStatus.gameOver,
),
],
);
group('RoundLost', () {
blocTest<GameBloc, GameState>(
'decreases number of rounds '

@ -72,6 +72,32 @@ void main() {
});
});
group('GameStarted', () {
test('can be instantiated', () {
expect(const GameStarted(), isNotNull);
});
test('supports value equality', () {
expect(
GameStarted(),
equals(const GameStarted()),
);
});
});
group('GameOver', () {
test('can be instantiated', () {
expect(const GameOver(), isNotNull);
});
test('supports value equality', () {
expect(
GameOver(),
equals(const GameOver()),
);
});
});
group('SparkyTurboChargeActivated', () {
test('can be instantiated', () {
expect(const SparkyTurboChargeActivated(), isNotNull);

@ -1,123 +0,0 @@
// ignore_for_file: type_annotate_public_apis, prefer_const_constructors
import 'package:flame/game.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_theme/pinball_theme.dart';
class _MockPinballGame extends Mock implements PinballGame {}
class _MockBackbox extends Mock implements Backbox {}
class _MockCameraController extends Mock implements CameraController {}
class _MockActiveOverlaysNotifier extends Mock
implements ActiveOverlaysNotifier {}
class _MockPinballAudio extends Mock implements PinballAudio {}
void main() {
group('GameBlocStatusListener', () {
group('listenWhen', () {
test('is true when the game over state has changed', () {
final state = GameState(
totalScore: 0,
roundScore: 10,
multiplier: 1,
rounds: 0,
bonusHistory: const [],
status: GameStatus.playing,
);
final previous = GameState.initial();
expect(
GameBlocStatusListener().listenWhen(previous, state),
isTrue,
);
});
});
group('onNewState', () {
late PinballGame game;
late Backbox backbox;
late CameraController cameraController;
late GameBlocStatusListener gameFlowController;
late PinballAudio pinballAudio;
late ActiveOverlaysNotifier overlays;
setUp(() {
game = _MockPinballGame();
backbox = _MockBackbox();
cameraController = _MockCameraController();
gameFlowController = GameBlocStatusListener();
overlays = _MockActiveOverlaysNotifier();
pinballAudio = _MockPinballAudio();
when(
() => backbox.initialsInput(
score: any(named: 'score'),
characterIconPath: any(named: 'characterIconPath'),
onSubmit: any(named: 'onSubmit'),
),
).thenAnswer((_) async {});
when(cameraController.focusOnWaitingBackbox).thenAnswer((_) async {});
when(cameraController.focusOnGame).thenAnswer((_) async {});
when(() => overlays.remove(any())).thenAnswer((_) => true);
when(() => game.descendants().whereType<Backbox>())
.thenReturn([backbox]);
when(game.firstChild<CameraController>).thenReturn(cameraController);
when(() => game.overlays).thenReturn(overlays);
when(() => game.characterTheme).thenReturn(DashTheme());
when(() => game.audio).thenReturn(pinballAudio);
});
test(
'changes the backbox display and camera correctly '
'when the game is over',
() {
gameFlowController.onNewState(
GameState(
totalScore: 0,
roundScore: 10,
multiplier: 1,
rounds: 0,
bonusHistory: const [],
status: GameStatus.gameOver,
),
);
verify(
() => backbox.initialsInput(
score: 0,
characterIconPath: any(named: 'characterIconPath'),
onSubmit: any(named: 'onSubmit'),
),
).called(1);
verify(cameraController.focusOnGameOverBackbox).called(1);
},
);
test(
'changes the backbox and camera correctly when it is not a game over',
() {
gameFlowController.onNewState(GameState.initial());
verify(cameraController.focusOnGame).called(1);
verify(() => overlays.remove(PinballGame.playButtonOverlay))
.called(1);
},
);
test(
'plays the background music on start',
() {
gameFlowController.onNewState(GameState.initial());
verify(pinballAudio.backgroundMusic).called(1);
},
);
});
});
}

@ -0,0 +1,138 @@
// ignore_for_file: type_annotate_public_apis, prefer_const_constructors
import 'package:flame/game.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart';
import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_theme/pinball_theme.dart';
class _MockPinballGame extends Mock implements PinballGame {}
class _MockBackbox extends Mock implements Backbox {}
class _MockCameraController extends Mock implements CameraController {}
class _MockActiveOverlaysNotifier extends Mock
implements ActiveOverlaysNotifier {}
class _MockPinballAudio extends Mock implements PinballAudio {}
void main() {
group('GameBlocStatusListener', () {
group('listenWhen', () {
test('is true when the game over state has changed', () {
final state = GameState(
totalScore: 0,
roundScore: 10,
multiplier: 1,
rounds: 0,
bonusHistory: const [],
status: GameStatus.playing,
);
final previous = GameState.initial();
expect(
GameBlocStatusListener().listenWhen(previous, state),
isTrue,
);
});
});
group('onNewState', () {
late PinballGame game;
late Backbox backbox;
late CameraController cameraController;
late GameBlocStatusListener gameBlocStatusListener;
late PinballAudio pinballAudio;
late ActiveOverlaysNotifier overlays;
group('onNewState', () {
late PinballGame game;
late Backbox backbox;
late CameraController cameraController;
late GameBlocStatusListener gameFlowController;
late PinballAudio pinballAudio;
late ActiveOverlaysNotifier overlays;
setUp(() {
game = _MockPinballGame();
backbox = _MockBackbox();
cameraController = _MockCameraController();
gameFlowController = GameBlocStatusListener();
overlays = _MockActiveOverlaysNotifier();
pinballAudio = _MockPinballAudio();
gameFlowController.mockGameRef(game);
when(
() => backbox.initialsInput(
score: any(named: 'score'),
characterIconPath: any(named: 'characterIconPath'),
onSubmit: any(named: 'onSubmit'),
),
).thenAnswer((_) async {});
when(cameraController.focusOnWaitingBackbox).thenAnswer((_) async {});
when(cameraController.focusOnGame).thenAnswer((_) async {});
when(() => overlays.remove(any())).thenAnswer((_) => true);
when(() => game.descendants().whereType<Backbox>())
.thenReturn([backbox]);
when(game.firstChild<CameraController>).thenReturn(cameraController);
when(() => game.overlays).thenReturn(overlays);
when(() => game.characterTheme).thenReturn(DashTheme());
when(() => game.audio).thenReturn(pinballAudio);
});
test(
'changes the backbox display and camera correctly '
'when the game is over',
() {
final state = GameState(
totalScore: 0,
roundScore: 10,
multiplier: 1,
rounds: 0,
bonusHistory: const [],
status: GameStatus.gameOver,
);
gameFlowController.onNewState(state);
verify(
() => backbox.initialsInput(
score: state.displayScore,
characterIconPath: any(named: 'characterIconPath'),
onSubmit: any(named: 'onSubmit'),
),
).called(1);
verify(cameraController.focusOnGameOverBackbox).called(1);
},
);
test(
'changes the backbox and camera correctly when it is not a game over',
() {
gameFlowController.onNewState(
GameState.initial().copyWith(status: GameStatus.playing),
);
verify(cameraController.focusOnGame).called(1);
verify(() => overlays.remove(PinballGame.playButtonOverlay))
.called(1);
},
);
test(
'plays the background music on start',
() {
gameFlowController.onNewState(
GameState.initial().copyWith(status: GameStatus.playing),
);
verify(pinballAudio.backgroundMusic).called(1);
},
);
});
});
});
}

@ -55,9 +55,7 @@ void main() {
final l10n = await AppLocalizations.delegate.load(const Locale('en'));
stateController.add(
initialState.copyWith(
rounds: 0,
),
initialState.copyWith(status: GameStatus.gameOver),
);
await tester.pumpApp(

Loading…
Cancel
Save