114 lines
3.8 KiB
Dart
114 lines
3.8 KiB
Dart
import 'package:dmc_app/domain/mission/mission_stats.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 speed = 15}) =>
|
|
Waypoint(lat: lat, lon: lon, altitudeM: 60, speedMs: speed, catchRadiusM: 60);
|
|
|
|
void main() {
|
|
group('computeMissionStats', () {
|
|
test('leere/einzelne Wegpunktliste ergibt Distanz/Dauer 0', () {
|
|
expect(computeMissionStats(const []).distanceM, 0);
|
|
expect(computeMissionStats([_wp(0, 0)]).distanceM, 0);
|
|
expect(computeMissionStats([_wp(0, 0)]).durationSec, 0);
|
|
});
|
|
|
|
test('zwei Wegpunkte: Distanz aus Grosskreis, Dauer aus Zielgeschwindigkeit', () {
|
|
final stats = computeMissionStats([_wp(0, 0), _wp(0, 0.01, speed: 20)]);
|
|
|
|
// 0.01 Grad Laengendifferenz am Aequator entspricht rund 1112 m.
|
|
expect(stats.distanceM, closeTo(1112.6, 1));
|
|
expect(stats.durationSec, closeTo(stats.distanceM / 20, 0.01));
|
|
});
|
|
|
|
test('mehrere Beine summieren sich, Dauer je Bein mit dessen Zielgeschwindigkeit', () {
|
|
final stats = computeMissionStats(
|
|
[_wp(0, 0, speed: 10), _wp(0, 0.01, speed: 20), _wp(0, 0.02, speed: 10)],
|
|
);
|
|
|
|
final leg1 = 1112.6;
|
|
final leg2 = 1112.6;
|
|
expect(stats.distanceM, closeTo(leg1 + leg2, 2));
|
|
// Erstes Bein zaehlt mit der Geschwindigkeit des Zielwegpunkts (20),
|
|
// zweites Bein mit dessen Zielwegpunkt (10).
|
|
expect(stats.durationSec, closeTo(leg1 / 20 + leg2 / 10, 0.1));
|
|
});
|
|
});
|
|
|
|
group('computeFlyMissionStatus', () {
|
|
final waypoints = [_wp(0, 0), _wp(0, 0.01), _wp(0, 0.02)];
|
|
|
|
test('kein aktiver Wegpunkt (null) ergibt null', () {
|
|
expect(
|
|
computeFlyMissionStatus(waypoints: waypoints, activeWaypointIndex: null),
|
|
isNull,
|
|
);
|
|
});
|
|
|
|
test('activeWaypointIndex ausserhalb der Liste ergibt null', () {
|
|
expect(
|
|
computeFlyMissionStatus(waypoints: waypoints, activeWaypointIndex: 3),
|
|
isNull,
|
|
);
|
|
expect(
|
|
computeFlyMissionStatus(waypoints: waypoints, activeWaypointIndex: -1),
|
|
isNull,
|
|
);
|
|
});
|
|
|
|
test('activeWaypointNumber ist 1-basiert (Index 1 -> Nummer 2)', () {
|
|
final status = computeFlyMissionStatus(
|
|
waypoints: waypoints,
|
|
activeWaypointIndex: 1,
|
|
);
|
|
expect(status!.activeWaypointNumber, 2);
|
|
expect(status.waypointCount, 3);
|
|
});
|
|
|
|
test('ohne Position (kein Fix) bleiben Distanz/ETA null', () {
|
|
final status = computeFlyMissionStatus(
|
|
waypoints: waypoints,
|
|
activeWaypointIndex: 1,
|
|
);
|
|
expect(status!.distanceToActiveWaypointM, isNull);
|
|
expect(status.etaToActiveWaypointSec, isNull);
|
|
});
|
|
|
|
test('mit Position wird die Distanz zum aktiven Wegpunkt berechnet', () {
|
|
final status = computeFlyMissionStatus(
|
|
waypoints: waypoints,
|
|
activeWaypointIndex: 1,
|
|
currentLat: 0,
|
|
currentLon: 0,
|
|
);
|
|
// Wegpunkt 1 (Index 1) liegt bei (0, 0.01) - rund 1112.6 m vom
|
|
// Ursprung entfernt.
|
|
expect(status!.distanceToActiveWaypointM, closeTo(1112.6, 1));
|
|
// Ohne Geschwindigkeit keine ETA.
|
|
expect(status.etaToActiveWaypointSec, isNull);
|
|
});
|
|
|
|
test('mit Position und Geschwindigkeit wird die ETA berechnet', () {
|
|
final status = computeFlyMissionStatus(
|
|
waypoints: waypoints,
|
|
activeWaypointIndex: 1,
|
|
currentLat: 0,
|
|
currentLon: 0,
|
|
currentSpeedMs: 10,
|
|
);
|
|
expect(status!.etaToActiveWaypointSec, closeTo(1112.6 / 10, 0.1));
|
|
});
|
|
|
|
test('unter 0.5 m/s wird keine (irrefuehrende) ETA berechnet', () {
|
|
final status = computeFlyMissionStatus(
|
|
waypoints: waypoints,
|
|
activeWaypointIndex: 1,
|
|
currentLat: 0,
|
|
currentLon: 0,
|
|
currentSpeedMs: 0.1,
|
|
);
|
|
expect(status!.etaToActiveWaypointSec, isNull);
|
|
});
|
|
});
|
|
}
|