chore: rename ThemeCubit to CharacterThemeCubit (#233)

pull/239/head
arturplaczek 3 years ago committed by GitHub
parent 377df64747
commit bd9d219f0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -13,7 +13,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:leaderboard_repository/leaderboard_repository.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/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
class App extends StatelessWidget { class App extends StatelessWidget {
@ -36,7 +36,7 @@ class App extends StatelessWidget {
RepositoryProvider.value(value: _pinballAudio), RepositoryProvider.value(value: _pinballAudio),
], ],
child: BlocProvider( child: BlocProvider(
create: (context) => ThemeCubit(), create: (context) => CharacterThemeCubit(),
child: const MaterialApp( child: const MaterialApp(
title: 'I/O Pinball', title: 'I/O Pinball',
localizationsDelegates: [ localizationsDelegates: [

@ -15,8 +15,8 @@ class ControlledBall extends Ball with Controls<BallController> {
/// When a launched [Ball] is lost, it will decrease the [GameState.balls] /// When a launched [Ball] is lost, it will decrease the [GameState.balls]
/// count, and a new [Ball] is spawned. /// count, and a new [Ball] is spawned.
ControlledBall.launch({ ControlledBall.launch({
required PinballTheme theme, required CharacterTheme characterTheme,
}) : super(baseColor: theme.characterTheme.ballColor) { }) : super(baseColor: characterTheme.ballColor) {
controller = BallController(this); controller = BallController(this);
priority = RenderPriority.ballOnLaunchRamp; priority = RenderPriority.ballOnLaunchRamp;
layer = Layer.launcher; layer = Layer.launcher;
@ -28,8 +28,8 @@ class ControlledBall extends Ball with Controls<BallController> {
/// When a bonus [Ball] is lost, the [GameState.balls] doesn't change. /// When a bonus [Ball] is lost, the [GameState.balls] doesn't change.
/// {@endtemplate} /// {@endtemplate}
ControlledBall.bonus({ ControlledBall.bonus({
required PinballTheme theme, required CharacterTheme characterTheme,
}) : super(baseColor: theme.characterTheme.ballColor) { }) : super(baseColor: characterTheme.ballColor) {
controller = BallController(this); controller = BallController(this);
priority = RenderPriority.ballOnBoard; priority = RenderPriority.ballOnBoard;
} }

@ -71,7 +71,7 @@ class _FlutterForestController extends ComponentController<FlutterForest>
Future<void> _addBonusBall() async { Future<void> _addBonusBall() async {
await gameRef.add( await gameRef.add(
ControlledBall.bonus(theme: gameRef.theme) ControlledBall.bonus(characterTheme: gameRef.characterTheme)
..initialPosition = Vector2(17.2, -52.7), ..initialPosition = Vector2(17.2, -52.7),
); );
} }

@ -32,8 +32,7 @@ class GameFlowController extends ComponentController<PinballGame>
// next page // next page
component.firstChild<Backboard>()?.gameOverMode( component.firstChild<Backboard>()?.gameOverMode(
score: state?.score ?? 0, score: state?.score ?? 0,
characterIconPath: characterIconPath: component.characterTheme.leaderboardIcon.keyName,
component.theme.characterTheme.leaderboardIcon.keyName,
); );
component.firstChild<CameraController>()?.focusOnBackboard(); component.firstChild<CameraController>()?.focusOnBackboard();
} }

@ -20,7 +20,7 @@ class PinballGame extends Forge2DGame
HasKeyboardHandlerComponents, HasKeyboardHandlerComponents,
Controls<_GameBallsController> { Controls<_GameBallsController> {
PinballGame({ PinballGame({
required this.theme, required this.characterTheme,
required this.audio, required this.audio,
}) { }) {
images.prefix = ''; images.prefix = '';
@ -33,7 +33,7 @@ class PinballGame extends Forge2DGame
@override @override
Color backgroundColor() => Colors.transparent; Color backgroundColor() => Colors.transparent;
final PinballTheme theme; final CharacterTheme characterTheme;
final PinballAudio audio; final PinballAudio audio;
@ -119,7 +119,7 @@ class _GameBallsController extends ComponentController<PinballGame>
void _spawnBall() { void _spawnBall() {
final ball = ControlledBall.launch( final ball = ControlledBall.launch(
theme: gameRef.theme, characterTheme: gameRef.characterTheme,
)..initialPosition = Vector2( )..initialPosition = Vector2(
_plunger.body.position.x, _plunger.body.position.x,
_plunger.body.position.y - Ball.size.y, _plunger.body.position.y - Ball.size.y,
@ -137,10 +137,10 @@ class _GameBallsController extends ComponentController<PinballGame>
class DebugPinballGame extends PinballGame with FPSCounter, TapDetector { class DebugPinballGame extends PinballGame with FPSCounter, TapDetector {
DebugPinballGame({ DebugPinballGame({
required PinballTheme theme, required CharacterTheme characterTheme,
required PinballAudio audio, required PinballAudio audio,
}) : super( }) : super(
theme: theme, characterTheme: characterTheme,
audio: audio, audio: audio,
) { ) {
controller = _DebugGameBallsController(this); controller = _DebugGameBallsController(this);

@ -5,8 +5,8 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:pinball/game/game.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/start_game/start_game.dart';
import 'package:pinball/theme/theme.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
class PinballGamePage extends StatelessWidget { class PinballGamePage extends StatelessWidget {
@ -31,13 +31,14 @@ class PinballGamePage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = context.read<ThemeCubit>().state.theme; final characterTheme =
context.read<CharacterThemeCubit>().state.characterTheme;
final audio = context.read<PinballAudio>(); final audio = context.read<PinballAudio>();
final pinballAudio = context.read<PinballAudio>(); final pinballAudio = context.read<PinballAudio>();
final game = isDebugMode final game = isDebugMode
? DebugPinballGame(theme: theme, audio: audio) ? DebugPinballGame(characterTheme: characterTheme, audio: audio)
: PinballGame(theme: theme, audio: audio); : PinballGame(characterTheme: characterTheme, audio: audio);
final loadables = [ final loadables = [
...game.preLoadAssets(), ...game.preLoadAssets(),

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pinball/game/pinball_game.dart'; import 'package:pinball/game/pinball_game.dart';
import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/l10n/l10n.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
/// {@template play_button_overlay} /// {@template play_button_overlay}
/// [Widget] that renders the button responsible to starting the game /// [Widget] that renders the button responsible to starting the game

@ -5,7 +5,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/l10n/l10n.dart';
import 'package:pinball/leaderboard/leaderboard.dart'; import 'package:pinball/leaderboard/leaderboard.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
class LeaderboardPage extends StatelessWidget { class LeaderboardPage extends StatelessWidget {

@ -5,12 +5,12 @@ import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
part 'theme_state.dart'; part 'character_theme_state.dart';
class ThemeCubit extends Cubit<ThemeState> { class CharacterThemeCubit extends Cubit<CharacterThemeState> {
ThemeCubit() : super(const ThemeState.initial()); CharacterThemeCubit() : super(const CharacterThemeState.initial());
void characterSelected(CharacterTheme characterTheme) { void characterSelected(CharacterTheme characterTheme) {
emit(ThemeState(PinballTheme(characterTheme: characterTheme))); emit(CharacterThemeState(characterTheme));
} }
} }

@ -0,0 +1,15 @@
// ignore_for_file: public_member_api_docs
// TODO(allisonryan0002): Document this section when the API is stable.
part of 'character_theme_cubit.dart';
class CharacterThemeState extends Equatable {
const CharacterThemeState(this.characterTheme);
const CharacterThemeState.initial() : characterTheme = const DashTheme();
final CharacterTheme characterTheme;
@override
List<Object> get props => [characterTheme];
}

@ -0,0 +1,2 @@
export 'cubit/character_theme_cubit.dart';
export 'view/view.dart';

@ -3,8 +3,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/l10n/l10n.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 'package:pinball/theme/theme.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
class CharacterSelectionDialog extends StatelessWidget { class CharacterSelectionDialog extends StatelessWidget {
@ -19,7 +19,7 @@ class CharacterSelectionDialog extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocProvider( return BlocProvider(
create: (_) => ThemeCubit(), create: (_) => CharacterThemeCubit(),
child: const CharacterSelectionView(), child: const CharacterSelectionView(),
); );
} }
@ -109,12 +109,14 @@ class CharacterImageButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final currentCharacterTheme = context.select<ThemeCubit, CharacterTheme>( final currentCharacterTheme =
(cubit) => cubit.state.theme.characterTheme, context.select<CharacterThemeCubit, CharacterTheme>(
(cubit) => cubit.state.characterTheme,
); );
return GestureDetector( return GestureDetector(
onTap: () => context.read<ThemeCubit>().characterSelected(characterTheme), onTap: () =>
context.read<CharacterThemeCubit>().characterSelected(characterTheme),
child: DecoratedBox( child: DecoratedBox(
decoration: BoxDecoration( decoration: BoxDecoration(
color: (currentCharacterTheme == characterTheme) color: (currentCharacterTheme == characterTheme)

@ -1,16 +0,0 @@
// ignore_for_file: public_member_api_docs
// TODO(allisonryan0002): Document this section when the API is stable.
part of 'theme_cubit.dart';
class ThemeState extends Equatable {
const ThemeState(this.theme);
const ThemeState.initial()
: theme = const PinballTheme(characterTheme: DashTheme());
final PinballTheme theme;
@override
List<Object> get props => [theme];
}

@ -1,4 +1,2 @@
export 'app_colors.dart'; export 'app_colors.dart';
export 'app_text_style.dart'; export 'app_text_style.dart';
export 'cubit/theme_cubit.dart';
export 'view/view.dart';

@ -1,5 +1,4 @@
library pinball_theme; library pinball_theme;
export 'src/generated/generated.dart'; export 'src/generated/generated.dart';
export 'src/pinball_theme.dart';
export 'src/themes/themes.dart'; export 'src/themes/themes.dart';

@ -1,23 +0,0 @@
import 'package:equatable/equatable.dart';
import 'package:pinball_theme/pinball_theme.dart';
/// {@template pinball_theme}
/// Defines all theme assets and attributes.
///
/// Game components should have a getter specified here to load their
/// corresponding assets for the game.
/// {@endtemplate}
class PinballTheme extends Equatable {
/// {@macro pinball_theme}
const PinballTheme({
required CharacterTheme characterTheme,
}) : _characterTheme = characterTheme;
final CharacterTheme _characterTheme;
/// [CharacterTheme] for the chosen character.
CharacterTheme get characterTheme => _characterTheme;
@override
List<Object?> get props => [_characterTheme];
}

@ -1,28 +0,0 @@
// ignore_for_file: prefer_const_constructors
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball_theme/pinball_theme.dart';
void main() {
group('PinballTheme', () {
const characterTheme = SparkyTheme();
test('can be instantiated', () {
expect(PinballTheme(characterTheme: characterTheme), isNotNull);
});
test('supports value equality', () {
expect(
PinballTheme(characterTheme: characterTheme),
equals(PinballTheme(characterTheme: characterTheme)),
);
});
test('characterTheme is correct', () {
expect(
PinballTheme(characterTheme: characterTheme).characterTheme,
equals(characterTheme),
);
});
});
}

@ -57,8 +57,7 @@ void main() {
when(game.firstChild<Backboard>).thenReturn(backboard); when(game.firstChild<Backboard>).thenReturn(backboard);
when(game.firstChild<CameraController>).thenReturn(cameraController); when(game.firstChild<CameraController>).thenReturn(cameraController);
when(() => game.overlays).thenReturn(overlays); when(() => game.overlays).thenReturn(overlays);
when(() => game.theme) when(() => game.characterTheme).thenReturn(DashTheme());
.thenReturn(PinballTheme(characterTheme: DashTheme()));
}); });
test( test(

@ -117,7 +117,9 @@ void main() {
flameBlocTester.testGameWidget( flameBlocTester.testGameWidget(
'when ball is launch', 'when ball is launch',
setUp: (game, tester) async { setUp: (game, tester) async {
final ball = ControlledBall.launch(theme: game.theme); final ball = ControlledBall.launch(
characterTheme: game.characterTheme,
);
final wall = BottomWall(); final wall = BottomWall();
await game.ensureAddAll([ball, wall]); await game.ensureAddAll([ball, wall]);
game.addContactCallback(BottomWallBallContactCallback()); game.addContactCallback(BottomWallBallContactCallback());
@ -132,7 +134,9 @@ void main() {
flameBlocTester.testGameWidget( flameBlocTester.testGameWidget(
'when ball is bonus', 'when ball is bonus',
setUp: (game, tester) async { setUp: (game, tester) async {
final ball = ControlledBall.bonus(theme: game.theme); final ball = ControlledBall.bonus(
characterTheme: game.characterTheme,
);
final wall = BottomWall(); final wall = BottomWall();
await game.ensureAddAll([ball, wall]); await game.ensureAddAll([ball, wall]);
game.addContactCallback(BottomWallBallContactCallback()); game.addContactCallback(BottomWallBallContactCallback());

@ -5,7 +5,7 @@ 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:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
@ -13,18 +13,18 @@ void main() {
final game = PinballTestGame(); final game = PinballTestGame();
group('PinballGamePage', () { group('PinballGamePage', () {
late ThemeCubit themeCubit; late CharacterThemeCubit characterThemeCubit;
late GameBloc gameBloc; late GameBloc gameBloc;
setUp(() async { setUp(() async {
await Future.wait<void>(game.preLoadAssets()); await Future.wait<void>(game.preLoadAssets());
themeCubit = MockThemeCubit(); characterThemeCubit = MockCharacterThemeCubit();
gameBloc = MockGameBloc(); gameBloc = MockGameBloc();
whenListen( whenListen(
themeCubit, characterThemeCubit,
const Stream<ThemeState>.empty(), const Stream<CharacterThemeState>.empty(),
initialState: const ThemeState.initial(), initialState: const CharacterThemeState.initial(),
); );
whenListen( whenListen(
@ -37,7 +37,7 @@ void main() {
testWidgets('renders PinballGameView', (tester) async { testWidgets('renders PinballGameView', (tester) async {
await tester.pumpApp( await tester.pumpApp(
PinballGamePage(), PinballGamePage(),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
expect(find.byType(PinballGameView), findsOneWidget); expect(find.byType(PinballGameView), findsOneWidget);
@ -62,7 +62,7 @@ void main() {
game: game, game: game,
), ),
assetsManagerCubit: assetsManagerCubit, assetsManagerCubit: assetsManagerCubit,
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
expect( expect(
@ -95,7 +95,7 @@ void main() {
game: game, game: game,
), ),
assetsManagerCubit: assetsManagerCubit, assetsManagerCubit: assetsManagerCubit,
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
gameBloc: gameBloc, gameBloc: gameBloc,
); );
@ -126,7 +126,7 @@ void main() {
}, },
), ),
), ),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
await tester.tap(find.text('Tap me')); await tester.tap(find.text('Tap me'));

@ -1,7 +1,7 @@
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/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
import '../../../helpers/helpers.dart'; import '../../../helpers/helpers.dart';

@ -8,7 +8,7 @@ import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.dart'; import 'package:pinball/game/game.dart';
import 'package:pinball/leaderboard/leaderboard.dart'; import 'package:pinball/leaderboard/leaderboard.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_components/pinball_components.dart';
@ -35,7 +35,7 @@ class MockGameBloc extends Mock implements GameBloc {}
class MockGameState extends Mock implements GameState {} class MockGameState extends Mock implements GameState {}
class MockThemeCubit extends Mock implements ThemeCubit {} class MockCharacterThemeCubit extends Mock implements CharacterThemeCubit {}
class MockLeaderboardBloc extends Mock implements LeaderboardBloc {} class MockLeaderboardBloc extends Mock implements LeaderboardBloc {}

@ -14,7 +14,7 @@ import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:mockingjay/mockingjay.dart'; import 'package:mockingjay/mockingjay.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/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_audio/pinball_audio.dart';
import 'helpers.dart'; import 'helpers.dart';
@ -52,7 +52,7 @@ extension PumpApp on WidgetTester {
MockNavigator? navigator, MockNavigator? navigator,
GameBloc? gameBloc, GameBloc? gameBloc,
AssetsManagerCubit? assetsManagerCubit, AssetsManagerCubit? assetsManagerCubit,
ThemeCubit? themeCubit, CharacterThemeCubit? characterThemeCubit,
LeaderboardRepository? leaderboardRepository, LeaderboardRepository? leaderboardRepository,
PinballAudio? pinballAudio, PinballAudio? pinballAudio,
}) { }) {
@ -70,7 +70,7 @@ extension PumpApp on WidgetTester {
child: MultiBlocProvider( child: MultiBlocProvider(
providers: [ providers: [
BlocProvider.value( BlocProvider.value(
value: themeCubit ?? MockThemeCubit(), value: characterThemeCubit ?? MockCharacterThemeCubit(),
), ),
BlocProvider.value( BlocProvider.value(
value: gameBloc ?? MockGameBloc(), value: gameBloc ?? MockGameBloc(),

@ -20,9 +20,7 @@ class PinballTestGame extends PinballGame {
: _assets = assets, : _assets = assets,
super( super(
audio: MockPinballAudio(), audio: MockPinballAudio(),
theme: const PinballTheme( characterTheme: const DashTheme(),
characterTheme: DashTheme(),
),
); );
final List<String>? _assets; final List<String>? _assets;
@ -40,9 +38,7 @@ class DebugPinballTestGame extends DebugPinballGame {
: _assets = assets, : _assets = assets,
super( super(
audio: MockPinballAudio(), audio: MockPinballAudio(),
theme: const PinballTheme( characterTheme: const DashTheme(),
characterTheme: DashTheme(),
),
); );
final List<String>? _assets; final List<String>? _assets;

@ -0,0 +1,25 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/select_character/select_character.dart';
import 'package:pinball_theme/pinball_theme.dart';
void main() {
group('CharacterThemeCubit', () {
test('initial state has Dash character theme', () {
final characterThemeCubit = CharacterThemeCubit();
expect(
characterThemeCubit.state.characterTheme,
equals(const DashTheme()),
);
});
blocTest<CharacterThemeCubit, CharacterThemeState>(
'charcterSelected emits selected character theme',
build: CharacterThemeCubit.new,
act: (bloc) => bloc.characterSelected(const SparkyTheme()),
expect: () => [
const CharacterThemeState(SparkyTheme()),
],
);
});
}

@ -1,18 +1,18 @@
// ignore_for_file: prefer_const_constructors // ignore_for_file: prefer_const_constructors
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/theme/theme.dart'; import 'package:pinball/select_character/select_character.dart';
void main() { void main() {
group('ThemeState', () { group('ThemeState', () {
test('can be instantiated', () { test('can be instantiated', () {
expect(const ThemeState.initial(), isNotNull); expect(const CharacterThemeState.initial(), isNotNull);
}); });
test('supports value equality', () { test('supports value equality', () {
expect( expect(
ThemeState.initial(), CharacterThemeState.initial(),
equals(const ThemeState.initial()), equals(const CharacterThemeState.initial()),
); );
}); });
}); });

@ -4,21 +4,21 @@ 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:mockingjay/mockingjay.dart'; import 'package:mockingjay/mockingjay.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 'package:pinball/theme/theme.dart';
import 'package:pinball_theme/pinball_theme.dart'; import 'package:pinball_theme/pinball_theme.dart';
import '../../helpers/helpers.dart'; import '../../helpers/helpers.dart';
void main() { void main() {
late ThemeCubit themeCubit; late CharacterThemeCubit characterThemeCubit;
setUp(() { setUp(() {
themeCubit = MockThemeCubit(); characterThemeCubit = MockCharacterThemeCubit();
whenListen( whenListen(
themeCubit, characterThemeCubit,
const Stream<ThemeState>.empty(), const Stream<CharacterThemeState>.empty(),
initialState: const ThemeState.initial(), initialState: const CharacterThemeState.initial(),
); );
}); });
@ -26,7 +26,7 @@ void main() {
testWidgets('renders CharacterSelectionView', (tester) async { testWidgets('renders CharacterSelectionView', (tester) async {
await tester.pumpApp( await tester.pumpApp(
CharacterSelectionDialog(), CharacterSelectionDialog(),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
expect(find.byType(CharacterSelectionView), findsOneWidget); expect(find.byType(CharacterSelectionView), findsOneWidget);
}); });
@ -46,7 +46,7 @@ void main() {
}, },
), ),
), ),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
await tester.tap(find.text('Tap me')); await tester.tap(find.text('Tap me'));
@ -61,7 +61,7 @@ void main() {
const titleText = 'Choose your character!'; const titleText = 'Choose your character!';
await tester.pumpApp( await tester.pumpApp(
CharacterSelectionView(), CharacterSelectionView(),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
expect(find.text(titleText), findsOneWidget); expect(find.text(titleText), findsOneWidget);
@ -75,19 +75,20 @@ void main() {
await tester.pumpApp( await tester.pumpApp(
CharacterSelectionView(), CharacterSelectionView(),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
await tester.tap(find.byKey(sparkyButtonKey)); await tester.tap(find.byKey(sparkyButtonKey));
verify(() => themeCubit.characterSelected(SparkyTheme())).called(1); verify(() => characterThemeCubit.characterSelected(SparkyTheme()))
.called(1);
}); });
testWidgets('displays how to play dialog when start is tapped', testWidgets('displays how to play dialog when start is tapped',
(tester) async { (tester) async {
await tester.pumpApp( await tester.pumpApp(
CharacterSelectionView(), CharacterSelectionView(),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
await tester.ensureVisible(find.byType(TextButton)); await tester.ensureVisible(find.byType(TextButton));
await tester.tap(find.byType(TextButton)); await tester.tap(find.byType(TextButton));
@ -100,7 +101,7 @@ void main() {
testWidgets('CharacterImageButton renders correctly', (tester) async { testWidgets('CharacterImageButton renders correctly', (tester) async {
await tester.pumpApp( await tester.pumpApp(
CharacterImageButton(DashTheme()), CharacterImageButton(DashTheme()),
themeCubit: themeCubit, characterThemeCubit: characterThemeCubit,
); );
expect(find.byType(Image), findsOneWidget); expect(find.byType(Image), findsOneWidget);

@ -1,22 +0,0 @@
import 'package:bloc_test/bloc_test.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:pinball/theme/theme.dart';
import 'package:pinball_theme/pinball_theme.dart';
void main() {
group('ThemeCubit', () {
test('initial state has Dash character theme', () {
final themeCubit = ThemeCubit();
expect(themeCubit.state.theme.characterTheme, equals(const DashTheme()));
});
blocTest<ThemeCubit, ThemeState>(
'charcterSelected emits selected character theme',
build: ThemeCubit.new,
act: (bloc) => bloc.characterSelected(const SparkyTheme()),
expect: () => [
const ThemeState(PinballTheme(characterTheme: SparkyTheme())),
],
);
});
}
Loading…
Cancel
Save