test(javaTest): freeze complete WCS grid snapshot

This commit is contained in:
zgw
2026-07-31 13:57:19 +08:00
parent a9604f99f5
commit 928b9339b1
6 changed files with 25627 additions and 2 deletions

View File

@@ -0,0 +1,43 @@
package com.ft546.wcs.shadow.history;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public final class HistoricalMapCell {
private final String siteId;
private final int x;
private final int y;
private final int z;
private final int value;
private final String axy;
private final String warehouse;
private final String spaceArea;
@JsonCreator
public HistoricalMapCell(@JsonProperty("site_id") String siteId,
@JsonProperty("x") int x,
@JsonProperty("y") int y,
@JsonProperty("z") int z,
@JsonProperty("value") int value,
@JsonProperty("axy") String axy,
@JsonProperty("warehouse") String warehouse,
@JsonProperty("space_area") String spaceArea) {
this.siteId = siteId == null ? "" : siteId;
this.x = x;
this.y = y;
this.z = z;
this.value = value;
this.axy = axy == null ? "" : axy;
this.warehouse = warehouse == null ? "" : warehouse;
this.spaceArea = spaceArea == null ? "" : spaceArea;
}
public String getSiteId() { return siteId; }
public int getX() { return x; }
public int getY() { return y; }
public int getZ() { return z; }
public int getValue() { return value; }
public String getAxy() { return axy; }
public String getWarehouse() { return warehouse; }
public String getSpaceArea() { return spaceArea; }
}

View File

