import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; import 'package:dmc_app/domain/waypoint/flat_waypoint_list.dart'; import 'package:dmc_app/services/sharing/mission_share_codec.dart'; void main() { const waypoints = [ Waypoint( lat: 48.1351, lon: 11.5820, altitudeM: 60, speedMs: 15, catchRadiusM: 60, windSpeedMs: 4, windDirFromDeg: 270, windElevationM: 520, ), Waypoint( lat: 48.1360, lon: 11.5830, altitudeM: 120, speedMs: 20, catchRadiusM: 60, action: WaypointAction.loiter, ), ]; group('buildMissionExportJson / parseMissionImportJson', () { test('round-trip erhaelt Name, Ort und alle Wegpunktfelder', () { final json = buildMissionExportJson(MissionExportData( name: 'Munich Loop', placeName: 'Munich', createdAt: DateTime.utc(2026, 1, 1), waypoints: waypoints, )); final parsed = parseMissionImportJson(json); expect(parsed.name, 'Munich Loop'); expect(parsed.placeName, 'Munich'); expect(parsed.versionMismatch, isNull); expect(parsed.waypoints, hasLength(2)); expect(parsed.waypoints[0].lat, waypoints[0].lat); expect(parsed.waypoints[0].windSpeedMs, 4); expect(parsed.waypoints[1].action, WaypointAction.loiter); }); test('fehlende appVersion-Uebereinstimmung wird als Mismatch erkannt', () { final json = buildMissionExportJson(MissionExportData( name: 'Old export', placeName: null, createdAt: DateTime.utc(2020, 1, 1), waypoints: waypoints, )).replaceFirst('"1.0.0"', '"2.4.1"'); final parsed = parseMissionImportJson(json); expect(parsed.versionMismatch, '2.4.1'); }); test('Datei ohne "appVersion"-Umschlag (nur das rohe mission-Objekt) wird akzeptiert', () { final rawMission = { 'name': 'Bare mission', 'waypoints': [ { 'lat': 1.0, 'lon': 2.0, 'altitudeM': 60.0, 'speedMs': 15.0, 'catchRadiusM': 60.0, 'action': 'none', }, ], }; final parsed = parseMissionImportJson(jsonEncode(rawMission)); expect(parsed.name, 'Bare mission'); expect(parsed.waypoints, hasLength(1)); }); test('wirft FormatException bei ungueltigem JSON', () { expect(() => parseMissionImportJson('not json'), throwsFormatException); }); test('wirft FormatException wenn Wegpunkte fehlen', () { expect( () => parseMissionImportJson('{"mission": {"name": "Empty"}}'), throwsFormatException, ); }); test('fehlender Name faellt auf placeName, dann auf Standardtext zurueck', () { final withPlaceOnly = parseMissionImportJson( '{"mission": {"placeName": "Somewhere", "waypoints": [{"lat":1,"lon":1,' '"altitudeM":60,"speedMs":15,"catchRadiusM":60,"action":"none"}]}}', ); expect(withPlaceOnly.name, 'Somewhere'); final withNeither = parseMissionImportJson( '{"mission": {"waypoints": [{"lat":1,"lon":1,' '"altitudeM":60,"speedMs":15,"catchRadiusM":60,"action":"none"}]}}', ); expect(withNeither.name, 'Imported mission'); }); }); group('missionExportFilename', () { test('ersetzt Sonderzeichen durch Unterstriche', () { expect(missionExportFilename('Sankt Pölten / Nord'), 'mission-Sankt_P_lten___Nord.json'); }); }); }