Add per-day map coloring and remaining unit tests

- RouteMapThumbnail: Color route segments per day with alternating colors
  when dayBreaks are present, pass through from route detail page
- overnight.test.ts: 6 tests for isOvernight/setOvernight with Y.Doc
- daybreaks-extraction.test.ts: 3 tests for GPX → dayBreaks index extraction

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ullrich Schäfer 2026-04-11 00:12:27 +02:00
parent 77174f192d
commit 5604fe1c82
No known key found for this signature in database
GPG key ID: A32FF691A0F752D9
5 changed files with 208 additions and 6 deletions

View file

@ -0,0 +1,68 @@
import { describe, it, expect } from "vitest";
import { generateGpx } from "./generate.ts";
import { parseGpxAsync } from "./parse.ts";
/**
* Tests the dayBreaks extraction pattern used by the Journal's updateRoute:
* parse GPX find waypoints with isDayBreak extract indices
*/
describe("dayBreaks extraction from GPX", () => {
it("extracts empty dayBreaks when no overnight waypoints", async () => {
const gpx = generateGpx({
waypoints: [
{ lat: 52.52, lon: 13.405, name: "Berlin" },
{ lat: 50.98, lon: 11.028, name: "Erfurt" },
],
tracks: [[
{ lat: 52.52, lon: 13.405, ele: 34 },
{ lat: 50.98, lon: 11.028, ele: 195 },
]],
});
const parsed = await parseGpxAsync(gpx);
const dayBreaks = parsed.waypoints
.map((w, i) => (w.isDayBreak ? i : -1))
.filter((i) => i >= 0);
expect(dayBreaks).toEqual([]);
});
it("extracts single dayBreak index", async () => {
const gpx = generateGpx({
waypoints: [
{ lat: 52.52, lon: 13.405, name: "Berlin" },
{ lat: 51.84, lon: 12.243, name: "Dessau", isDayBreak: true },
{ lat: 50.98, lon: 11.028, name: "Erfurt" },
],
tracks: [[
{ lat: 52.52, lon: 13.405, ele: 34 },
{ lat: 51.84, lon: 12.243, ele: 80 },
{ lat: 50.98, lon: 11.028, ele: 195 },
]],
});
const parsed = await parseGpxAsync(gpx);
const dayBreaks = parsed.waypoints
.map((w, i) => (w.isDayBreak ? i : -1))
.filter((i) => i >= 0);
expect(dayBreaks).toEqual([1]);
});
it("extracts multiple dayBreak indices", async () => {
const gpx = generateGpx({
waypoints: [
{ lat: 0, lon: 0, name: "A" },
{ lat: 1, lon: 0, name: "B", isDayBreak: true },
{ lat: 2, lon: 0, name: "C" },
{ lat: 3, lon: 0, name: "D", isDayBreak: true },
{ lat: 4, lon: 0, name: "E" },
],
tracks: [[
{ lat: 0, lon: 0 }, { lat: 1, lon: 0 }, { lat: 2, lon: 0 },
{ lat: 3, lon: 0 }, { lat: 4, lon: 0 },
]],
});
const parsed = await parseGpxAsync(gpx);
const dayBreaks = parsed.waypoints
.map((w, i) => (w.isDayBreak ? i : -1))
.filter((i) => i >= 0);
expect(dayBreaks).toEqual([1, 3]);
});
});