Files
AI-Health/health_app/test/elder_mode_page_test.dart

114 lines
3.3 KiB
Dart

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<bool> enable() async {
state = state.copyWith(
preferences: state.preferences.copyWith(enabled: true),
);
return true;
}
@override
Future<bool> disable() async {
state = state.copyWith(
preferences: state.preferences.copyWith(enabled: false),
);
return true;
}
@override
Future<bool> setLargeTextEnabled(bool enabled) async {
state = state.copyWith(
preferences: state.preferences.copyWith(largeTextEnabled: enabled),
);
return true;
}
@override
Future<bool> 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<void> _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);
});
}