import 'package:dmc_app/domain/mission/route_geometry.dart'; import 'package:dmc_app/domain/waypoint/flat_waypoint_list.dart'; import 'package:flutter_test/flutter_test.dart'; Waypoint _wp(double lat, double lon, {double alt = 60, double speed = 15}) => Waypoint(lat: lat, lon: lon, altitudeM: alt, speedMs: speed, catchRadiusM: 60); void main() { group('buildRouteGeometry', () { const params = (minTurnRadius: 35.0, maxClimbRate: 5.0, maxDescentRate: 6.0); test('leere Wegpunktliste liefert leere Geometrie', () { final geometry = buildRouteGeometry( const [], minTurnRadius: params.minTurnRadius, maxClimbRate: params.maxClimbRate, maxDescentRate: params.maxDescentRate, ); expect(geometry.segments, isEmpty); expect(geometry.vertexBad, isEmpty); }); test('zwei Wegpunkte ergeben eine einzelne Geradenverbindung', () { final geometry = buildRouteGeometry( [_wp(0, 0), _wp(0, 0.01)], minTurnRadius: params.minTurnRadius, maxClimbRate: params.maxClimbRate, maxDescentRate: params.maxDescentRate, ); expect(geometry.segments, hasLength(1)); expect(geometry.segments.single.bad, isFalse); expect(geometry.vertexBad, [false, false]); }); test('sanfte 90-Grad-Kurve mit ausreichend Platz ist fliegbar', () { final geometry = buildRouteGeometry( [_wp(0, 0), _wp(0, 0.01), _wp(0.01, 0.01)], minTurnRadius: params.minTurnRadius, maxClimbRate: params.maxClimbRate, maxDescentRate: params.maxDescentRate, ); expect(geometry.vertexBad[1], isFalse); // Gerade -> Bogen -> Gerade. expect(geometry.segments, hasLength(3)); expect(geometry.segments[1].points.length, greaterThan(2)); }); test('scharfe Kehrtwende ueberschreitet den maximalen Kurswinkel', () { final geometry = buildRouteGeometry( [_wp(0, 0), _wp(0, 0.01), _wp(0, 0.001)], minTurnRadius: params.minTurnRadius, maxClimbRate: params.maxClimbRate, maxDescentRate: params.maxDescentRate, ); expect(geometry.vertexBad[1], isTrue); }); test('zu steiler Sinkflug markiert das Geradenstueck als bad', () { // ~1113 m horizontal bei 15 m/s ~ 74s Flugzeit; 500 m Sinken darin // ergibt eine Sinkrate weit ueber der maxDescentRate von 6 m/s. final geometry = buildRouteGeometry( [_wp(0, 0, alt: 500), _wp(0, 0.01, alt: 0)], minTurnRadius: params.minTurnRadius, maxClimbRate: params.maxClimbRate, maxDescentRate: params.maxDescentRate, ); expect(geometry.segments.single.bad, isTrue); }); }); }