diff options
| author | Claude <noreply@anthropic.com> | 2026-05-26 07:46:09 +0000 |
|---|---|---|
| committer | Claude <noreply@anthropic.com> | 2026-05-26 07:46:09 +0000 |
| commit | 3673ed0ef79d776c6da3bfa0db9de8b08326fd32 (patch) | |
| tree | 369ec57c831fb3b3de7220f4ba06fb3cb6d32440 /test-runner/src/test/kotlin/org/terst | |
| parent | e64d07cb49dd3313eb8595935777f31fdfb2f373 (diff) | |
Fix ANR, false tack detections, and empty-state flash on track load
ANR: getSavedTracks() had no IO dispatcher — TackDetector ran on main
thread at O(n²) cost (~77M ops for a 2.5h track). Added withContext(IO).
TackDetector: replaced O(n) list.filter with O(log n) binary-search
subList for before/after windows; O(n²) → O(n log n). Raised MIN_DELTA
60°→75° to stop detecting ordinary course corrections as maneuvers.
Removed MAX_DELTA cap entirely — 180° crash-tacks are valid; the
circularMAD stability windows are the real quality gate.
TrackDetailSheet: dropped the arbitrary abs(delta)>70 Tack/Jibe
heuristic. Now uses true wind angle when available for classification;
falls back to "Maneuver" when TWD is absent.
SavedTracksFragment: added isLoadingTracks StateFlow (MainViewModel);
combine() suppresses the empty-state layout while the initial IO load
runs so it no longer flashes "No saved tracks yet" before data arrives.
16/16 TackDetector tests pass.
https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD
Diffstat (limited to 'test-runner/src/test/kotlin/org/terst')
| -rw-r--r-- | test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt b/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt index 6d946a0..265ba76 100644 --- a/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt +++ b/test-runner/src/test/kotlin/org/terst/nav/track/TackDetectorTest.kt @@ -49,13 +49,13 @@ class TackDetectorTest { } @Test fun `heading change below MIN_DELTA is ignored`() { - // 45° delta — below MIN_DELTA=60° + // 45° delta — below MIN_DELTA=75° assertTrue(TackDetector.detectTacks(tackTrack(90.0, 135.0)).isEmpty()) } - @Test fun `heading change above MAX_DELTA is ignored`() { - // 170° delta — above MAX_DELTA=160° (U-turn, not a tack) - assertTrue(TackDetector.detectTacks(tackTrack(90.0, 260.0)).isEmpty()) + @Test fun `heading change of 170 degrees is detected`() { + // 170° delta — valid crash-tack; no upper cap + assertEquals(1, TackDetector.detectTacks(tackTrack(90.0, 260.0)).size) } @Test fun `detects two tacks in sequence with sufficient gap`() { |
