import { pointInPolygon, findZoneForPoint } from "./geo.js"; const square = { type: "Polygon", coordinates: [[ [0, 0], [10, 0], [10, 10], [0, 10], [0, 0], ]], }; const concave = { type: "Polygon", coordinates: [[ [0, 0], [10, 0], [10, 10], [5, 5], [0, 10], [0, 0], ]], }; describe("pointInPolygon", () => { it("returns true para un punto dentro de un cuadrado", () => { expect(pointInPolygon(5, 5, square)).toBe(true); }); it("returns false para un punto fuera del cuadrado", () => { expect(pointInPolygon(15, 5, square)).toBe(false); expect(pointInPolygon(-1, 5, square)).toBe(false); expect(pointInPolygon(5, 20, square)).toBe(false); }); it("maneja polígonos cóncavos (excluye el dent del centro)", () => { // (5, 8) cae dentro del notch — fuera del polígono cóncavo. expect(pointInPolygon(5, 8, concave)).toBe(false); // (2, 2) sigue dentro. expect(pointInPolygon(2, 2, concave)).toBe(true); }); it("returns false para input inválido", () => { expect(pointInPolygon(0, 0, null)).toBe(false); expect(pointInPolygon(0, 0, { type: "Point" })).toBe(false); expect(pointInPolygon(0, 0, { type: "Polygon", coordinates: [[[0, 0], [1, 1]]] })).toBe(false); }); it("trabaja con coordenadas reales de CABA (lng, lat)", () => { // Polígono cuadrado pequeño alrededor del Obelisco. const obeliscoBox = { type: "Polygon", coordinates: [[ [-58.39, -34.61], [-58.37, -34.61], [-58.37, -34.60], [-58.39, -34.60], [-58.39, -34.61], ]], }; // Obelisco aprox: -58.3816, -34.6037 expect(pointInPolygon(-58.3816, -34.6037, obeliscoBox)).toBe(true); // Mar del Plata expect(pointInPolygon(-57.55, -38.0, obeliscoBox)).toBe(false); }); }); describe("findZoneForPoint", () => { const zones = [ { id: "centro", name: "Centro", polygon: square, enabled: true, delivery_cost: 1500 }, { id: "norte", name: "Norte", enabled: true, polygon: { type: "Polygon", coordinates: [[[20, 20], [30, 20], [30, 30], [20, 30], [20, 20]]], }, delivery_cost: 2000, }, ]; it("devuelve la zona que contiene al punto", () => { const z = findZoneForPoint(5, 5, zones); expect(z?.id).toBe("centro"); }); it("devuelve null si ningún polígono contiene al punto", () => { expect(findZoneForPoint(15, 15, zones)).toBeNull(); }); it("ignora zonas con enabled=false", () => { const muted = zones.map((z) => ({ ...z, enabled: z.id === "centro" ? false : z.enabled })); expect(findZoneForPoint(5, 5, muted)).toBeNull(); }); it("tolera input inválido", () => { expect(findZoneForPoint(0, 0, null)).toBeNull(); expect(findZoneForPoint(0, 0, [])).toBeNull(); expect(findZoneForPoint(0, 0, [{ id: "x" }])).toBeNull(); }); });