main
1
2import 'dart:math';
3
4import 'package:blood_pressure_app/model/storage/storage.dart';
5import 'package:blood_pressure_app/screens/statistics_screen.dart';
6import 'package:flutter/material.dart';
7import 'package:flutter_bloc/flutter_bloc.dart';
8import 'package:blood_pressure_app/l10n/app_localizations.dart';
9import 'package:flutter_test/flutter_test.dart';
10import 'package:health_data_store/health_data_store.dart';
11import 'package:integration_test/integration_test.dart';
12import 'package:intl/date_symbol_data_local.dart';
13import 'package:provider/provider.dart';
14
15import '../test/model/analyzer_test.dart';
16
17void main() {
18 final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();
19 testWidgets('Statistics screen', (WidgetTester tester) async {
20 await TestWidgetsFlutterBinding.ensureInitialized();
21 await initializeDateFormatting('en');
22 await tester.pumpWidget(MaterialApp(
23 darkTheme: _buildTheme(ColorScheme.fromSeed(
24 seedColor: Colors.teal,
25 brightness: Brightness.dark,
26 ),),
27 themeMode: ThemeMode.dark,
28 debugShowCheckedModeBanner: false,
29 localizationsDelegates: [AppLocalizations.delegate,], locale: Locale('en'),
30 home: MultiProvider(
31 providers: [
32 ChangeNotifierProvider(create: (c) => IntervalStoreManager(IntervalStorage(), IntervalStorage(), IntervalStorage())),
33 ChangeNotifierProvider(create: (c) => Settings()),
34 ],
35 child: RepositoryProvider<BloodPressureRepository>(
36 create: (c) {
37 final rng = Random();
38 final repo = _MockRepo();
39 repo.records = [
40 for (int i = 0; i < 144; i++)
41 mockRecord(
42 time: DateTime.fromMillisecondsSinceEpoch(1000*60*60*24*265*40 + i * 1000*60*60*8),
43 sys: 130 + (rng.nextInt(40) - 20) - (i ~/ 8),
44 dia: 85 + (rng.nextInt(30) - 15) - (i ~/ 9),
45 pul: 70 + (rng.nextInt(40) - 20) - (i ~/ 8),
46 ),
47 ];
48 return repo;
49 },
50 child: StatisticsScreen(),
51 ),
52 ),
53 ));
54
55 await tester.pumpAndSettle();
56 await binding.convertFlutterSurfaceToImage();
57 await tester.pump();
58 await binding.takeScreenshot('04-example_stats');
59 });
60}
61
62class _MockRepo extends BloodPressureRepository {
63 List<BloodPressureRecord> records = [];
64
65 @override
66 Future<void> add(BloodPressureRecord value) => throw UnimplementedError();
67
68 @override
69 Future<List<BloodPressureRecord>> get(DateRange range) async => records;
70
71 @override
72 Future<void> remove(BloodPressureRecord value) => throw UnimplementedError();
73
74 @override
75 Stream subscribe() => Stream.empty();
76}
77
78// Copy of app method
79ThemeData _buildTheme(ColorScheme colorScheme) {
80 final inputBorder = OutlineInputBorder(
81 borderSide: BorderSide(
82 width: 3,
83 // Through black background outlineVariant has enough contrast.
84 color: (colorScheme.brightness == Brightness.dark)
85 ? colorScheme.outlineVariant
86 : colorScheme.outline,
87 ),
88 borderRadius: BorderRadius.circular(20),
89 );
90
91 return ThemeData(
92 colorScheme: colorScheme,
93 useMaterial3: true,
94 inputDecorationTheme: InputDecorationTheme(
95 errorMaxLines: 5,
96 border: inputBorder,
97 enabledBorder: inputBorder,
98 ),
99 scaffoldBackgroundColor: colorScheme.brightness == Brightness.dark
100 ? Colors.black
101 : Colors.white,
102 appBarTheme: const AppBarTheme(
103 centerTitle: true,
104 shape: RoundedRectangleBorder(
105 borderRadius: BorderRadius.only(
106 bottomRight: Radius.circular(15),
107 bottomLeft: Radius.circular(15),
108 ),
109 ),
110 ),
111 snackBarTheme: SnackBarThemeData(
112 shape: RoundedRectangleBorder(
113 borderRadius: BorderRadius.circular(8),
114 ),
115 ),
116 );
117}