Some checks failed
Deploy MineGeo to Dokploy / deploy (push) Failing after 6m30s
160 lines
4.4 KiB
TypeScript
160 lines
4.4 KiB
TypeScript
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
boundsSchema,
|
|
datasetSchema,
|
|
parseUploadManifest,
|
|
scoreGuess,
|
|
} from "../shared/protocol";
|
|
const bounds = { minX: -512, minZ: -256, maxX: 512, maxZ: 256 };
|
|
test("new maps need five distinct positions, while older captures can retain duplicates", () => {
|
|
const manifest = {
|
|
format: "minegeo-dataset/v1",
|
|
minecraftVersion: "1.21.11",
|
|
dimension: "minecraft:overworld",
|
|
source: "plugin",
|
|
name: "Distinct location fixture",
|
|
serverName: "Fixture",
|
|
north: "-z",
|
|
bounds,
|
|
viewpoints: Array.from({ length: 5 }, (_, i) => ({
|
|
id: `p${i}`,
|
|
x: i - 4,
|
|
y: 65,
|
|
z: i - 4,
|
|
})),
|
|
assets: [{ path: "terrain.json.gz", sha256: "a".repeat(64), bytes: 100 }],
|
|
};
|
|
assert.equal(parseUploadManifest(manifest).viewpoints.length, 5);
|
|
const repeated = {
|
|
...manifest,
|
|
viewpoints: [
|
|
...manifest.viewpoints,
|
|
{ id: "repeat", x: -3.9, y: 65.5, z: -3.9 },
|
|
],
|
|
};
|
|
// Keep older exports usable when they already contain five distinct locations.
|
|
assert.equal(datasetSchema.safeParse(repeated).success, true);
|
|
assert.equal(parseUploadManifest(repeated).viewpoints.length, 6);
|
|
assert.throws(
|
|
() =>
|
|
parseUploadManifest({
|
|
...manifest,
|
|
viewpoints: [
|
|
...manifest.viewpoints.slice(0, 4),
|
|
repeated.viewpoints[5],
|
|
],
|
|
}),
|
|
/five panoramas from different block positions/,
|
|
);
|
|
});
|
|
test("horizontal scoring ignores elevation and handles negative coordinates", () => {
|
|
assert.equal(
|
|
scoreGuess({ x: -13, z: -25 }, { x: -13, z: -25 }, bounds).score,
|
|
5000,
|
|
);
|
|
assert.equal(scoreGuess({ x: 0, z: 0 }, { x: 1, z: 0 }, bounds).score, 5000);
|
|
assert.equal(
|
|
scoreGuess({ x: -50, z: 0 }, { x: 50, z: 0 }, bounds).distance,
|
|
100,
|
|
);
|
|
assert.ok(
|
|
scoreGuess({ x: 0, z: 0 }, { x: 100, z: 100 }, bounds).score < 5000,
|
|
);
|
|
});
|
|
test("invalid, zero, and oversized bounds cannot enter rendering", () => {
|
|
assert.equal(
|
|
boundsSchema.safeParse({ ...bounds, maxX: -512 }).success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
boundsSchema.safeParse({ ...bounds, maxX: 3000 }).success,
|
|
false,
|
|
);
|
|
assert.equal(boundsSchema.safeParse(bounds).success, true);
|
|
});
|
|
test("dataset requires five unique in-bounds viewpoints and safe paths", () => {
|
|
const base = {
|
|
format: "minegeo-dataset/v1",
|
|
minecraftVersion: "1.21.11",
|
|
dimension: "minecraft:overworld",
|
|
source: "plugin",
|
|
name: "Test map",
|
|
serverName: "Test server",
|
|
north: "-z",
|
|
bounds,
|
|
viewpoints: Array.from({ length: 5 }, (_, i) => ({
|
|
id: `p${i}`,
|
|
x: i,
|
|
y: 70,
|
|
z: i,
|
|
})),
|
|
assets: [{ path: "terrain.json.gz", sha256: "a".repeat(64), bytes: 100 }],
|
|
};
|
|
assert.equal(datasetSchema.safeParse(base).success, true);
|
|
for (const minecraftVersion of ["26.1", "26.1.1", "26.1.2", "26.2"])
|
|
assert.equal(
|
|
datasetSchema.safeParse({ ...base, minecraftVersion }).success,
|
|
true,
|
|
);
|
|
for (const minecraftVersion of [
|
|
"26.3",
|
|
"1.21.10",
|
|
"26.2-snapshot",
|
|
"../secrets",
|
|
])
|
|
assert.equal(
|
|
datasetSchema.safeParse({ ...base, minecraftVersion }).success,
|
|
false,
|
|
);
|
|
assert.equal(datasetSchema.safeParse({ ...base, assets: [] }).success, false);
|
|
assert.equal(
|
|
datasetSchema.safeParse({ ...base, source: "fabric" }).success,
|
|
false,
|
|
);
|
|
const capture = {
|
|
...base,
|
|
source: "fabric",
|
|
assets: [
|
|
"map.png",
|
|
...base.viewpoints.flatMap((point) =>
|
|
["px", "nx", "py", "ny", "pz", "nz"].map(
|
|
(face) => `${point.id}/${face}.png`,
|
|
),
|
|
),
|
|
].map((path) => ({ path, sha256: "a".repeat(64), bytes: 100 })),
|
|
};
|
|
assert.equal(datasetSchema.safeParse(capture).success, true);
|
|
assert.equal(
|
|
datasetSchema.safeParse({ ...capture, assets: capture.assets.slice(1) })
|
|
.success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
datasetSchema.safeParse({ ...base, viewpoints: base.viewpoints.slice(1) })
|
|
.success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
datasetSchema.safeParse({
|
|
...base,
|
|
assets: [{ ...base.assets[0], path: "../secrets" }],
|
|
}).success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
datasetSchema.safeParse({
|
|
...base,
|
|
viewpoints: base.viewpoints.map((p) => ({ ...p, id: "same" })),
|
|
}).success,
|
|
false,
|
|
);
|
|
assert.equal(
|
|
datasetSchema.safeParse({
|
|
...base,
|
|
viewpoints: base.viewpoints.map((p) => ({ ...p, x: 9999 })),
|
|
}).success,
|
|
false,
|
|
);
|
|
});
|