64 lines
2.5 KiB
Dart
64 lines
2.5 KiB
Dart
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);
|
|
});
|
|
});
|
|
}
|