who_need_help/assets/js/map_cluster_points.test.mjs

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")
})