MotorSignal-App/test/evolution_theme_test.dart

116 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:motorcycle_dash/core/theme/evolution_theme_config.dart';
import 'package:motorcycle_dash/features/records/records_service.dart';
import 'package:motorcycle_dash/features/dashboard/widgets/evolution_portrait_dashboard.dart';
import 'package:motorcycle_dash/features/records/records_screen.dart';
import 'package:motorcycle_dash/features/rides/ride_state_machine.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
group('Evolution Theme Configuration Tests', () {
test('Default theme is classic without altering existing user experience', () async {
SharedPreferences.setMockInitialValues({});
final prefs = await SharedPreferences.getInstance();
final notifier = DashboardThemeModeNotifier(prefs);
expect(notifier.state, equals(DashboardThemeMode.classic));
});
test('Toggling theme switches to evolution and persists', () async {
SharedPreferences.setMockInitialValues({});
final prefs = await SharedPreferences.getInstance();
final notifier = DashboardThemeModeNotifier(prefs);
notifier.setThemeMode(DashboardThemeMode.evolution);
expect(notifier.state, equals(DashboardThemeMode.evolution));
final reloaded = DashboardThemeModeNotifier(prefs);
expect(reloaded.state, equals(DashboardThemeMode.evolution));
});
});
group('Evolution UI Widgets Rendering Tests', () {
testWidgets('EvolutionPortraitDashboard renders speedometer and HUD pods', (tester) async {
SharedPreferences.setMockInitialValues({});
final prefs = await SharedPreferences.getInstance();
await tester.pumpWidget(
ProviderScope(
overrides: [
sharedPreferencesProvider.overrideWithValue(prefs),
],
child: MaterialApp(
home: Scaffold(
body: EvolutionPortraitDashboard(
currentSpeedMph: 136.0,
heading: 355.0,
leanAngle: 48.0,
accelG: 0.98,
lateralG: 1.12,
session: RideSession(
state: RideState.idle,
tripDistanceMiles: 145.2,
topSpeedMph: 168.0,
averageSpeedMph: 87.0,
maxLeanLeft: 52.0,
maxLeanRight: 49.0,
startTime: null,
),
),
),
),
),
);
await tester.pumpAndSettle();
expect(find.text('136'), findsOneWidget);
expect(find.text('MPH'), findsOneWidget);
expect(find.text('NO GPS'), findsOneWidget);
expect(find.text('HEADSET'), findsNothing);
expect(find.text('BRAKING'), findsOneWidget);
expect(find.text('CORNERING'), findsOneWidget);
expect(find.text('LEAN ANGLE'), findsOneWidget);
expect(find.text('START SESSION'), findsOneWidget);
});
testWidgets('RecordsScreen renders speed records and performance times', (tester) async {
tester.view.physicalSize = const Size(1080, 2400);
tester.view.devicePixelRatio = 1.0;
addTearDown(() => tester.view.resetPhysicalSize());
SharedPreferences.setMockInitialValues({
'topSpeedMph': 164.0,
'fastest0To60': 2.9,
'fastest0To100': 6.4,
'maxLeanLeft': 48.0,
});
final prefs = await SharedPreferences.getInstance();
await tester.pumpWidget(
ProviderScope(
overrides: [
sharedPreferencesProvider.overrideWithValue(prefs),
],
child: const MaterialApp(
home: RecordsScreen(),
),
),
);
await tester.pumpAndSettle();
expect(find.text('Personal Records'), findsOneWidget);
expect(find.text('TOP SPEED'), findsOneWidget);
expect(find.text('0-60'), findsOneWidget);
expect(find.text('0-100'), findsOneWidget);
expect(find.text('MAX LEAN LEFT'), findsOneWidget);
});
});
}