Commit cb57481

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-08-22 08:26:12
test value graph rendering
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 5654477
Changed files (4)
app
lib
features
statistics
test
app/lib/features/statistics/value_graph.dart
@@ -190,6 +190,11 @@ class _ValueGraphPainter extends CustomPainter {
       }
     }
 
+    if (stepDuration == null) {
+      // graph to small to draw labels
+      return;
+    }
+
     // draw vertical decorations
     for (int i = 0; i < bottomLabelCount; i += 2) {
       final x = _kLeftLegendWidth + i * (drawWidth / bottomLabelCount);
@@ -416,7 +421,6 @@ class _ValueGraphPainter extends CustomPainter {
   bool shouldRepaint(covariant CustomPainter oldDelegate) => oldDelegate is! _ValueGraphPainter
     || oldDelegate.progress != progress
     || oldDelegate.brightness != brightness
-    || oldDelegate.settings.preferredPressureUnit != settings.preferredPressureUnit
     || oldDelegate.settings.sysColor != settings.sysColor
     || oldDelegate.settings.diaColor != settings.diaColor
     || oldDelegate.settings.graphLineThickness != settings.graphLineThickness
@@ -425,6 +429,7 @@ class _ValueGraphPainter extends CustomPainter {
     || oldDelegate.settings.diaWarn != settings.diaWarn
     || oldDelegate.settings.drawRegressionLines != settings.drawRegressionLines
     || oldDelegate.settings.needlePinBarWidth != settings.needlePinBarWidth
+    || oldDelegate.settings.horizontalGraphLines != settings.horizontalGraphLines
     || oldDelegate.records != records
     || oldDelegate.colors != colors
     || oldDelegate.intakes != intakes;
app/test/features/statistics/full_graph-years.png
Binary file
app/test/features/statistics/value_graph.dart
@@ -1,89 +0,0 @@
-import 'package:blood_pressure_app/features/statistics/value_graph.dart';
-import 'package:blood_pressure_app/model/storage/storage.dart';
-import 'package:collection/collection.dart';
-import 'package:flutter_test/flutter_test.dart';
-
-import '../../model/analyzer_test.dart';
-
-void main() {
-  test('Creates correct sys series', () {
-    final records = [
-      mockRecord(time: DateTime(2000), sys: 123),
-      mockRecord(time: DateTime(2001), sys: 120),
-      mockRecord(time: DateTime(2002), sys: null),
-      mockRecord(time: DateTime(2003), sys: 123),
-      mockRecord(time: DateTime(2004), sys: 200),
-    ];
-    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
-
-    final graph = records.sysGraph();
-    expect(graph, hasLength(4));
-    expect(graph.isSorted((a, b) => a.$1.compareTo(b.$1)), isTrue);
-    expect(graph.elementAt(0).$2, 123 * 0.133322);
-    expect(graph.elementAt(1).$2, 120 * 0.133322);
-    expect(graph.elementAt(2).$2, 123 * 0.133322);
-    expect(graph.elementAt(3).$2, 200 * 0.133322);
-  });
-  test('Creates correct dia series', () {
-    final records = [
-      mockRecord(time: DateTime(2000), dia: 123),
-      mockRecord(time: DateTime(2001), dia: 120),
-      mockRecord(time: DateTime(2002), dia: null),
-      mockRecord(time: DateTime(2003), dia: 123),
-      mockRecord(time: DateTime(2004), dia: 200),
-    ];
-    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
-
-    final graph = records.diaGraph();
-    expect(graph, hasLength(4));
-    expect(graph.isSorted((a, b) => a.$1.compareTo(b.$1)), isTrue);
-    expect(graph.elementAt(0).$2, 123 * 0.133322);
-    expect(graph.elementAt(1).$2, 120 * 0.133322);
-    expect(graph.elementAt(2).$2, 123 * 0.133322);
-    expect(graph.elementAt(3).$2, 200 * 0.133322);
-  });
-  test('Creates correct pul series', () {
-    final records = [
-      mockRecord(time: DateTime(2000), pul: 123),
-      mockRecord(time: DateTime(2001), pul: 120),
-      mockRecord(time: DateTime(2002), pul: null),
-      mockRecord(time: DateTime(2003), pul: 123),
-      mockRecord(time: DateTime(2004), pul: 200),
-    ];
-    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
-
-    final graph = records.pulGraph();
-    expect(graph, hasLength(4));
-    expect(graph.isSorted((a, b) => a.$1.compareTo(b.$1)), isTrue);
-    expect(graph.elementAt(0).$2, 123.0);
-    expect(graph.elementAt(1).$2, 120.0);
-    expect(graph.elementAt(2).$2, 123.0);
-    expect(graph.elementAt(3).$2, 200.0);
-  });
-  testWidgets('BloodPressureValueGraph throws assertion error without enough values', (tester) async {
-    await expectLater(
-      () => tester.pumpWidget(BloodPressureValueGraph(records: [], settings: Settings(),)),
-      throwsAssertionError,
-    );
-  });
-  testWidgets('BloodPressureValueGraph throws assertion error with unsorted values', (tester) async {
-    await expectLater(
-      () => tester.pumpWidget(BloodPressureValueGraph(records: [
-        mockRecord(time: DateTime(2005), sys: 1),
-        mockRecord(time: DateTime(2003), sys: 1),
-        mockRecord(time: DateTime(2007), sys: 1),
-      ], settings: Settings())),
-      throwsAssertionError,
-    );
-  });
-  testWidgets('BloodPressureValueGraph can be instantiated with valid values', (tester) async {
-    await expectLater(
-      () => tester.pumpWidget(BloodPressureValueGraph(records: [
-        mockRecord(time: DateTime(2003), sys: 1),
-        mockRecord(time: DateTime(2005), sys: 1),
-        mockRecord(time: DateTime(2007), sys: 1),
-      ], settings: Settings())),
-      returnsNormally,
-    );
-  });
-}
app/test/features/statistics/value_graph_test.dart
@@ -0,0 +1,123 @@
+import 'package:blood_pressure_app/features/statistics/value_graph.dart';
+import 'package:blood_pressure_app/model/horizontal_graph_line.dart';
+import 'package:blood_pressure_app/model/storage/storage.dart';
+import 'package:collection/collection.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:health_data_store/health_data_store.dart';
+import 'package:provider/provider.dart';
+
+import '../../model/analyzer_test.dart';
+import '../../util.dart';
+import '../measurement_list/measurement_list_entry_test.dart';
+
+void main() {
+  test('Creates correct sys series', () {
+    final records = [
+      mockRecord(time: DateTime(2000), sys: 123),
+      mockRecord(time: DateTime(2001), sys: 120),
+      mockRecord(time: DateTime(2002), sys: null),
+      mockRecord(time: DateTime(2003), sys: 123),
+      mockRecord(time: DateTime(2004), sys: 200),
+    ];
+    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
+
+    final graph = records.sysGraph();
+    expect(graph, hasLength(4));
+    expect(graph.isSorted((a, b) => a.$1.compareTo(b.$1)), isTrue);
+    expect(graph.elementAt(0).$2, 123);
+    expect(graph.elementAt(1).$2, 120);
+    expect(graph.elementAt(2).$2, 123);
+    expect(graph.elementAt(3).$2, 200);
+  });
+  test('Creates correct dia series', () {
+    final records = [
+      mockRecord(time: DateTime(2000), dia: 123),
+      mockRecord(time: DateTime(2001), dia: 120),
+      mockRecord(time: DateTime(2002), dia: null),
+      mockRecord(time: DateTime(2003), dia: 123),
+      mockRecord(time: DateTime(2004), dia: 200),
+    ];
+    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
+
+    final graph = records.diaGraph();
+    expect(graph, hasLength(4));
+    expect(graph.isSorted((a, b) => a.$1.compareTo(b.$1)), isTrue);
+    expect(graph.elementAt(0).$2, 123);
+    expect(graph.elementAt(1).$2, 120);
+    expect(graph.elementAt(2).$2, 123);
+    expect(graph.elementAt(3).$2, 200);
+  });
+  test('Creates correct pul series', () {
+    final records = [
+      mockRecord(time: DateTime(2000), pul: 123),
+      mockRecord(time: DateTime(2001), pul: 120),
+      mockRecord(time: DateTime(2002), pul: null),
+      mockRecord(time: DateTime(2003), pul: 123),
+      mockRecord(time: DateTime(2004), pul: 200),
+    ];
+    assert(records.isSorted((a, b) => a.time.compareTo(b.time)));
+
+    final graph = records.pulGraph();
+    expect(graph, hasLength(4));
+    expect(graph.isSorted((a, b) => a.$1.compareTo(b.$1)), isTrue);
+    expect(graph.elementAt(0).$2, 123.0);
+    expect(graph.elementAt(1).$2, 120.0);
+    expect(graph.elementAt(2).$2, 123.0);
+    expect(graph.elementAt(3).$2, 200.0);
+  });
+  testWidgets('BloodPressureValueGraph shows when there are not enough values', (tester) async {
+    await tester.pumpWidget(_buildGraph([], [], []));
+    final localizations = await AppLocalizations.delegate.load(const Locale('en'));
+    expect(find.text(localizations.errNotEnoughDataToGraph), findsOneWidget);
+  });
+  testWidgets('graph with all extras is rendered correctly', (tester) async {
+    await tester.pumpWidget(_buildGraph([
+      mockRecord(time: DateTime(2005), sys: 123, dia: 80, pul: 50),
+      mockRecord(time: DateTime(2003), sys: 110, dia: 73, pul: 130),
+      mockRecord(time: DateTime(2003, 5), sys: 140, dia: 74, pul: 64),
+      mockRecord(time: DateTime(2007), sys: 132, dia: 100, pul: 75),
+    ], [
+      (DateTime(2005), Colors.purple),
+      (DateTime(2005, 3), Colors.tealAccent),
+      (DateTime(2007), Colors.yellow),
+    ], [
+      mockIntake(mockMedicine(color: Colors.blueGrey), time: DateTime(2005).millisecondsSinceEpoch),
+      mockIntake(mockMedicine(color: Colors.indigoAccent), time: DateTime(2004).millisecondsSinceEpoch),
+    ],
+    settings: Settings(
+      drawRegressionLines: true,
+      graphLineThickness: 3.2,
+      diaWarn: 75,
+      needlePinBarWidth: 7.0,
+      horizontalGraphLines: [
+        HorizontalGraphLine(Colors.lightBlue, 113),
+        HorizontalGraphLine(Colors.amber, 45),
+      ]
+    )));
+    await tester.pumpAndSettle();
+    final localizations = await AppLocalizations.delegate.load(const Locale('en'));
+    expect(find.text(localizations.errNotEnoughDataToGraph), findsNothing);
+
+    expect(find.byType(BloodPressureValueGraph), matchesGoldenFile('full_graph-years.png'));
+  });
+}
+
+Widget _buildGraph(
+  List<BloodPressureRecord> data,
+  List<(DateTime, Color)> colors,
+  List<MedicineIntake> intakes, {
+  Settings? settings,
+}) => materialApp(ChangeNotifierProvider<Settings>.value(
+  value: settings ?? Settings(),
+  child: SizedBox(
+    width: 500,
+    height: 300,
+    child: BloodPressureValueGraph(
+      records: data,
+      colors: colors.map((e) => Note(time: e.$1, color: e.$2.value)).toList(),
+      intakes: intakes,
+    ),
+  ),
+));