53 lines
1.9 KiB
JavaScript
53 lines
1.9 KiB
JavaScript
import assert from "node:assert/strict"
|
|
import test from "node:test"
|
|
|
|
import {
|
|
clusterDiameterPixels,
|
|
clusterSizeClass,
|
|
mergeNearbyMapClusters
|
|
} from "./map_cluster_points.mjs"
|
|
|
|
const flatMap = scale => ({
|
|
project: ([longitude, latitude]) => ({x: longitude * scale, y: latitude * scale}),
|
|
unproject: ([x, y]) => ({lng: x / scale, lat: y / scale})
|
|
})
|
|
|
|
test("merges visually overlapping clusters and preserves their total", () => {
|
|
const points = [
|
|
{id: "a", type: "cluster", count: 100, urgent_count: 2, longitude: 0, latitude: 0},
|
|
{id: "b", type: "cluster", count: 50, urgent_count: 1, longitude: 30, latitude: 0},
|
|
{id: "c", type: "cluster", count: 7, urgent_count: 0, longitude: 140, latitude: 0}
|
|
]
|
|
|
|
const result = mergeNearbyMapClusters(flatMap(1), points)
|
|
|
|
assert.equal(result.length, 2)
|
|
assert.equal(result.reduce((total, cluster) => total + cluster.count, 0), 157)
|
|
|
|
const merged = result.find(cluster => cluster.count === 150)
|
|
assert.equal(merged.urgent_count, 3)
|
|
assert.equal(merged.longitude, 10)
|
|
assert.equal(merged.latitude, 0)
|
|
})
|
|
|
|
test("splits the same clusters again at a closer zoom", () => {
|
|
const points = [
|
|
{id: "a", type: "cluster", count: 20, longitude: 0, latitude: 0},
|
|
{id: "b", type: "cluster", count: 30, longitude: 30, latitude: 0}
|
|
]
|
|
|
|
assert.equal(mergeNearbyMapClusters(flatMap(1), points).length, 1)
|
|
assert.equal(mergeNearbyMapClusters(flatMap(3), points).length, 2)
|
|
})
|
|
|
|
test("uses larger non-overlapping markers for larger totals", () => {
|
|
assert.equal(clusterDiameterPixels(999), 44)
|
|
assert.equal(clusterDiameterPixels(1_000), 52)
|
|
assert.equal(clusterDiameterPixels(10_000), 56)
|
|
assert.equal(clusterDiameterPixels(100_000), 60)
|
|
assert.equal(clusterSizeClass(999), "is-md")
|
|
assert.equal(clusterSizeClass(1_000), "is-lg")
|
|
assert.equal(clusterSizeClass(10_000), "is-xl")
|
|
assert.equal(clusterSizeClass(100_000), "is-xxl")
|
|
})
|