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}