114 lines
3.3 KiB
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);
|
|
});
|
|
}
|