import 'package:flutter_test/flutter_test.dart'; import 'package:motorcycle_dash/models/telemetry_sample.dart'; import 'package:motorcycle_dash/services/validation/telemetry_validator.dart'; void main() { group('Phase 8: Deterministic Telemetry Dataset Tests', () { test('Left and Right lean produces opposite signs consistently', () { final leftCornerSample = TelemetrySample( timestamp: DateTime.now(), speed: 42.0, leanAngle: -34.5, // Left lean convention is negative lateralG: -0.68, ); final rightCornerSample = TelemetrySample( timestamp: DateTime.now(), speed: 42.0, leanAngle: 31.2, // Right lean convention is positive lateralG: 0.62, ); expect(leftCornerSample.leanAngle!, isNegative); expect(rightCornerSample.leanAngle!, isPositive); }); test('Straight-line hard acceleration maintains near-zero lean angle', () { final hardLaunchSamples = List.generate(20, (i) { return TelemetrySample( timestamp: DateTime(2026, 8, 28, 12, 0, 0).add(Duration(milliseconds: i * 50)), speed: 10.0 + (i * 1.2), // 10 -> 34 MPH launch in 1.0s (~1.1g) longitudinalG: 0.95, // Hard 0.95g launch lateralG: 0.01, leanAngle: 0.2, // Near-zero lean ); }); final validator = TelemetryValidator(); for (final sample in hardLaunchSamples) { final quality = validator.validate(sample); expect(quality.isValid, isTrue); expect(sample.leanAngle!.abs(), lessThan(1.5)); } }); test('Timestamp gaps (>300ms) are accurately detected and tallied', () { final validator = TelemetryValidator(); final t0 = DateTime(2026, 8, 28, 10, 0, 0); validator.validate(TelemetrySample(timestamp: t0, speed: 30.0)); validator.validate(TelemetrySample(timestamp: t0.add(const Duration(milliseconds: 50)), speed: 30.0)); // 500ms gap validator.validate(TelemetrySample(timestamp: t0.add(const Duration(milliseconds: 550)), speed: 30.0)); // 50ms interval validator.validate(TelemetrySample(timestamp: t0.add(const Duration(milliseconds: 600)), speed: 30.0)); // 2500ms large gap final suspectSample = validator.validate(TelemetrySample(timestamp: t0.add(const Duration(milliseconds: 3100)), speed: 30.0)); expect(validator.timestampGapCount, equals(2)); expect(suspectSample.isSuspect, isTrue); expect(suspectSample.reasons.any((r) => r.contains('Large telemetry gap')), isTrue); }); }); }