import { describe, it, expect } from "vitest";
import { parseGpxAsync } from "./parse.ts";
const sampleGpx = `
34
113
519
`;
describe("GPX to geometry coordinates", () => {
it("extracts [lon, lat] coordinates from track points", async () => {
const gpxData = await parseGpxAsync(sampleGpx);
const coords = gpxData.tracks.flat().map((p) => [p.lon, p.lat] as [number, number]);
expect(coords).toHaveLength(3);
// GeoJSON order: [lon, lat]
expect(coords[0]).toEqual([13.405, 52.52]);
expect(coords[1]).toEqual([13.74, 51.05]);
expect(coords[2]).toEqual([11.576, 48.137]);
});
it("produces valid GeoJSON LineString", async () => {
const gpxData = await parseGpxAsync(sampleGpx);
const coords = gpxData.tracks.flat().map((p) => [p.lon, p.lat] as [number, number]);
const geojson = { type: "LineString", coordinates: coords };
expect(geojson.type).toBe("LineString");
expect(geojson.coordinates).toHaveLength(3);
// Verify serialization doesn't throw
expect(() => JSON.stringify(geojson)).not.toThrow();
});
it("handles empty GPX gracefully", async () => {
const emptyGpx = `
`;
const gpxData = await parseGpxAsync(emptyGpx);
const coords = gpxData.tracks.flat().map((p) => [p.lon, p.lat] as [number, number]);
expect(coords).toHaveLength(0);
});
it("handles single point (insufficient for LineString)", async () => {
const singlePointGpx = `
34
`;
const gpxData = await parseGpxAsync(singlePointGpx);
const coords = gpxData.tracks.flat().map((p) => [p.lon, p.lat] as [number, number]);
expect(coords).toHaveLength(1);
// Caller should check coords.length >= 2 before creating LineString
});
});