import 'package:flutter_test/flutter_test.dart'; import 'package:dmc_app/domain/telemetry/system_message.dart'; import 'package:dmc_app/transport/flight_controller_link.dart'; TelemetryFrame _frame({int batteryPercent = 80, int navMode = 0}) { return TelemetryFrame( lat: 52.5, lon: 13.4, hasFix: true, numSat: 10, altitudeM: 100, speedMs: 15, headingDeg: 0, armed: true, batteryPercent: batteryPercent, batteryVoltage: 22.0, currentA: 10.0, linkQuality: 90, snrDb: 5, hdop: 1.0, navMode: navMode, flightMode: 'Idle', ); } void main() { final now = DateTime(2026, 1, 1, 12, 0, 0); group('detectSystemMessages - battery', () { test('kein Ereignis ohne vorherigen Frame', () { final events = detectSystemMessages( previous: null, current: _frame(batteryPercent: 15), now: now, ); expect(events, isEmpty); }); test('kein Ereignis, solange keine Schwelle unterschritten wird', () { final events = detectSystemMessages( previous: _frame(batteryPercent: 80), current: _frame(batteryPercent: 75), now: now, ); expect(events, isEmpty); }); test('"Battery low" beim Unterschreiten von 30%', () { final events = detectSystemMessages( previous: _frame(batteryPercent: 32), current: _frame(batteryPercent: 28), now: now, ); expect(events, hasLength(1)); expect(events.single.severity, SystemMessageSeverity.warning); expect(events.single.message, contains('Battery low')); }); test('"Battery critical" beim Unterschreiten von 20%', () { final events = detectSystemMessages( previous: _frame(batteryPercent: 22), current: _frame(batteryPercent: 18), now: now, ); expect(events, hasLength(1)); expect(events.single.severity, SystemMessageSeverity.critical); expect(events.single.message, contains('Battery critical')); }); test('nur "Battery critical", wenn beide Schwellen im selben Schritt fallen', () { final events = detectSystemMessages( previous: _frame(batteryPercent: 35), current: _frame(batteryPercent: 15), now: now, ); expect(events, hasLength(1)); expect(events.single.message, contains('Battery critical')); }); test('kein erneutes Ereignis, solange der Ladestand unter der Schwelle bleibt', () { final events = detectSystemMessages( previous: _frame(batteryPercent: 25), current: _frame(batteryPercent: 22), now: now, ); expect(events, isEmpty); }); }); group('detectSystemMessages - failsafe', () { test('"Failsafe mode activated" beim Wechsel in Emergency (navMode 15)', () { final events = detectSystemMessages( previous: _frame(navMode: 3), current: _frame(navMode: 15), now: now, ); expect(events, hasLength(1)); expect(events.single.severity, SystemMessageSeverity.critical); expect(events.single.message, 'Failsafe mode activated'); }); test('kein erneutes Ereignis, solange Emergency anhaelt', () { final events = detectSystemMessages( previous: _frame(navMode: 15), current: _frame(navMode: 15), now: now, ); expect(events, isEmpty); }); }); }