166 lines
4.7 KiB
JavaScript
166 lines
4.7 KiB
JavaScript
import assert from "node:assert/strict"
|
|
import test from "node:test"
|
|
|
|
import {
|
|
clusterCountLabel,
|
|
clusterExpansionCenter,
|
|
clusterExpansionTarget,
|
|
clusterIconDescriptor,
|
|
clusterSizeClass,
|
|
pointFeatureCollection,
|
|
pointSourceOptions,
|
|
serverClusterDescriptor
|
|
} from "./map_cluster_features.mjs"
|
|
|
|
test("cluster icon descriptors are stable and encode visual state", () => {
|
|
assert.deepEqual(clusterIconDescriptor({count: 999, urgent_count: 0}, "en"), {
|
|
id: "wnh-cluster-normal-44-39-39-39",
|
|
count: 999,
|
|
urgent: false,
|
|
label: "999",
|
|
diameter: 44
|
|
})
|
|
|
|
assert.deepEqual(clusterIconDescriptor({count: 12_500, urgent_count: 2}, "en"), {
|
|
id: "wnh-cluster-urgent-56-31-33-4b",
|
|
count: 12_500,
|
|
urgent: true,
|
|
label: "13K",
|
|
diameter: 56
|
|
})
|
|
})
|
|
|
|
test("server hierarchy metadata survives GeoJSON conversion without becoming a native cluster", () => {
|
|
const feature = pointFeatureCollection([
|
|
{
|
|
id: "request:11:1197:1378",
|
|
type: "cluster",
|
|
cluster_id: "request:11:1197:1378",
|
|
parent_cluster_id: "request:10:598:689",
|
|
hierarchy_level: 11,
|
|
expansion_zoom: 13,
|
|
longitude: 30.52,
|
|
latitude: 50.45,
|
|
count: 27
|
|
}
|
|
]).features[0]
|
|
|
|
assert.equal(feature.properties.server_cluster_id, "request:11:1197:1378")
|
|
assert.equal(feature.properties.parent_cluster_id, "request:10:598:689")
|
|
assert.equal(feature.properties.hierarchy_level, 11)
|
|
assert.equal(feature.properties.expansion_zoom, 13)
|
|
assert.equal(feature.properties.weight, 27)
|
|
assert.equal(feature.properties.count_label, "27")
|
|
assert.equal(feature.properties.cluster_icon, "wnh-cluster-normal-44-32-37")
|
|
assert.equal("point_count" in feature.properties, false)
|
|
})
|
|
|
|
test("browser source leaves server hierarchy nodes unclustered", () => {
|
|
const collection = pointFeatureCollection([
|
|
{
|
|
id: "request:11:1197:1378",
|
|
type: "cluster",
|
|
longitude: 30.52,
|
|
latitude: 50.45,
|
|
count: 27
|
|
}
|
|
])
|
|
const source = pointSourceOptions(collection)
|
|
|
|
assert.equal(source.cluster, false)
|
|
assert.equal(source.data, collection)
|
|
})
|
|
|
|
test("cluster size classes remain stable for accessible count buttons", () => {
|
|
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")
|
|
})
|
|
|
|
test("large visual counts are compact while exact values remain available to accessibility text", () => {
|
|
assert.equal(clusterCountLabel(999, "en"), "999")
|
|
assert.equal(clusterCountLabel(1_250, "en"), "1.3K")
|
|
assert.equal(clusterCountLabel(48_533, "en"), "49K")
|
|
assert.equal(clusterCountLabel(1_000_000, "en"), "1M")
|
|
})
|
|
|
|
test("server cluster count labels are compacted before rendering", () => {
|
|
const feature = pointFeatureCollection([
|
|
{
|
|
id: "request:12:2402:2406",
|
|
type: "cluster",
|
|
longitude: 31.3,
|
|
latitude: 30.2,
|
|
count: 48_533
|
|
}
|
|
], "en").features[0]
|
|
|
|
assert.equal(feature.properties.count_label, "49K")
|
|
})
|
|
|
|
test("only server hierarchy nodes become cluster markers", () => {
|
|
assert.deepEqual(
|
|
serverClusterDescriptor({
|
|
id: "request:12:2402:2406",
|
|
type: "cluster",
|
|
longitude: 31.3,
|
|
latitude: 30.2,
|
|
count: 1_727,
|
|
urgent_count: 8
|
|
}),
|
|
{
|
|
key: "server:request:12:2402:2406",
|
|
count: 1_727,
|
|
urgentCount: 8,
|
|
longitude: 31.3,
|
|
latitude: 30.2
|
|
}
|
|
)
|
|
assert.equal(
|
|
serverClusterDescriptor({
|
|
id: "request-1",
|
|
type: "request",
|
|
longitude: 31.3,
|
|
latitude: 30.2
|
|
}),
|
|
null
|
|
)
|
|
})
|
|
|
|
test("cluster expansion always advances at least one integer zoom level", () => {
|
|
assert.equal(clusterExpansionTarget(9, 9), 10)
|
|
assert.equal(clusterExpansionTarget(8.999_999_096_835_52, 9), 10)
|
|
assert.equal(clusterExpansionTarget(10.999_994_193_019_71, 11), 12)
|
|
assert.equal(clusterExpansionTarget(9.6, 10), 10)
|
|
assert.equal(clusterExpansionTarget(9.6, 13), 13)
|
|
assert.equal(clusterExpansionTarget(21.9, 24), 22)
|
|
})
|
|
|
|
test("cluster expansion centers on actual member bounds instead of the display cell", () => {
|
|
const [longitude, latitude] = clusterExpansionCenter({
|
|
longitude: 30.4,
|
|
latitude: 50.6,
|
|
bounds: {west: 30.51, south: 50.44, east: 30.53, north: 50.46}
|
|
})
|
|
|
|
assert.ok(Math.abs(longitude - 30.52) <= Number.EPSILON * 32)
|
|
assert.ok(Math.abs(latitude - 50.45) <= Number.EPSILON * 32)
|
|
|
|
assert.deepEqual(
|
|
clusterExpansionCenter({
|
|
longitude: 179,
|
|
latitude: 10,
|
|
bounds: {west: 179.5, south: 9, east: -179.5, north: 11}
|
|
}),
|
|
[180, 10]
|
|
)
|
|
})
|
|
|
|
test("cluster expansion falls back to the display point without valid bounds", () => {
|
|
assert.deepEqual(
|
|
clusterExpansionCenter({longitude: 30.52, latitude: 50.45}),
|
|
[30.52, 50.45]
|
|
)
|
|
})
|