import { describe, it, expect } from "vitest"; import { generateGpx } from "./generate.ts"; import { parseGpx } from "./parse.ts"; describe("generateGpx", () => { it("generates valid GPX with name", () => { const gpx = generateGpx({ name: "Test Route" }); expect(gpx).toContain('Test Route"); expect(gpx).toContain(""); }); it("generates waypoints", () => { const gpx = generateGpx({ waypoints: [ { lat: 52.52, lon: 13.405, name: "Berlin" }, { lat: 48.137, lon: 11.576 }, ], }); expect(gpx).toContain('wpt lat="52.52" lon="13.405"'); expect(gpx).toContain("Berlin"); expect(gpx).toContain('wpt lat="48.137" lon="11.576"'); }); it("generates track points with elevation", () => { const gpx = generateGpx({ tracks: [[{ lat: 52.52, lon: 13.405, ele: 34 }, { lat: 48.137, lon: 11.576, ele: 519 }]], }); expect(gpx).toContain(""); expect(gpx).toContain(''); expect(gpx).toContain("34"); }); it("escapes XML special characters in names", () => { const gpx = generateGpx({ name: "Route & B" }); expect(gpx).toContain("Route <A> & B"); }); it("produces round-trippable GPX", () => { const original = generateGpx({ name: "Round Trip", waypoints: [{ lat: 52.52, lon: 13.405, name: "Start" }], tracks: [[{ lat: 52.52, lon: 13.405, ele: 34 }, { lat: 48.137, lon: 11.576, ele: 519 }]], }); const parsed = parseGpx(original); expect(parsed.name).toBe("Round Trip"); expect(parsed.waypoints).toHaveLength(1); expect(parsed.waypoints[0]!.name).toBe("Start"); expect(parsed.tracks[0]).toHaveLength(2); }); });