diff options
| author | Claudomator Agent <agent@claudomator> | 2026-03-16 00:03:17 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-03-25 04:54:58 +0000 |
| commit | 7193b2b3478171a49330f9cbcae5cd238a7d74d7 (patch) | |
| tree | b3cb354c953266140e36813751450d626b84066b /android-app/app/src/test/kotlin/org | |
| parent | 984f915525184a9aaff87f3d5687ef46ebb00702 (diff) | |
feat: implement PDF logbook export (Section 4.8)
- 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>
Diffstat (limited to 'android-app/app/src/test/kotlin/org')
| -rw-r--r-- | android-app/app/src/test/kotlin/org/terst/nav/data/model/LogbookEntryTest.kt | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/android-app/app/src/test/kotlin/org/terst/nav/data/model/LogbookEntryTest.kt b/android-app/app/src/test/kotlin/org/terst/nav/data/model/LogbookEntryTest.kt new file mode 100644 index 0000000..fc4580c --- /dev/null +++ b/android-app/app/src/test/kotlin/org/terst/nav/data/model/LogbookEntryTest.kt @@ -0,0 +1,67 @@ +package org.terst.nav.data.model + +import org.junit.Assert.* +import org.junit.Test + +class LogbookEntryTest { + + @Test + fun `LogbookEntry holds all required fields`() { + val entry = LogbookEntry( + timestampMs = 1_000_000L, + lat = 41.39, + lon = -71.202, + sogKnots = 6.2, + cogDegrees = 225.0, + windKnots = 15.0, + windDirectionDeg = 225.0, + baroHpa = 1018.0, + depthMeters = 14.0, + event = "Departed slip", + notes = "Crew ready" + ) + assertEquals(1_000_000L, entry.timestampMs) + assertEquals(41.39, entry.lat, 1e-9) + assertEquals(-71.202, entry.lon, 1e-9) + assertEquals(6.2, entry.sogKnots, 1e-9) + assertEquals(225.0, entry.cogDegrees, 1e-9) + assertEquals(15.0, entry.windKnots) + assertEquals(225.0, entry.windDirectionDeg) + assertEquals(1018.0, entry.baroHpa) + assertEquals(14.0, entry.depthMeters) + assertEquals("Departed slip", entry.event) + assertEquals("Crew ready", entry.notes) + } + + @Test + fun `LogbookEntry optional fields default to null`() { + val entry = LogbookEntry( + timestampMs = 0L, + lat = 0.0, + lon = 0.0, + sogKnots = 0.0, + cogDegrees = 0.0 + ) + assertNull(entry.windKnots) + assertNull(entry.windDirectionDeg) + assertNull(entry.baroHpa) + assertNull(entry.depthMeters) + assertNull(entry.event) + assertNull(entry.notes) + } + + @Test + fun `LogbookEntry data class equality`() { + val a = LogbookEntry(100L, 10.0, 20.0, 5.0, 90.0) + val b = LogbookEntry(100L, 10.0, 20.0, 5.0, 90.0) + assertEquals(a, b) + } + + @Test + fun `LogbookEntry data class copy`() { + val original = LogbookEntry(100L, 10.0, 20.0, 5.0, 90.0, event = "anchor") + val copy = original.copy(sogKnots = 3.0) + assertEquals(3.0, copy.sogKnots, 1e-9) + assertEquals("anchor", copy.event) + } +} |
