chore: rename ThemeCubit to SelectCharacterCubit

pull/233/head
arturplaczek 3 years ago
parent f20662cdaa
commit 4887ebd79f

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

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

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:pinball/game/pinball_game.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}
/// [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:pinball/l10n/l10n.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';
class LeaderboardPage extends StatelessWidget {

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

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

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

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

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

@ -1,7 +1,7 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.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';

@ -8,7 +8,7 @@ import 'package:leaderboard_repository/leaderboard_repository.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pinball/game/game.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_components/pinball_components.dart';
@ -35,7 +35,7 @@ class MockGameBloc extends Mock implements GameBloc {}
class MockGameState extends Mock implements GameState {}
class MockThemeCubit extends Mock implements ThemeCubit {}
class MockSelectCharacterCubit extends Mock implements SelectCharacterCubit {}
class MockLeaderboardBloc extends Mock implements LeaderboardBloc {}

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

@ -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('SelectCharacterCubit', () {
test('initial state has Dash character theme', () {
final selectCharacterCubit = SelectCharacterCubit();
expect(
selectCharacterCubit.state.selectedCharacter.characterTheme,
equals(const DashTheme()),
);
});
blocTest<SelectCharacterCubit, SelectCharacterState>(
'charcterSelected emits selected character theme',
build: SelectCharacterCubit.new,
act: (bloc) => bloc.characterSelected(const SparkyTheme()),
expect: () => [
const SelectCharacterState(PinballTheme(characterTheme: SparkyTheme())),
],
);
});
}

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

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