Commit f700663

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2023-12-08 17:42:36
add basic CsvConverter testing
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 8262e5a
Changed files (2)
lib
model
export_import
test
model
lib/model/export_import/csv_converter.dart
@@ -28,6 +28,8 @@ class CsvConverter {
         (column) => column.encode(record)
       ).toList()
     ).toList();
+
+    // TODO: reimplement setting for disabling headline
     table.insert(0, columns.map((c) => c.csvTitle).toList());
 
     final csvCreator = ListToCsvConverter(
@@ -89,7 +91,7 @@ class CsvConverter {
         }
         if (piece != null) recordPieces.add(piece);
       }
-      
+
       final DateTime timestamp = recordPieces.firstWhere(
               (piece) => piece.$1 == RowDataFieldType.timestamp).$2;
       final int? sys = recordPieces.firstWhereOrNull(
test/model/export_import/csv_converter_test.dart
@@ -0,0 +1,65 @@
+
+import 'package:blood_pressure_app/model/blood_pressure.dart';
+import 'package:blood_pressure_app/model/export_import/csv_converter.dart';
+import 'package:blood_pressure_app/model/export_import/record_parsing_result.dart';
+import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
+import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+void main() {
+  group('CsvConverter', () {
+    test('should create csv string bigger than 0', () {
+      final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager());
+      final csv = converter.create(createRecords());
+      expect(csv.length, isNonZero);
+    });
+
+    test('should create first line', () {
+      final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager());
+      final csv = converter.create([]);
+      final columns = CsvExportSettings().exportFieldsConfiguration.getActiveColumns(ExportColumnsManager());
+      expect(csv, stringContainsInOrder(columns.map((e) => e.csvTitle).toList()));
+    });
+
+    test('should be able to recreate records from csv in default configuration', () {
+      final converter = CsvConverter(CsvExportSettings(), ExportColumnsManager());
+      final initialRecords = createRecords();
+      final csv = converter.create(initialRecords);
+      final parsedRecords = converter.parse(csv).getOr(failParse);
+      
+      expect(parsedRecords, pairwiseCompare(initialRecords,
+            (p0, BloodPressureRecord p1) =>
+                  p0.creationTime == p1.creationTime &&
+                  p0.systolic == p1.systolic &&
+                  p0.diastolic == p1.diastolic &&
+                  p0.pulse == p1.pulse &&
+                  p0.notes == p1.notes &&
+                  p0.needlePin?.color == p1.needlePin?.color,
+            'equal to'));
+    });
+
+    // TODO: test more
+  });
+}
+
+List<BloodPressureRecord> createRecords([int count = 20]) => [
+  for (int i = 0; i<count; i++)
+    BloodPressureRecord(DateTime.fromMillisecondsSinceEpoch(123456 + i), 
+        i, 100+i, 200+1, 'note $i', needlePin: MeasurementNeedlePin(Color(123+i))),
+];
+
+List<BloodPressureRecord>? failParse(RecordParsingError error) {
+  switch (error) {
+    case RecordParsingErrorEmptyFile():
+      fail('Parsing failed due to insufficient data.');
+    case RecordParsingErrorTimeNotRestoreable():
+      fail('Parsing failed because time was not parsable.');
+    case RecordParsingErrorUnknownColumn():
+      fail('Parsing failed because column "${error.title}" is unknown.');
+    case RecordParsingErrorExpectedMoreFields():
+      fail('Parsing failed because line ${error.lineNumber} contained not enough fields.');
+    case RecordParsingErrorUnparsableField():
+      fail('Parsing failed because field ${error.fieldContents} in line ${error.lineNumber} is not parsable.');
+  }
+}
\ No newline at end of file