@@ -11,6 +11,9 @@ import java.util.Set;
public final class HistoricalQueueDataset {
private final List<HistoricalQueueRecord> records;
private final Map<String, HistoricalMapSite> mapSiteDetails;
private final List<HistoricalMapCell> fullMapCells;
private final int fullMapRows;
private final String fullMapSha256;
private final int manifestSampleRows;
private final int fullScanTotalRows;
private final String database;
@@ -26,6 +29,8 @@ public final class HistoricalQueueDataset {
public HistoricalQueueDataset(List<HistoricalQueueRecord> records,
Map<String, HistoricalMapSite> mapSiteDetails,
List<HistoricalMapCell> fullMapCells,
int fullMapRows, String fullMapSha256,
int manifestSampleRows, int fullScanTotalRows,
String database, String sourceTable, String extractedAt,
String minCreateDate, String maxCreateDate,
@@ -35,6 +40,10 @@ public final class HistoricalQueueDataset {
this.records = Collections.unmodifiableList(new ArrayList<HistoricalQueueRecord>(records));
this.mapSiteDetails = Collections.unmodifiableMap(
new LinkedHashMap<String, HistoricalMapSite>(mapSiteDetails));
this.fullMapCells = Collections.unmodifiableList(
new ArrayList<HistoricalMapCell>(fullMapCells));
this.fullMapRows = fullMapRows;
this.fullMapSha256 = fullMapSha256;
this.manifestSampleRows = manifestSampleRows;
this.fullScanTotalRows = fullScanTotalRows;
this.database = database;
@@ -55,6 +64,9 @@ public final class HistoricalQueueDataset {
new LinkedHashSet<String>(mapSiteDetails.keySet()));
}
public Map<String, HistoricalMapSite> getMapSiteDetails() { return mapSiteDetails; }
public List<HistoricalMapCell> getFullMapCells() { return fullMapCells; }
public int getFullMapRows() { return fullMapRows; }
public String getFullMapSha256() { return fullMapSha256; }
public int getManifestSampleRows() { return manifestSampleRows; }
public int getFullScanTotalRows() { return fullScanTotalRows; }
public String getDatabase() { return database; }

View File

@@ -18,6 +18,8 @@ import java.net.URLClassLoader;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.LinkedHashSet;
import java.util.Set;
public final class HistoricalQueueLoader {
private static final ObjectMapper MAPPER = new ObjectMapper();
@@ -29,12 +31,23 @@ public final class HistoricalQueueLoader {
byte[] queueBytes = read(loader, basePath + "/queue-history-200.json");
byte[] mapBytes = read(loader, basePath + "/map-sites.json");
byte[] summaryBytes = read(loader, basePath + "/full-scan-summary.json");
byte[] fullMapBytes = read(loader, basePath + "/full-map-grid.json");
verifySha256(manifest.path("sha256").path("queue-history-200.json").asText(), queueBytes);
verifySha256(manifest.path("sha256").path("map-sites.json").asText(), mapBytes);
verifySha256(manifest.path("sha256").path("full-scan-summary.json").asText(), summaryBytes);
String fullMapSha256 = manifest.path("sha256").path("full-map-grid.json").asText();
verifySha256(fullMapSha256, fullMapBytes);
CollectionType rowsType = MAPPER.getTypeFactory()
.constructCollectionType(List.class, HistoricalQueueRecord.class);
List<HistoricalQueueRecord> rows = MAPPER.readValue(queueBytes, rowsType);
CollectionType cellsType = MAPPER.getTypeFactory()
.constructCollectionType(List.class, HistoricalMapCell.class);
List<HistoricalMapCell> fullMapCells = MAPPER.readValue(fullMapBytes, cellsType);
int fullMapRows = manifest.path("fullMapRows").asInt();
if (fullMapRows != fullMapCells.size()) {
throw new IllegalArgumentException("full map row count mismatch");
}
validatePassableCells(fullMapCells);
Map<String, HistoricalMapSite> sites =
new LinkedHashMap<String, HistoricalMapSite>();
for (JsonNode node : MAPPER.readTree(mapBytes)) {
@@ -61,7 +74,8 @@ public final class HistoricalQueueLoader {
if (totalRows != manifest.path("totalRows").asInt()) {
throw new IllegalArgumentException("history full scan row count mismatch");
}
return new HistoricalQueueDataset(rows, sites, sampleRows, totalRows,
return new HistoricalQueueDataset(rows, sites, fullMapCells,
fullMapRows, fullMapSha256, sampleRows, totalRows,
manifest.path("database").asText(), manifest.path("table").asText(),
manifest.path("extractedAt").asText(),
scanSummary.path("min_create_date").asText(),
@@ -76,6 +90,24 @@ public final class HistoricalQueueLoader {
}
}
private static void validatePassableCells(List<HistoricalMapCell> cells) {
Set<String> siteIds = new LinkedHashSet<String>();
Set<String> coordinates = new LinkedHashSet<String>();
for (HistoricalMapCell cell : cells) {
if (cell.getValue() != 1 && cell.getValue() != 2) continue;
if (cell.getSiteId().trim().isEmpty()) {
throw new IllegalArgumentException("passable full map site id must not be blank");
}
if (!siteIds.add(cell.getSiteId())) {
throw new IllegalArgumentException("duplicate passable full map site " + cell.getSiteId());
}
String coordinate = cell.getX() + "," + cell.getY() + "," + cell.getZ();
if (!coordinates.add(coordinate)) {
throw new IllegalArgumentException("duplicate passable full map coordinate " + coordinate);
}
}
}
public HistoricalQueueDataset load(Path basePath) {
if (basePath == null || basePath.getParent() == null || basePath.getParent().getParent() == null) {
throw new IllegalArgumentException("invalid history snapshot path");

View File

@@ -13,6 +13,19 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class HistoricalQueueLoaderTest {
@Test
void loadsAndVerifiesTheIndependentCompleteGridSnapshot() {
HistoricalQueueDataset data = new HistoricalQueueLoader().load(
getClass().getClassLoader(), "shadow/history");
assertEquals(2552, data.getFullMapRows());
assertEquals(2552, data.getFullMapCells().size());
assertEquals(1175, data.getFullMapCells().stream()
.filter(cell -> cell.getValue() == 1 || cell.getValue() == 2)
.count());
assertEquals(64, data.getFullMapSha256().length());
}
@Test
void loadsVersionedDatabaseSnapshotAndPreservesOriginalIds() {
HistoricalQueueDataset data = new HistoricalQueueLoader().load(

File diff suppressed because it is too large Load Diff

View File

@@ -5,10 +5,12 @@
"totalRows": 17136,
"sampleRows": 240,
"mapRows": 1129,
"fullMapRows": 2552,
"queryId": "wcs-real-queue-history-replay-v1",
"sha256": {
"queue-history-200.json": "8f06d18354c8c199906e75d4243f6d993853d48d1d956fafee36e9f828ab5a94",
"map-sites.json": "8a16f0c797f6f5e952cd07ce5a50af3a5069c6c102604c20a4e816d2aa88d08d",
"full-scan-summary.json": "9186836b0c162ea302085fab6ccaf87ffa1733a869f42d2b8bf489a910e36d63"
"full-scan-summary.json": "9186836b0c162ea302085fab6ccaf87ffa1733a869f42d2b8bf489a910e36d63",
"full-map-grid.json": "f99ce691fa1935fa2aaf4db595143f7757e9baf7b4852f2bace24248c70da7f5"
}
}