From ca18de6172c94bc49c242f58f78f8174faacc74a Mon Sep 17 00:00:00 2001 From: Allison Ryan Date: Fri, 4 Mar 2022 12:15:32 -0600 Subject: [PATCH] refactor: one theme for entire game --- lib/theme/cubit/theme_cubit.dart | 6 ++-- lib/theme/cubit/theme_state.dart | 3 ++ .../pinball_theme/lib/src/pinball_theme.dart | 20 +++++++------ .../lib/src/themes/android_theme.dart | 4 +-- .../lib/src/themes/character_theme.dart | 19 +++++++++++++ .../lib/src/themes/dash_theme.dart | 4 +-- .../lib/src/themes/dino_theme.dart | 4 +-- .../lib/src/themes/sparky_theme.dart | 4 +-- .../pinball_theme/lib/src/themes/themes.dart | 1 + .../test/src/pinball_theme_test.dart | 28 +++++++++++++++++++ test/theme/cubit/theme_cubit_test.dart | 10 +++---- test/theme/cubit/theme_state_test.dart | 7 ++--- 12 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 packages/pinball_theme/lib/src/themes/character_theme.dart create mode 100644 packages/pinball_theme/test/src/pinball_theme_test.dart diff --git a/lib/theme/cubit/theme_cubit.dart b/lib/theme/cubit/theme_cubit.dart index 080d5f5e..7ba79e59 100644 --- a/lib/theme/cubit/theme_cubit.dart +++ b/lib/theme/cubit/theme_cubit.dart @@ -5,9 +5,9 @@ import 'package:pinball_theme/pinball_theme.dart'; part 'theme_state.dart'; class ThemeCubit extends Cubit { - ThemeCubit() : super(const ThemeState(DashTheme())); + ThemeCubit() : super(const ThemeState.initial()); - void themeSelected(PinballTheme theme) { - emit(ThemeState(theme)); + void characterSelected(CharacterTheme characterTheme) { + emit(ThemeState(PinballTheme(characterTheme: characterTheme))); } } diff --git a/lib/theme/cubit/theme_state.dart b/lib/theme/cubit/theme_state.dart index 71491960..13b3ea5f 100644 --- a/lib/theme/cubit/theme_state.dart +++ b/lib/theme/cubit/theme_state.dart @@ -3,6 +3,9 @@ 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 diff --git a/packages/pinball_theme/lib/src/pinball_theme.dart b/packages/pinball_theme/lib/src/pinball_theme.dart index f8605708..b4c404e5 100644 --- a/packages/pinball_theme/lib/src/pinball_theme.dart +++ b/packages/pinball_theme/lib/src/pinball_theme.dart @@ -1,18 +1,22 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; +import 'package:pinball_theme/pinball_theme.dart'; /// {@template pinball_theme} -/// Base class for creating pinball themes. +/// Defines all theme assets and attributes. /// -/// Character specific game components should have a getter specified here to -/// load their corresponding assets for the game. +/// Game components should have a getter specified here to load their +/// corresponding assets for the game. /// {@endtemplate} -abstract class PinballTheme extends Equatable { +class PinballTheme extends Equatable { /// {@macro pinball_theme} - const PinballTheme(); + const PinballTheme({ + required CharacterTheme characterTheme, + }) : _characterTheme = characterTheme; - /// Ball color for this theme. - Color get ballColor; + final CharacterTheme _characterTheme; + + /// [CharacterTheme] for the chosen character. + CharacterTheme get characterTheme => _characterTheme; @override List get props => []; diff --git a/packages/pinball_theme/lib/src/themes/android_theme.dart b/packages/pinball_theme/lib/src/themes/android_theme.dart index 3b605411..59c16bd9 100644 --- a/packages/pinball_theme/lib/src/themes/android_theme.dart +++ b/packages/pinball_theme/lib/src/themes/android_theme.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:pinball_theme/pinball_theme.dart'; /// {@template android_theme} -/// Defines Android theme assets and attributes. +/// Defines Android character theme assets and attributes. /// {@endtemplate} -class AndroidTheme extends PinballTheme { +class AndroidTheme extends CharacterTheme { /// {@macro android_theme} const AndroidTheme(); diff --git a/packages/pinball_theme/lib/src/themes/character_theme.dart b/packages/pinball_theme/lib/src/themes/character_theme.dart new file mode 100644 index 00000000..50b6b557 --- /dev/null +++ b/packages/pinball_theme/lib/src/themes/character_theme.dart @@ -0,0 +1,19 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; + +/// {@template character_theme} +/// Base class for creating character themes. +/// +/// Character specific game components should have a getter specified here to +/// load their corresponding assets for the game. +/// {@endtemplate} +abstract class CharacterTheme extends Equatable { + /// {@macro character_theme} + const CharacterTheme(); + + /// Ball color for this theme. + Color get ballColor; + + @override + List get props => []; +} diff --git a/packages/pinball_theme/lib/src/themes/dash_theme.dart b/packages/pinball_theme/lib/src/themes/dash_theme.dart index fd0cdfa1..e4875a11 100644 --- a/packages/pinball_theme/lib/src/themes/dash_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dash_theme.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:pinball_theme/pinball_theme.dart'; /// {@template dash_theme} -/// Defines Dash theme assets and attributes. +/// Defines Dash character theme assets and attributes. /// {@endtemplate} -class DashTheme extends PinballTheme { +class DashTheme extends CharacterTheme { /// {@macro dash_theme} const DashTheme(); diff --git a/packages/pinball_theme/lib/src/themes/dino_theme.dart b/packages/pinball_theme/lib/src/themes/dino_theme.dart index 9337ddde..07776771 100644 --- a/packages/pinball_theme/lib/src/themes/dino_theme.dart +++ b/packages/pinball_theme/lib/src/themes/dino_theme.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:pinball_theme/pinball_theme.dart'; /// {@template dino_theme} -/// Defines Dino theme assets and attributes. +/// Defines Dino character theme assets and attributes. /// {@endtemplate} -class DinoTheme extends PinballTheme { +class DinoTheme extends CharacterTheme { /// {@macro dino_theme} const DinoTheme(); diff --git a/packages/pinball_theme/lib/src/themes/sparky_theme.dart b/packages/pinball_theme/lib/src/themes/sparky_theme.dart index d2cecf47..5264bad6 100644 --- a/packages/pinball_theme/lib/src/themes/sparky_theme.dart +++ b/packages/pinball_theme/lib/src/themes/sparky_theme.dart @@ -2,9 +2,9 @@ import 'package:flutter/material.dart'; import 'package:pinball_theme/pinball_theme.dart'; /// {@template sparky_theme} -/// Defines Sparky theme assets and attributes. +/// Defines Sparky character theme assets and attributes. /// {@endtemplate} -class SparkyTheme extends PinballTheme { +class SparkyTheme extends CharacterTheme { /// {@macro sparky_theme} const SparkyTheme(); diff --git a/packages/pinball_theme/lib/src/themes/themes.dart b/packages/pinball_theme/lib/src/themes/themes.dart index 895e7c8d..d4062a4f 100644 --- a/packages/pinball_theme/lib/src/themes/themes.dart +++ b/packages/pinball_theme/lib/src/themes/themes.dart @@ -1,4 +1,5 @@ export 'android_theme.dart'; +export 'character_theme.dart'; export 'dash_theme.dart'; export 'dino_theme.dart'; export 'sparky_theme.dart'; diff --git a/packages/pinball_theme/test/src/pinball_theme_test.dart b/packages/pinball_theme/test/src/pinball_theme_test.dart new file mode 100644 index 00000000..899eec64 --- /dev/null +++ b/packages/pinball_theme/test/src/pinball_theme_test.dart @@ -0,0 +1,28 @@ +// 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), + ); + }); + }); +} diff --git a/test/theme/cubit/theme_cubit_test.dart b/test/theme/cubit/theme_cubit_test.dart index 59aecd37..1f2d24e0 100644 --- a/test/theme/cubit/theme_cubit_test.dart +++ b/test/theme/cubit/theme_cubit_test.dart @@ -5,17 +5,17 @@ import 'package:pinball_theme/pinball_theme.dart'; void main() { group('ThemeCubit', () { - test('initial state has Dash theme', () { + test('initial state has Dash character theme', () { final themeCubit = ThemeCubit(); - expect(themeCubit.state.theme, equals(const DashTheme())); + expect(themeCubit.state.theme.characterTheme, equals(const DashTheme())); }); blocTest( - 'themeSelected emits selected theme', + 'charcterSelected emits selected character theme', build: ThemeCubit.new, - act: (bloc) => bloc.themeSelected(const SparkyTheme()), + act: (bloc) => bloc.characterSelected(const SparkyTheme()), expect: () => [ - const ThemeState(SparkyTheme()), + const ThemeState(PinballTheme(characterTheme: SparkyTheme())), ], ); }); diff --git a/test/theme/cubit/theme_state_test.dart b/test/theme/cubit/theme_state_test.dart index e89abe01..49a2a387 100644 --- a/test/theme/cubit/theme_state_test.dart +++ b/test/theme/cubit/theme_state_test.dart @@ -2,18 +2,17 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:pinball/theme/theme.dart'; -import 'package:pinball_theme/pinball_theme.dart'; void main() { group('ThemeState', () { test('can be instantiated', () { - expect(const ThemeState(DashTheme()), isNotNull); + expect(const ThemeState.initial(), isNotNull); }); test('supports value equality', () { expect( - ThemeState(DashTheme()), - equals(const ThemeState(DashTheme())), + ThemeState.initial(), + equals(const ThemeState.initial()), ); }); });