theme_controller_test.dart 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:cardash_launcher/core/theme/accent_choice.dart';
  2. import 'package:cardash_launcher/core/theme/app_colors.dart';
  3. import 'package:cardash_launcher/core/theme/app_theme.dart';
  4. import 'package:cardash_launcher/core/theme/theme_controller.dart';
  5. import 'package:cardash_launcher/core/theme/theme_preference.dart';
  6. import 'package:cardash_launcher/data/repositories/settings_repository.dart';
  7. import 'package:flutter_test/flutter_test.dart';
  8. import 'package:shared_preferences/shared_preferences.dart';
  9. void main() {
  10. TestWidgetsFlutterBinding.ensureInitialized();
  11. setUp(() {
  12. SharedPreferences.setMockInitialValues({});
  13. });
  14. test('defaults are automatic with a 19:00-07:00 night window', () async {
  15. final prefs = await SharedPreferences.getInstance();
  16. final repository = SettingsRepository(prefs);
  17. expect(repository.themePreference, ThemePreference.automatic);
  18. expect(repository.nightStartMinutes, 19 * 60);
  19. expect(repository.nightEndMinutes, 7 * 60);
  20. expect(repository.accent, AccentChoice.green);
  21. expect(repository.showBattery, isTrue);
  22. });
  23. test('explicit light and dark choices resolve immediately', () async {
  24. final prefs = await SharedPreferences.getInstance();
  25. final controller = ThemeController(SettingsRepository(prefs));
  26. addTearDown(controller.dispose);
  27. await controller.setPreference(ThemePreference.dark);
  28. expect(controller.isDark, isTrue);
  29. await controller.setPreference(ThemePreference.light);
  30. expect(controller.isDark, isFalse);
  31. await controller.setPreference(ThemePreference.automatic);
  32. expect(controller.isDark, isIn(<bool>[true, false]));
  33. });
  34. test('dark surfaces are tinted by the chosen accent', () {
  35. final green = AppColors.darkFor(AccentChoice.green);
  36. final blue = AppColors.darkFor(AccentChoice.blue);
  37. expect(blue.canvas, isNot(green.canvas));
  38. expect(blue.canvas.b, greaterThan(blue.canvas.g));
  39. });
  40. test('a chosen accent becomes the theme primary', () {
  41. final theme = AppTheme.light(accent: AccentChoice.blue);
  42. expect(theme.colorScheme.primary, AccentChoice.blue.lightAccent);
  43. expect(theme.extension<AppColors>()!.accent, AccentChoice.blue.lightAccent);
  44. });
  45. test('accent and battery visibility survive a new controller', () async {
  46. final prefs = await SharedPreferences.getInstance();
  47. final first = ThemeController(SettingsRepository(prefs));
  48. expect(first.accent, AccentChoice.green);
  49. expect(first.showBattery, isTrue);
  50. await first.setAccent(AccentChoice.blue);
  51. await first.setShowBattery(false);
  52. first.dispose();
  53. final reloaded = ThemeController(SettingsRepository(prefs));
  54. addTearDown(reloaded.dispose);
  55. expect(reloaded.accent, AccentChoice.blue);
  56. expect(reloaded.showBattery, isFalse);
  57. });
  58. test('theme choices survive a new repository instance', () async {
  59. final prefs = await SharedPreferences.getInstance();
  60. final controller = ThemeController(SettingsRepository(prefs));
  61. await controller.setPreference(ThemePreference.dark);
  62. controller.dispose();
  63. final reloaded = ThemeController(SettingsRepository(prefs));
  64. addTearDown(reloaded.dispose);
  65. expect(reloaded.preference, ThemePreference.dark);
  66. expect(reloaded.isDark, isTrue);
  67. });
  68. }