import 'package:cardash_launcher/core/theme/accent_choice.dart'; import 'package:cardash_launcher/core/theme/app_colors.dart'; import 'package:cardash_launcher/core/theme/app_theme.dart'; import 'package:cardash_launcher/core/theme/theme_controller.dart'; import 'package:cardash_launcher/core/theme/theme_preference.dart'; import 'package:cardash_launcher/data/repositories/settings_repository.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { SharedPreferences.setMockInitialValues({}); }); test('defaults are automatic with a 19:00-07:00 night window', () async { final prefs = await SharedPreferences.getInstance(); final repository = SettingsRepository(prefs); expect(repository.themePreference, ThemePreference.automatic); expect(repository.nightStartMinutes, 19 * 60); expect(repository.nightEndMinutes, 7 * 60); expect(repository.accent, AccentChoice.green); expect(repository.showBattery, isTrue); }); test('explicit light and dark choices resolve immediately', () async { final prefs = await SharedPreferences.getInstance(); final controller = ThemeController(SettingsRepository(prefs)); addTearDown(controller.dispose); await controller.setPreference(ThemePreference.dark); expect(controller.isDark, isTrue); await controller.setPreference(ThemePreference.light); expect(controller.isDark, isFalse); await controller.setPreference(ThemePreference.automatic); expect(controller.isDark, isIn([true, false])); }); test('dark surfaces are tinted by the chosen accent', () { final green = AppColors.darkFor(AccentChoice.green); final blue = AppColors.darkFor(AccentChoice.blue); expect(blue.canvas, isNot(green.canvas)); expect(blue.canvas.b, greaterThan(blue.canvas.g)); }); test('a chosen accent becomes the theme primary', () { final theme = AppTheme.light(accent: AccentChoice.blue); expect(theme.colorScheme.primary, AccentChoice.blue.lightAccent); expect(theme.extension()!.accent, AccentChoice.blue.lightAccent); }); test('accent and battery visibility survive a new controller', () async { final prefs = await SharedPreferences.getInstance(); final first = ThemeController(SettingsRepository(prefs)); expect(first.accent, AccentChoice.green); expect(first.showBattery, isTrue); await first.setAccent(AccentChoice.blue); await first.setShowBattery(false); first.dispose(); final reloaded = ThemeController(SettingsRepository(prefs)); addTearDown(reloaded.dispose); expect(reloaded.accent, AccentChoice.blue); expect(reloaded.showBattery, isFalse); }); test('theme choices survive a new repository instance', () async { final prefs = await SharedPreferences.getInstance(); final controller = ThemeController(SettingsRepository(prefs)); await controller.setPreference(ThemePreference.dark); controller.dispose(); final reloaded = ThemeController(SettingsRepository(prefs)); addTearDown(reloaded.dispose); expect(reloaded.preference, ThemePreference.dark); expect(reloaded.isDark, isTrue); }); }