import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:health_app/core/app_theme.dart'; import 'package:health_app/core/elder_mode_scope.dart'; import 'package:health_app/pages/settings/elder_mode_page.dart'; import 'package:health_app/providers/elder_mode_provider.dart'; class _FakeElderModeNotifier extends ElderModeNotifier { final bool initiallyEnabled; _FakeElderModeNotifier(this.initiallyEnabled); @override ElderModeState build() => ElderModeState( preferences: ElderModePreferences(enabled: initiallyEnabled), isLoaded: true, ); @override Future enable() async { state = state.copyWith( preferences: state.preferences.copyWith(enabled: true), ); return true; } @override Future disable() async { state = state.copyWith( preferences: state.preferences.copyWith(enabled: false), ); return true; } @override Future setLargeTextEnabled(bool enabled) async { state = state.copyWith( preferences: state.preferences.copyWith(largeTextEnabled: enabled), ); return true; } @override Future setVoiceInputEnabled(bool enabled) async { state = state.copyWith( preferences: state.preferences.copyWith(voiceInputEnabled: enabled), ); return true; } } class _ElderModeHarness extends ConsumerWidget { const _ElderModeHarness(); @override Widget build(BuildContext context, WidgetRef ref) { final state = ref.watch(elderModeProvider); final baseTheme = state.isEnabled ? AppTheme.elderLightTheme : AppTheme.lightTheme; return MaterialApp( debugShowCheckedModeBanner: false, theme: baseTheme, home: ElderModeScope( enabled: state.isEnabled, largeTextEnabled: state.isEnabled && state.preferences.largeTextEnabled, child: const ElderModePage(), ), ); } } Future _pumpPage(WidgetTester tester, {required bool enabled}) async { tester.view.physicalSize = const Size(390, 844); tester.view.devicePixelRatio = 1; addTearDown(tester.view.resetPhysicalSize); addTearDown(tester.view.resetDevicePixelRatio); await tester.pumpWidget( ProviderScope( overrides: [ elderModeProvider.overrideWith(() => _FakeElderModeNotifier(enabled)), ], child: const _ElderModeHarness(), ), ); await tester.pumpAndSettle(); } void main() { testWidgets('长辈模式可立即开启并显示已开启状态', (tester) async { await _pumpPage(tester, enabled: false); expect(find.text('开启长辈模式,操作更清晰'), findsOneWidget); expect(find.text('立即开启'), findsOneWidget); await tester.tap(find.text('立即开启')); await tester.pumpAndSettle(); expect(find.text('长辈模式已开启'), findsOneWidget); expect(find.text('大图标和大按钮已启用'), findsOneWidget); expect(tester.takeException(), isNull); }); testWidgets('长辈模式页面在 390x844 下无布局溢出', (tester) async { await _pumpPage(tester, enabled: true); expect(find.text('关闭长辈模式'), findsOneWidget); expect(find.byType(Switch), findsNWidgets(2)); expect(tester.takeException(), isNull); }); }