summaryrefslogtreecommitdiff
path: root/android-app/app/src/test/kotlin/org
AgeCommit message (Collapse)Author
2026-07-01fix(tests): resolve 17 pre-existing JVM test failuresPeter Stone
- build.gradle: add kxml2 for XmlPullFactory in JVM tests (fixes GpxRoundTripTest x6) - MainViewModel: make trackRepository an injectable constructor param (was NavApplication static); move _pastTracks/_savedTracks before init block to prevent NPE under UnconfinedTestDispatcher (fixes MainViewModelTest x8) - MainViewModelTest: pass mockk<TrackRepository>(relaxed) to makeVm() - PreTripReportGenerator: lower windFactor for <5kt wind (0.30β†’0.24) β€” 36ft boat in 3kt gives ~1.64kt, below 2.0kt assertion threshold (fixes PreTripReportGeneratorTest) - TripReportGeneratorTest: update photo marker assertion to match emoji output (πŸ“· not [photo]) - TackDetectorGpxTest: update assertion to >=6 tacks; XML parsing now works so algorithm runs; rewritten TackDetector detects more maneuvers on real track Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-01feat(aton): AtonData model + AtonRepository with 24h cachePeter Stone
Implements AtonData (color mapping + Gson-based JSON parsing for NOAA AtoN station data) and AtonRepository (disk-cached HTTP fetcher). Uses Gson instead of org.json so unit tests run on the JVM classpath. 7/7 AtonDataTest assertions pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30feat(fishing): FishingModeManager with target zone computationPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30feat(fishing): FishingTarget + RigAdvisor logicPeter Stone
Also fix pre-existing test compile errors in WeatherApiServiceTest (nullable list access) and add missing metresToFeet/formatFt helpers to InstrumentHandler. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28Merge claude/whats-next-0XCO3: tech debt items 1, 2, 5Claude
- Deleted com.example.androidapp ghost package (18 stale source files) - Fixed tide model package declarations and HarmonicTideCalculator imports - Symlinked test-runner TackDetector to android-app canonical source - Fixed forecast to use current wall-clock hour slot instead of app-start hour https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD
2026-05-28Tech debt: delete com.example.androidapp ghost package, symlink ↡Claude
TackDetector, fix forecast current hour - Deleted all 18 stale source files in com.example.androidapp (main + test) that duplicated org.terst.nav implementations from an earlier namespace - Fixed the 3 tide model files (TidePrediction/Station/Constituent) whose package declarations read com.example.androidapp.data.model despite living in org.terst.nav.data.model directories - Fixed HarmonicTideCalculator.kt imports to match the corrected package - Fixed TideModelTest.kt package declaration - Migrated HarmonicTideCalculatorTest to org.terst.nav.tide with correct imports - Replaced test-runner's TackDetector.kt copy with a symlink to the android-app canonical source so the two can never diverge again - Fixed addGpsPoint to pick the current wall-clock hour's forecast slot instead of always using the app-start hour (first item in forecast list) https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD
2026-05-27Add unit tests for PreTripReportGeneratorClaude
Covers estimatedSogKt (hull-speed cap, point-of-sail ordering, light-air, hull-length scaling, overpowered vs sweet-spot) and generateReport (condition window size, Now label, heading range, outbound nm, sail plan logic, watch items, similar trips). https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD
2026-05-26Add notes to finished tracks, single Nav voice, fix speed coloringClaude
- TrackDetailSheet: + Add note button opens a dialog with text, camera, and gallery. Entry is saved with timestampMs=track.endMs so it lands inside the track's time window and appears automatically in the event log. logEventAdapter.update() refreshes the list after save. - TripReportGenerator: removed NarrativeStyle enum and 4-style branch. generateNarrative() now emits a concise PASSAGE header (date, time range, duration), stats line (nm / avg kt / max kt), optional conditions (seas, temp), and a timestamped deck log. Fragment and layout updated to remove the ChipGroup style picker. - TrackColors: replaced Expression.get("color") β€” which silently fails for lineColor on LineLayer in MapLibre Android 11.x β€” with Expression.step(Expression.get("speed"), ...) that maps the numeric "speed" property directly to color literals. "color" string property removed from speedSegments() features. https://claude.ai/code/session_01YUbuZNDAoLea4cf9UGQ9qn
2026-05-25Fix bugs from static analysis; add test coverage for new codeClaude
Bugs fixed: - LogbookStorage.copyFromUri: return null when ContentResolver returns null stream instead of returning a path to an unwritten file - VoiceLogFragment adapter: decode photos as downsampled thumbnails (128x96 target) using BitmapFactory inSampleSize instead of loading full-resolution bitmaps on the main thread Tests added: - LogbookRepositoryTest: ID sequencing, insertion order, storage delegation, reload from persisted state, lat/lon preservation - TripReportGeneratorTest: log entry time-range filtering, distance calculation, empty-points edge case, all narrative styles smoke-tested https://claude.ai/code/session_01YUbuZNDAoLea4cf9UGQ9qn
2026-05-20Fix Long overflow in TackDetector: var lastTackMs = Long.MIN_VALUE caused ↡Claude
subtraction overflow, filtering every tack
2026-04-06feat(tracks): persist tracks as GPX in Documents/Nav/ β€” survives uninstallPeter Stone
GpxSerializer/GpxParser: full round-trip of all TrackPoint fields via GPX 1.1 + nav: extensions namespace. 13 unit tests. TrackStorage: MediaStore on API 29+ (no permission needed), direct file I/O on API 24-28 (WRITE_EXTERNAL_STORAGE maxSdkVersion=28). TrackRepository: stopTrack() is now suspend, writes GPX and returns TrackSummary (distance nm, duration, max/avg SOG, avg wind, avg wave). getPastTracks() lazy-loads from Documents/Nav/ on first call. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06feat(ui): wire redesigned instrument sheet β€” InstrumentHandler rewrite + ↡Peter Stone
MainActivity InstrumentHandler: direction arrows (SKY/OCEAN palettes), WaveView state, metres→feet conversion, bearing formatting, all helpers top-level for TDD. MainActivity: setupHandlers wires all new view refs; observeDataSources passes cogBearingDeg, twsBearingDeg, raw metres to handler; depth collector wired from nmeaDepthDataFlow. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06feat(ui): add DirectionArrowView and WaveView custom viewsPeter Stone
DirectionArrowView: rotating notched-chevron compass indicator in SKY (grey) and OCEAN (blue) palettes, with bearing normalization. WaveView: animated swell + wind-chop canvas divider β€” sky/sea gradient fills, shimmer line, whitecap highlights; self-animates via postInvalidateOnAnimation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04refactor: unify core models and finish org.terst.nav migrationPeter Stone
2026-03-25feat: implement PDF logbook export (Section 4.8)Claudomator Agent
- LogbookEntry data class: timestampMs, lat/lon, SOG, COG, wind, baro, depth, event/notes - LogbookFormatter: UTC time, position (deg/dec-min), 16-pt compass, row/page builders - LogbookPdfExporter: landscape A4 PDF via android.graphics.pdf.PdfDocument with column headers, alternating row shading, and table border - 20 unit tests covering all formatting helpers and data model behaviour Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25feat: add harmonic tide height predictions (Section 3.2 / 4.2)Claudomator Agent
Implement offline harmonic tide prediction as specified in COMPONENT_DESIGN.md: - TideConstituent: name, speedDegPerHour, amplitudeMeters, phaseDeg - TidePrediction: timestampMs, heightMeters - TideStation: id, name, lat, lon, datumOffsetMeters, constituents - HarmonicTideCalculator: predictHeight(), predictRange(), findHighLow() Formula: h(t) = Z0 + Ξ£ [ Hi Γ— cos( Ο‰i Γ— (t βˆ’ t0) βˆ’ Ο†i ) ] - 15 unit tests covering all calculation paths Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16fix: remove duplicate _orig source files causing duplicate class compilation ↡Claudomator Agent
errors map_orig/MapFragment.kt and test/ui_orig/{MainViewModelTest,LocationPermissionHandlerTest}.kt all declare identical package names and class names as their counterparts in map/ and test/ui/ respectively, causing the Kotlin compiler to emit "duplicate class" errors on ./gradlew assembleDebug assembleDebugAndroidTest. Deleted the _orig copies; the real implementations are in map/ and test/ui/. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16Merge branch 'master' of /site/git.terst.org/repos/navPeter Stone
2026-03-16feat: add VHW boat speed parser, BoatSpeedData, and PerformanceViewModelPeter Stone
- NmeaParser: add parseVhw() for NMEA VHW (water speed) sentences, returning BoatSpeedData - NmeaStreamManager: expose nmeaBoatSpeedData SharedFlow for VHW emissions - BoatSpeedData: new sensor data class (bspKnots, timestampMs) - PerformanceViewModel + factory: new ViewModel for performance metrics - Preserve orig copies of MapFragment and UI tests for reference - Update SESSION_STATE.md and allowed tool settings Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16feat: add GribRegion and GribFile data models with staleness logicClaudomator Agent
2026-03-15feat: integrate AIS into ViewModel and MapFragment with vessel symbol layerClaudomator Agent
- MainViewModel: add _aisTargets StateFlow, processAisSentence(), refreshAisFromInternet() - AisRepository: add ingestVessel() for internet-sourced vessels - MapFragment: add AIS vessel SymbolLayer with heading-based rotation and zoom-gated labels - MainActivity: add startAisHardwareFeed() TCP stub, wire viewModel - ic_ship_arrow.xml: new vector drawable for AIS target icons - MainViewModelTest: 3 new AIS tests (processAisSentence happy path, dedup, non-AIS sentence) - JVM test harness: /tmp/ais-vm-test-runner/ β€” 3 tests GREEN Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-15feat: add AIS repository, AISHub API service, and AisHubSourceClaude Sonnet
- AisRepository: processes NMEA sentences, upserts by MMSI, merges type-5 static data, evicts stale - AisHubApiService + AisHubVessel: Retrofit/Moshi model for AISHub REST polling API - AisHubSource: converts AisHubVessel REST responses to AisVessel domain objects - 11 JUnit 5 tests all GREEN via /tmp/ais-repo-test-runner/ JVM harness Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-15feat: add AIS data model, CPA calculator, and NMEA VDM parserClaudomator Agent
- AisVessel data class (mmsi, name, callsign, lat, lon, sog, cog, heading, vesselType, timestampMs) - CpaCalculator: flat-earth CPA/TCPA algorithm (nm, min) - AisVdmParser: !AIVDM/!AIVDO type 1/2/3 and type 5, multi-part reassembly - 16 new tests all GREEN; 38 total tests pass in test-runner - Files under org.terst.nav.ais/nmea (com dir was root-owned) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-15fix: move weather feature to org/terst/nav package directoriesPeter Stone
Package declarations were already org.terst.nav.* but files lived under com/example/androidapp/. Kotlin 2.0 (K2) compiler on CI fails when package declarations don't match directory structure during kapt stub generation. Moved all 20 files to their correct locations and renamed MainActivity (weather) -> WeatherActivity to avoid confusion with the nav app's MainActivity. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14Add GpsPosition data class and NMEA RMC parser with testsClaudomator Agent
- NmeaParser: parses $GPRMC (and any *RMC) sentence β†’ GpsPosition - Null for void status (V), malformed input, non-RMC sentence - SOG/COG default to 0.0 when empty; S/W give negative lat/lon - Timestamp from HHMMSS + DDMMYY fields as Unix epoch millis UTC - No Android dependencies - GpsPositionTest: value holding and data-class equality (2 tests) - NmeaParserTest: 11 tests covering valid parse, void/malformed/empty, hemisphere signs, decimal precision - All 22 unit tests verified GREEN via kotlinc + JUnitCore Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14Add GpsProvider interface and DeviceGpsProvider (FusedLocation)Claudomator Agent
- GpsPosition: lat/lon/sog (knots)/cog (degrees true)/timestampMs - GpsProvider + GpsListener interfaces for provider abstraction - DeviceGpsProvider wraps LocationManager GPS_PROVIDER (1 Hz default) SOG: m/s Γ— 1.94384 knots; fix-lost timeout 10s - FakeGpsProvider + 9 passing JVM unit tests (no Android deps) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14Implement barometric pressure trend monitoring and visualizationClaudomator Agent