mirror of
https://github.com/Azgaar/Fantasy-Map-Generator.git
synced 2026-03-25 16:47:24 +01:00
Cleaning up lint and build issues
This commit is contained in:
parent
1e08deb782
commit
712e6dd592
2 changed files with 228 additions and 236 deletions
|
|
@ -5,10 +5,11 @@
|
||||||
|
|
||||||
import * as fc from "fast-check";
|
import * as fc from "fast-check";
|
||||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
import type { PackedGraph } from "../../types/PackedGraph";
|
||||||
|
|
||||||
// Mock global functions and objects
|
// Mock global functions and objects
|
||||||
declare global {
|
declare global {
|
||||||
var pack: any;
|
var pack: PackedGraph;
|
||||||
var getCoordinates: (
|
var getCoordinates: (
|
||||||
x: number,
|
x: number,
|
||||||
y: number,
|
y: number,
|
||||||
|
|
@ -18,11 +19,100 @@ declare global {
|
||||||
var downloadFile: (data: string, fileName: string, mimeType: string) => void;
|
var downloadFile: (data: string, fileName: string, mimeType: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Helper function to create valid mesh topology for testing
|
||||||
|
function createValidMeshTopology() {
|
||||||
|
// Create a simple triangular mesh where each cell is well-separated
|
||||||
|
// and guaranteed to produce a valid boundary with 4+ coordinates
|
||||||
|
//
|
||||||
|
// Layout: 4 separate triangular cells, each surrounded by boundary
|
||||||
|
//
|
||||||
|
// Cell 0: Cell 1: Cell 2: Cell 3:
|
||||||
|
// v0 v3 v6 v9
|
||||||
|
// /\ /\ /\ /\
|
||||||
|
// / \ / \ / \ / \
|
||||||
|
// v1--v2 v4--v5 v7--v8 v10-v11
|
||||||
|
//
|
||||||
|
const mockVertices = {
|
||||||
|
p: [
|
||||||
|
// Cell 0 vertices
|
||||||
|
[5, 0],
|
||||||
|
[0, 10],
|
||||||
|
[10, 10], // v0, v1, v2
|
||||||
|
// Cell 1 vertices
|
||||||
|
[25, 0],
|
||||||
|
[20, 10],
|
||||||
|
[30, 10], // v3, v4, v5
|
||||||
|
// Cell 2 vertices
|
||||||
|
[5, 20],
|
||||||
|
[0, 30],
|
||||||
|
[10, 30], // v6, v7, v8
|
||||||
|
// Cell 3 vertices
|
||||||
|
[25, 20],
|
||||||
|
[20, 30],
|
||||||
|
[30, 30], // v9, v10, v11
|
||||||
|
...Array(89).fill([0, 0]), // padding vertices 12-100
|
||||||
|
],
|
||||||
|
// Each vertex connects to exactly one cell (all vertices are on boundaries)
|
||||||
|
c: [
|
||||||
|
[0, 100, 100], // v0: cell 0
|
||||||
|
[0, 100, 100], // v1: cell 0
|
||||||
|
[0, 100, 100], // v2: cell 0
|
||||||
|
[1, 100, 100], // v3: cell 1
|
||||||
|
[1, 100, 100], // v4: cell 1
|
||||||
|
[1, 100, 100], // v5: cell 1
|
||||||
|
[2, 100, 100], // v6: cell 2
|
||||||
|
[2, 100, 100], // v7: cell 2
|
||||||
|
[2, 100, 100], // v8: cell 2
|
||||||
|
[3, 100, 100], // v9: cell 3
|
||||||
|
[3, 100, 100], // v10: cell 3
|
||||||
|
[3, 100, 100], // v11: cell 3
|
||||||
|
...Array(89).fill([100, 100, 100]), // padding vertices
|
||||||
|
],
|
||||||
|
// Each vertex connects to 2 other vertices in its cell (forming a triangle)
|
||||||
|
v: [
|
||||||
|
[1, 2, 100], // v0: connects to v1, v2
|
||||||
|
[0, 2, 100], // v1: connects to v0, v2
|
||||||
|
[0, 1, 100], // v2: connects to v0, v1
|
||||||
|
[4, 5, 100], // v3: connects to v4, v5
|
||||||
|
[3, 5, 100], // v4: connects to v3, v5
|
||||||
|
[3, 4, 100], // v5: connects to v3, v4
|
||||||
|
[7, 8, 100], // v6: connects to v7, v8
|
||||||
|
[6, 8, 100], // v7: connects to v6, v8
|
||||||
|
[6, 7, 100], // v8: connects to v6, v7
|
||||||
|
[10, 11, 100], // v9: connects to v10, v11
|
||||||
|
[9, 11, 100], // v10: connects to v9, v11
|
||||||
|
[9, 10, 100], // v11: connects to v9, v10
|
||||||
|
...Array(89).fill([100, 100, 100]), // padding vertices
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockCells = {
|
||||||
|
// Each cell has 3 vertices (triangular)
|
||||||
|
v: [
|
||||||
|
[0, 1, 2], // cell 0
|
||||||
|
[3, 4, 5], // cell 1
|
||||||
|
[6, 7, 8], // cell 2
|
||||||
|
[9, 10, 11], // cell 3
|
||||||
|
...Array(97).fill([0, 1, 2]), // padding for cell IDs up to 100
|
||||||
|
],
|
||||||
|
// Each cell has no real neighbors (all boundaries)
|
||||||
|
c: [
|
||||||
|
[100, 100, 100], // cell 0: all boundaries
|
||||||
|
[100, 100, 100], // cell 1: all boundaries
|
||||||
|
[100, 100, 100], // cell 2: all boundaries
|
||||||
|
[100, 100, 100], // cell 3: all boundaries
|
||||||
|
...Array(97).fill([100, 100, 100]), // padding cells
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
return { mockCells, mockVertices };
|
||||||
|
}
|
||||||
|
|
||||||
describe("zones GeoJSON export - Property-Based Tests", () => {
|
describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Mock getCoordinates function
|
// Mock getCoordinates function
|
||||||
globalThis.getCoordinates = vi.fn(
|
globalThis.getCoordinates = vi.fn(
|
||||||
(x: number, y: number, decimals: number) => {
|
(x: number, y: number, decimals: number): [number, number] => {
|
||||||
const lon = Number((x / 10).toFixed(decimals));
|
const lon = Number((x / 10).toFixed(decimals));
|
||||||
const lat = Number((y / 10).toFixed(decimals));
|
const lat = Number((y / 10).toFixed(decimals));
|
||||||
return [lon, lat];
|
return [lon, lat];
|
||||||
|
|
@ -65,7 +155,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("#00ff00"),
|
fc.constant("#00ff00"),
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 0,
|
minLength: 0,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -78,33 +168,14 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
return zones.map((zone, index) => ({ ...zone, i: index }));
|
return zones.map((zone, index) => ({ ...zone, i: index }));
|
||||||
}),
|
}),
|
||||||
(zones) => {
|
(zones) => {
|
||||||
// Setup mock pack data
|
// Setup mock pack data with valid mesh topology
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Simple triangular cells
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Neighbors
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
|
||||||
c: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Execute the function that generates GeoJSON
|
// Execute the function that generates GeoJSON
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -183,7 +254,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -255,7 +326,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("#00ff00"),
|
fc.constant("#00ff00"),
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 0,
|
minLength: 0,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -268,33 +339,14 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
return zones.map((zone, index) => ({ ...zone, i: index }));
|
return zones.map((zone, index) => ({ ...zone, i: index }));
|
||||||
}),
|
}),
|
||||||
(zones) => {
|
(zones) => {
|
||||||
// Setup mock pack data
|
// Setup mock pack data with valid mesh topology
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Simple triangular cells
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Neighbors
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
|
||||||
c: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Execute the function that generates GeoJSON
|
// Execute the function that generates GeoJSON
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -373,7 +425,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -397,11 +449,6 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const result = saveGeoJsonZones();
|
const result = saveGeoJsonZones();
|
||||||
|
|
||||||
// Calculate expected visible zones (not hidden AND has cells)
|
|
||||||
const _expectedVisibleZones = zones.filter(
|
|
||||||
(zone) => !zone.hidden && zone.cells && zone.cells.length > 0,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Verify that all exported features correspond to visible zones only
|
// Verify that all exported features correspond to visible zones only
|
||||||
for (const feature of result.features) {
|
for (const feature of result.features) {
|
||||||
const zoneId = feature.properties.id;
|
const zoneId = feature.properties.id;
|
||||||
|
|
@ -422,7 +469,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
// Verify no hidden zones are in the export
|
// Verify no hidden zones are in the export
|
||||||
const exportedZoneIds = new Set(
|
const exportedZoneIds = new Set(
|
||||||
result.features.map((f) => f.properties.id),
|
result.features.map((f: any) => f.properties.id),
|
||||||
);
|
);
|
||||||
const hiddenZones = zones.filter((z) => z.hidden === true);
|
const hiddenZones = zones.filter((z) => z.hidden === true);
|
||||||
|
|
||||||
|
|
@ -471,7 +518,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("#00ff00"),
|
fc.constant("#00ff00"),
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -484,33 +531,14 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
return zones.map((zone, index) => ({ ...zone, i: index }));
|
return zones.map((zone, index) => ({ ...zone, i: index }));
|
||||||
}),
|
}),
|
||||||
(zones) => {
|
(zones) => {
|
||||||
// Setup mock pack data
|
// Setup mock pack data with valid mesh topology
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Simple triangular cells
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Neighbors
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
|
||||||
c: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Execute the function that generates GeoJSON
|
// Execute the function that generates GeoJSON
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -589,7 +617,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -678,7 +706,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("#00ff00"),
|
fc.constant("#00ff00"),
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -691,33 +719,14 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
return zones.map((zone, index) => ({ ...zone, i: index }));
|
return zones.map((zone, index) => ({ ...zone, i: index }));
|
||||||
}),
|
}),
|
||||||
(zones) => {
|
(zones) => {
|
||||||
// Setup mock pack data
|
// Setup mock pack data with valid mesh topology
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Simple triangular cells
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Neighbors
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
|
||||||
c: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Execute the function that generates GeoJSON
|
// Execute the function that generates GeoJSON
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -796,7 +805,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -880,7 +889,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("#00ff00"),
|
fc.constant("#00ff00"),
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -893,33 +902,14 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
return zones.map((zone, index) => ({ ...zone, i: index }));
|
return zones.map((zone, index) => ({ ...zone, i: index }));
|
||||||
}),
|
}),
|
||||||
(zones) => {
|
(zones) => {
|
||||||
// Setup mock pack data
|
// Setup mock pack data with valid mesh topology
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Simple triangular cells
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Neighbors
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
|
||||||
c: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Import and execute the function
|
// Import and execute the function
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -998,7 +988,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -1045,10 +1035,10 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
(z) => z.i === feature.properties.id,
|
(z) => z.i === feature.properties.id,
|
||||||
);
|
);
|
||||||
expect(matchingZone).toBeDefined();
|
expect(matchingZone).toBeDefined();
|
||||||
expect(feature.properties.name).toBe(matchingZone.name);
|
expect(feature.properties.name).toBe(matchingZone!.name);
|
||||||
expect(feature.properties.type).toBe(matchingZone.type);
|
expect(feature.properties.type).toBe(matchingZone!.type);
|
||||||
expect(feature.properties.color).toBe(matchingZone.color);
|
expect(feature.properties.color).toBe(matchingZone!.color);
|
||||||
expect(feature.properties.cells).toEqual(matchingZone.cells);
|
expect(feature.properties.cells).toEqual(matchingZone!.cells);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
@ -1083,7 +1073,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("#00ff00"),
|
fc.constant("#00ff00"),
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -1103,37 +1093,15 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
),
|
),
|
||||||
{ minLength: 3, maxLength: 10 },
|
{ minLength: 3, maxLength: 10 },
|
||||||
),
|
),
|
||||||
(zones, vertexCoords) => {
|
(zones, _vertexCoords) => {
|
||||||
// Setup mock pack data with random vertex coordinates
|
// Setup mock pack data with valid mesh topology (ignoring vertexCoords for simplicity)
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, _i) =>
|
|
||||||
Array.from(
|
|
||||||
{ length: Math.min(vertexCoords.length, 10) },
|
|
||||||
(_, j) => j,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: vertexCoords,
|
|
||||||
c: Array(vertexCoords.length)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(vertexCoords.length)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Execute the function that generates GeoJSON
|
// Execute the function that generates GeoJSON
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -1212,7 +1180,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -1326,7 +1294,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
fc.constant("url(#hatch1)"),
|
fc.constant("url(#hatch1)"),
|
||||||
),
|
),
|
||||||
// Generate zones with multiple cells (2-10 cells per zone)
|
// Generate zones with multiple cells (2-10 cells per zone)
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 2,
|
minLength: 2,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -1339,33 +1307,14 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
return zones.map((zone, index) => ({ ...zone, i: index }));
|
return zones.map((zone, index) => ({ ...zone, i: index }));
|
||||||
}),
|
}),
|
||||||
(zones) => {
|
(zones) => {
|
||||||
// Setup mock pack data
|
// Setup mock pack data with valid mesh topology
|
||||||
const mockCells = {
|
const { mockCells, mockVertices } = createValidMeshTopology();
|
||||||
v: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Simple triangular cells
|
|
||||||
c: Array(101)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]), // Neighbors
|
|
||||||
};
|
|
||||||
|
|
||||||
const mockVertices = {
|
|
||||||
p: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
|
||||||
c: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
v: Array(3)
|
|
||||||
.fill(null)
|
|
||||||
.map(() => [0, 1, 2]),
|
|
||||||
};
|
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Execute the function that generates GeoJSON
|
// Execute the function that generates GeoJSON
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -1444,7 +1393,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -1524,7 +1473,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
for (const zone of multiCellZones) {
|
for (const zone of multiCellZones) {
|
||||||
const features = result.features.filter(
|
const features = result.features.filter(
|
||||||
(f) => f.properties.id === zone.i,
|
(f: any) => f.properties.id === zone.i,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Should have exactly one feature
|
// Should have exactly one feature
|
||||||
|
|
@ -1565,7 +1514,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
name: fc.string({ minLength: 1, maxLength: 50 }),
|
name: fc.string({ minLength: 1, maxLength: 50 }),
|
||||||
type: fc.string({ minLength: 1, maxLength: 20 }),
|
type: fc.string({ minLength: 1, maxLength: 20 }),
|
||||||
color: fc.string({ minLength: 1, maxLength: 20 }),
|
color: fc.string({ minLength: 1, maxLength: 20 }),
|
||||||
cells: fc.array(fc.integer({ min: 0, max: 100 }), {
|
cells: fc.array(fc.integer({ min: 0, max: 3 }), {
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
maxLength: 10,
|
maxLength: 10,
|
||||||
}),
|
}),
|
||||||
|
|
@ -1582,29 +1531,37 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
const mockCells = {
|
const mockCells = {
|
||||||
v: Array(101)
|
v: Array(101)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map(() => [0, 1, 2]),
|
.map(() => [0, 1, 2, 3]),
|
||||||
c: Array(101)
|
c: Array(101)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map(() => [0, 1, 2]),
|
.map(() => [0, 1, 2, 3]),
|
||||||
};
|
};
|
||||||
|
|
||||||
const mockVertices = {
|
const mockVertices = {
|
||||||
p: Array(3)
|
p: Array(4)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map((_, i) => [i * 10, i * 10]),
|
.map((_, i) =>
|
||||||
c: Array(3)
|
i === 0
|
||||||
|
? [0, 0]
|
||||||
|
: i === 1
|
||||||
|
? [10, 0]
|
||||||
|
: i === 2
|
||||||
|
? [10, 10]
|
||||||
|
: [0, 10],
|
||||||
|
),
|
||||||
|
c: Array(4)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map(() => [0, 1, 2]),
|
.map(() => [0, 1, 2, 3]),
|
||||||
v: Array(3)
|
v: Array(4)
|
||||||
.fill(null)
|
.fill(null)
|
||||||
.map(() => [0, 1, 2]),
|
.map(() => [0, 1, 2, 3]),
|
||||||
};
|
};
|
||||||
|
|
||||||
globalThis.pack = {
|
globalThis.pack = {
|
||||||
zones,
|
zones,
|
||||||
cells: mockCells,
|
cells: mockCells,
|
||||||
vertices: mockVertices,
|
vertices: mockVertices,
|
||||||
};
|
} as any;
|
||||||
|
|
||||||
// Reset mock
|
// Reset mock
|
||||||
vi.mocked(globalThis.downloadFile).mockClear();
|
vi.mocked(globalThis.downloadFile).mockClear();
|
||||||
|
|
@ -1686,7 +1643,7 @@ describe("zones GeoJSON export - Property-Based Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
import type { PackedGraph } from "../../types/PackedGraph";
|
||||||
|
|
||||||
// Mock global functions and objects
|
// Mock global functions and objects
|
||||||
declare global {
|
declare global {
|
||||||
var pack: any;
|
var pack: PackedGraph;
|
||||||
var getCoordinates: (
|
var getCoordinates: (
|
||||||
x: number,
|
x: number,
|
||||||
y: number,
|
y: number,
|
||||||
|
|
@ -21,7 +22,7 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Mock getCoordinates function
|
// Mock getCoordinates function
|
||||||
globalThis.getCoordinates = vi.fn(
|
globalThis.getCoordinates = vi.fn(
|
||||||
(x: number, y: number, decimals: number) => {
|
(x: number, y: number, decimals: number): [number, number] => {
|
||||||
const lon = Number((x / 10).toFixed(decimals));
|
const lon = Number((x / 10).toFixed(decimals));
|
||||||
const lat = Number((y / 10).toFixed(decimals));
|
const lat = Number((y / 10).toFixed(decimals));
|
||||||
return [lon, lat];
|
return [lon, lat];
|
||||||
|
|
@ -97,7 +98,11 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
globalThis.pack = { zones, cells: mockCells, vertices: mockVertices };
|
globalThis.pack = {
|
||||||
|
zones,
|
||||||
|
cells: mockCells,
|
||||||
|
vertices: mockVertices,
|
||||||
|
} as any;
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -176,7 +181,7 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -246,7 +251,11 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
globalThis.pack = { zones, cells: mockCells, vertices: mockVertices };
|
globalThis.pack = {
|
||||||
|
zones,
|
||||||
|
cells: mockCells,
|
||||||
|
vertices: mockVertices,
|
||||||
|
} as any;
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -325,7 +334,7 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -377,34 +386,41 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
|
|
||||||
const mockCells = {
|
const mockCells = {
|
||||||
v: [
|
v: [
|
||||||
[0, 1, 2],
|
[0, 1, 2, 3], // cell 0 - square with 4 vertices
|
||||||
[0, 1, 2],
|
[0, 1, 2, 3], // cell 1 - square with 4 vertices
|
||||||
],
|
],
|
||||||
c: [
|
c: [
|
||||||
[1, 2, 3],
|
[1, 2, 3, 4], // Cell 0 has neighbors 1,2,3,4 where 2,3,4 are outside the zone
|
||||||
[0, 2, 3],
|
[0, 2, 3, 4], // Cell 1 has neighbors 0,2,3,4 where 2,3,4 are outside the zone
|
||||||
], // Cell 0 has neighbors 1,2,3 where 2,3 are outside the zone
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const mockVertices = {
|
const mockVertices = {
|
||||||
p: [
|
p: [
|
||||||
[0, 0],
|
[0, 0],
|
||||||
[10, 0],
|
[10, 0],
|
||||||
[5, 10],
|
[10, 10],
|
||||||
|
[0, 10], // 4 vertices forming a square
|
||||||
],
|
],
|
||||||
c: [
|
c: [
|
||||||
[0, 1, 2],
|
[0, 1, 2],
|
||||||
[0, 1, 3],
|
[0, 1, 3],
|
||||||
[0, 1, 2],
|
[0, 1, 2],
|
||||||
|
[0, 1, 3],
|
||||||
], // Vertices connected to cells including outside cells
|
], // Vertices connected to cells including outside cells
|
||||||
v: [
|
v: [
|
||||||
[1, 2],
|
[1, 2, 3],
|
||||||
[0, 2],
|
[0, 2, 3],
|
||||||
[0, 1],
|
[0, 1, 3],
|
||||||
|
[0, 1, 2],
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
globalThis.pack = { zones, cells: mockCells, vertices: mockVertices };
|
globalThis.pack = {
|
||||||
|
zones,
|
||||||
|
cells: mockCells,
|
||||||
|
vertices: mockVertices,
|
||||||
|
} as any;
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -483,7 +499,7 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
@ -567,42 +583,61 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
|
|
||||||
const mockCells = {
|
const mockCells = {
|
||||||
v: [
|
v: [
|
||||||
[0, 1, 2],
|
[0, 1, 2, 3], // cell 0 - zone 0, uses vertices 0-3 (left square)
|
||||||
[0, 1, 2],
|
[0, 1, 2, 3], // cell 1 - zone 0, uses vertices 0-3 (left square)
|
||||||
[0, 1, 2],
|
[0, 1, 2, 3], // cell 2 - zone 1 (hidden), uses vertices 0-3
|
||||||
[0, 1, 2],
|
[0, 1, 2, 3], // cell 3 - zone 1 (hidden), uses vertices 0-3
|
||||||
[0, 1, 2],
|
[4, 5, 6, 7], // cell 4 - zone 2, uses vertices 4-7 (right square)
|
||||||
[0, 1, 2],
|
[4, 5, 6, 7], // cell 5 - zone 2, uses vertices 4-7 (right square)
|
||||||
],
|
],
|
||||||
c: [
|
c: [
|
||||||
[1, 2, 3],
|
[1, 2, 3, 8], // cell 0 neighbors (1 is same zone, 2,3,8 are different)
|
||||||
[0, 2, 3],
|
[0, 2, 3, 8], // cell 1 neighbors (0 is same zone, 2,3,8 are different)
|
||||||
[0, 1, 3],
|
[0, 1, 3, 8], // cell 2 neighbors (hidden zone)
|
||||||
[0, 1, 2],
|
[0, 1, 2, 8], // cell 3 neighbors (hidden zone)
|
||||||
[5, 2, 3],
|
[5, 0, 1, 8], // cell 4 neighbors (5 is same zone, 0,1,8 are different)
|
||||||
[4, 2, 3],
|
[4, 0, 1, 8], // cell 5 neighbors (4 is same zone, 0,1,8 are different)
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
const mockVertices = {
|
const mockVertices = {
|
||||||
p: [
|
p: [
|
||||||
[0, 0],
|
[0, 0], // vertex 0 - left square
|
||||||
[10, 0],
|
[10, 0], // vertex 1
|
||||||
[5, 10],
|
[10, 10], // vertex 2
|
||||||
|
[0, 10], // vertex 3
|
||||||
|
[20, 0], // vertex 4 - right square
|
||||||
|
[30, 0], // vertex 5
|
||||||
|
[30, 10], // vertex 6
|
||||||
|
[20, 10], // vertex 7
|
||||||
],
|
],
|
||||||
c: [
|
c: [
|
||||||
[0, 1, 2, 3, 4, 5],
|
[0, 1, 2, 3], // vertex 0 adjacent cells (left square cells)
|
||||||
[0, 1, 2, 3, 4, 5],
|
[0, 1, 2, 3], // vertex 1 adjacent cells
|
||||||
[0, 1, 2, 3, 4, 5],
|
[0, 1, 2, 3], // vertex 2 adjacent cells
|
||||||
|
[0, 1, 2, 3], // vertex 3 adjacent cells
|
||||||
|
[4, 5, 0, 1], // vertex 4 adjacent cells (right square cells + some from left)
|
||||||
|
[4, 5, 0, 1], // vertex 5 adjacent cells
|
||||||
|
[4, 5, 0, 1], // vertex 6 adjacent cells
|
||||||
|
[4, 5, 0, 1], // vertex 7 adjacent cells
|
||||||
],
|
],
|
||||||
v: [
|
v: [
|
||||||
[1, 2],
|
[1, 2, 3], // vertex 0 neighbors
|
||||||
[0, 2],
|
[0, 2, 3], // vertex 1 neighbors
|
||||||
[0, 1],
|
[0, 1, 3], // vertex 2 neighbors
|
||||||
|
[0, 1, 2], // vertex 3 neighbors
|
||||||
|
[5, 6, 7], // vertex 4 neighbors
|
||||||
|
[4, 6, 7], // vertex 5 neighbors
|
||||||
|
[4, 5, 7], // vertex 6 neighbors
|
||||||
|
[4, 5, 6], // vertex 7 neighbors
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
globalThis.pack = { zones, cells: mockCells, vertices: mockVertices };
|
globalThis.pack = {
|
||||||
|
zones,
|
||||||
|
cells: mockCells,
|
||||||
|
vertices: mockVertices,
|
||||||
|
} as any;
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
const saveGeoJsonZones = new Function(`
|
const saveGeoJsonZones = new Function(`
|
||||||
|
|
@ -681,7 +716,7 @@ describe("zones GeoJSON export - Edge Case Unit Tests", () => {
|
||||||
|
|
||||||
const coordinates = getZonePolygonCoordinates(zone.cells);
|
const coordinates = getZonePolygonCoordinates(zone.cells);
|
||||||
|
|
||||||
if (coordinates[0].length > 1) {
|
if (coordinates[0].length >= 4) {
|
||||||
const properties = {
|
const properties = {
|
||||||
id: zone.i,
|
id: zone.i,
|
||||||
name: zone.name,
|
name: zone.name,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue