import 'package:flutter_test/flutter_test.dart'; import 'package:dmc_app/domain/telemetry/drone_status.dart'; void main() { group('computeDroneStatus - connectionQuality', () { test('gruen bei LQ >=70% und SNR >=0dB', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 70, snrDb: 0, navMode: 0, ); expect(status.connectionQuality, SignalLevel.green); }); test('gelb bei LQ >=70% aber SNR <0dB (Rauschen trotz guter LQ)', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 90, snrDb: -1, navMode: 0, ); expect(status.connectionQuality, SignalLevel.yellow); }); test('gelb bei LQ zwischen 50% und 70%', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 60, snrDb: 5, navMode: 0, ); expect(status.connectionQuality, SignalLevel.yellow); }); test('rot bei LQ <50%', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 20, snrDb: 10, navMode: 0, ); expect(status.connectionQuality, SignalLevel.red); }); }); group('computeDroneStatus - positionQuality', () { test('gruen bei >=8 Satelliten und HDOP <2.0', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 9, hdop: 1.5, linkQuality: 80, snrDb: 5, navMode: 0, ); expect(status.positionQuality, SignalLevel.green); }); test('gelb bei >=6 Satelliten und HDOP <5.0, aber nicht gruen-Schwelle', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 6, hdop: 3.0, linkQuality: 80, snrDb: 5, navMode: 0, ); expect(status.positionQuality, SignalLevel.yellow); }); test('rot ohne GPS-Fix, unabhaengig von Satelliten/HDOP', () { final status = computeDroneStatus( armed: false, hasFix: false, numSat: 12, hdop: 0.5, linkQuality: 80, snrDb: 5, navMode: 0, ); expect(status.positionQuality, SignalLevel.red); }); test('rot bei wenigen Satelliten trotz Fix', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 3, hdop: 8.0, linkQuality: 80, snrDb: 5, navMode: 0, ); expect(status.positionQuality, SignalLevel.red); }); }); group('computeDroneStatus - state', () { test('error hat Vorrang, sobald navMode Emergency (15) ist', () { final status = computeDroneStatus( armed: true, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 80, snrDb: 5, navMode: 15, ); expect(status.state, DroneState.error); }); test('waypoint, wenn armed und navMode Waypoint mission (3)', () { final status = computeDroneStatus( armed: true, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 80, snrDb: 5, navMode: 3, ); expect(status.state, DroneState.waypoint); }); test('armed, wenn armed aber kein Waypoint-Modus (z.B. Hold)', () { final status = computeDroneStatus( armed: true, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 80, snrDb: 5, navMode: 1, ); expect(status.state, DroneState.armed); }); test('ready, wenn nicht armed aber GPS-Fix vorhanden', () { final status = computeDroneStatus( armed: false, hasFix: true, numSat: 10, hdop: 1.0, linkQuality: 80, snrDb: 5, navMode: 0, ); expect(status.state, DroneState.ready); }); test('idle, wenn nicht armed und kein GPS-Fix', () { final status = computeDroneStatus( armed: false, hasFix: false, numSat: 0, hdop: 99.99, linkQuality: 80, snrDb: 5, navMode: 0, ); expect(status.state, DroneState.idle); }); }); }