186 lines
7.6 KiB
Dart
186 lines
7.6 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'package:mobile_eda/core/theme/eda_theme.dart';
|
|
import 'package:mobile_eda/core/config/settings_provider.dart';
|
|
|
|
void main() {
|
|
group('EdaTheme Tests', () {
|
|
test('light theme should have correct brightness', () {
|
|
final theme = EdaTheme.lightTheme;
|
|
expect(theme.brightness, Brightness.light);
|
|
});
|
|
|
|
test('dark theme should have correct brightness', () {
|
|
final theme = EdaTheme.darkTheme;
|
|
expect(theme.brightness, Brightness.dark);
|
|
});
|
|
|
|
test('light theme scaffold background should be light', () {
|
|
final theme = EdaTheme.lightTheme;
|
|
expect(theme.scaffoldBackgroundColor, EdaTheme.lightScaffoldBg);
|
|
});
|
|
|
|
test('dark theme scaffold background should be dark', () {
|
|
final theme = EdaTheme.darkTheme;
|
|
expect(theme.scaffoldBackgroundColor, EdaTheme.darkScaffoldBg);
|
|
});
|
|
|
|
test('light and dark themes should have different primary colors', () {
|
|
final lightPrimary = EdaTheme.lightTheme.colorScheme.primary;
|
|
final darkPrimary = EdaTheme.darkTheme.colorScheme.primary;
|
|
expect(lightPrimary, isNot(equals(darkPrimary)));
|
|
});
|
|
|
|
test('canvas background colors should be different between themes', () {
|
|
expect(EdaTheme.lightCanvasBg, isNot(equals(EdaTheme.darkCanvasBg)));
|
|
});
|
|
|
|
test('grid colors should be different between themes', () {
|
|
expect(EdaTheme.lightGridColor, isNot(equals(EdaTheme.darkGridColor)));
|
|
});
|
|
});
|
|
|
|
group('ThemeModeNotifier Tests', () {
|
|
testWidgets('initial theme mode should be system', (WidgetTester tester) async {
|
|
await tester.pumpWidget(
|
|
const ProviderScope(
|
|
child: MaterialApp(home: Scaffold()),
|
|
),
|
|
);
|
|
|
|
final container = ProviderContainer();
|
|
addTearDown(container.dispose);
|
|
|
|
final themeMode = container.read(themeModeProvider);
|
|
expect(themeMode, ThemeModeType.system);
|
|
});
|
|
|
|
testWidgets('should update theme mode when setThemeMode is called', (WidgetTester tester) async {
|
|
final container = ProviderContainer();
|
|
addTearDown(container.dispose);
|
|
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.dark);
|
|
|
|
expect(container.read(themeModeProvider), ThemeModeType.dark);
|
|
});
|
|
|
|
testWidgets('toggleDarkMode should switch between light and dark', (WidgetTester tester) async {
|
|
final container = ProviderContainer();
|
|
addTearDown(container.dispose);
|
|
|
|
// Start with system, set to light first
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.light);
|
|
expect(container.read(themeModeProvider), ThemeModeType.light);
|
|
|
|
// Toggle to dark
|
|
container.read(themeModeProvider.notifier).toggleDarkMode();
|
|
expect(container.read(themeModeProvider), ThemeModeType.dark);
|
|
|
|
// Toggle back to light
|
|
container.read(themeModeProvider.notifier).toggleDarkMode();
|
|
expect(container.read(themeModeProvider), ThemeModeType.light);
|
|
});
|
|
|
|
testWidgets('flutterThemeMode should return correct ThemeMode', (WidgetTester tester) async {
|
|
final container = ProviderContainer();
|
|
addTearDown(container.dispose);
|
|
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.system);
|
|
expect(container.read(themeModeProvider.notifier).flutterThemeMode, ThemeMode.system);
|
|
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.light);
|
|
expect(container.read(themeModeProvider.notifier).flutterThemeMode, ThemeMode.light);
|
|
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.dark);
|
|
expect(container.read(themeModeProvider.notifier).flutterThemeMode, ThemeMode.dark);
|
|
});
|
|
|
|
testWidgets('isDarkMode should return correct boolean', (WidgetTester tester) async {
|
|
final container = ProviderContainer();
|
|
addTearDown(container.dispose);
|
|
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.light);
|
|
expect(container.read(themeModeProvider.notifier).isDarkMode, false);
|
|
|
|
container.read(themeModeProvider.notifier).setThemeMode(ThemeModeType.dark);
|
|
expect(container.read(themeModeProvider.notifier).isDarkMode, true);
|
|
});
|
|
});
|
|
|
|
group('AppSettings Tests', () {
|
|
test('default settings should have correct values', () {
|
|
final settings = AppSettings();
|
|
|
|
expect(settings.themeMode, ThemeModeType.system);
|
|
expect(settings.language, LanguageType.system);
|
|
expect(settings.gridSize, 10.0);
|
|
expect(settings.showGrid, true);
|
|
expect(settings.snapToGrid, true);
|
|
expect(settings.autoSave, true);
|
|
expect(settings.autoSaveIntervalMinutes, 5);
|
|
expect(settings.enableAnimations, true);
|
|
expect(settings.enableAntialiasing, true);
|
|
expect(settings.renderQuality, RenderQuality.balanced);
|
|
});
|
|
|
|
test('copyWith should create independent copy', () {
|
|
final original = AppSettings();
|
|
final copy = original.copyWith(
|
|
themeMode: ThemeModeType.dark,
|
|
gridSize: 20.0,
|
|
);
|
|
|
|
expect(original.themeMode, ThemeModeType.system);
|
|
expect(copy.themeMode, ThemeModeType.dark);
|
|
expect(original.gridSize, 10.0);
|
|
expect(copy.gridSize, 20.0);
|
|
});
|
|
|
|
test('locale should return correct Locale for each language', () {
|
|
expect(AppSettings(language: LanguageType.system).locale, isNull);
|
|
expect(AppSettings(language: LanguageType.chineseSimple).locale, const Locale('zh', 'CN'));
|
|
expect(AppSettings(language: LanguageType.chineseTraditional).locale, const Locale('zh', 'TW'));
|
|
expect(AppSettings(language: LanguageType.english).locale, const Locale('en', 'US'));
|
|
expect(AppSettings(language: LanguageType.arabic).locale, const Locale('ar', 'SA'));
|
|
});
|
|
|
|
test('isRtl should return true only for Arabic', () {
|
|
expect(AppSettings(language: LanguageType.system).isRtl, false);
|
|
expect(AppSettings(language: LanguageType.chineseSimple).isRtl, false);
|
|
expect(AppSettings(language: LanguageType.chineseTraditional).isRtl, false);
|
|
expect(AppSettings(language: LanguageType.english).isRtl, false);
|
|
expect(AppSettings(language: LanguageType.arabic).isRtl, true);
|
|
});
|
|
|
|
test('languageDisplayName should return correct display name', () {
|
|
expect(AppSettings(language: LanguageType.system).languageDisplayName, '系统语言');
|
|
expect(AppSettings(language: LanguageType.chineseSimple).languageDisplayName, '简体中文');
|
|
expect(AppSettings(language: LanguageType.chineseTraditional).languageDisplayName, '繁體中文');
|
|
expect(AppSettings(language: LanguageType.english).languageDisplayName, 'English');
|
|
expect(AppSettings(language: LanguageType.arabic).languageDisplayName, 'العربية');
|
|
});
|
|
});
|
|
|
|
group('RenderQuality Tests', () {
|
|
test('RenderQuality enum should have correct values', () {
|
|
expect(RenderQuality.values.length, 3);
|
|
expect(RenderQuality.values[0], RenderQuality.high);
|
|
expect(RenderQuality.values[1], RenderQuality.balanced);
|
|
expect(RenderQuality.values[2], RenderQuality.performance);
|
|
});
|
|
});
|
|
|
|
group('LanguageType Tests', () {
|
|
test('LanguageType enum should have correct values', () {
|
|
expect(LanguageType.values.length, 5);
|
|
expect(LanguageType.values[0], LanguageType.system);
|
|
expect(LanguageType.values[1], LanguageType.chineseSimple);
|
|
expect(LanguageType.values[2], LanguageType.chineseTraditional);
|
|
expect(LanguageType.values[3], LanguageType.english);
|
|
expect(LanguageType.values[4], LanguageType.arabic);
|
|
});
|
|
});
|
|
}
|