package com.zy.asrs.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.zy.asrs.domain.BasMapEditorDoc; import com.zy.asrs.domain.BasMapEditorElement; import com.zy.common.model.NavigateNode; import com.zy.common.utils.NavigateSolution; import com.zy.core.enums.MapNodeType; import org.junit.jupiter.api.Test; import org.springframework.test.util.ReflectionTestUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; class BasMapEditorServiceImplTest { @Test void compileToStoredMapData_bridgesNearlyAlignedDevpElements() { BasMapEditorServiceImpl service = new BasMapEditorServiceImpl(); BasMapEditorDoc doc = buildDoc( createDevp("left", 0.0d, 0.0d, 10.0d, 10.0d, 101, 1), createDevp("right", 11.0d, 0.5d, 10.0d, 10.0d, 102, 2) ); List>> storedData = compileStoredMapData(service, doc); List> stationMap = buildStationMap(storedData); NavigateSolution navigateSolution = new NavigateSolution(); NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, 101); NavigateNode endNode = navigateSolution.findStationNavigateNode(stationMap, 102); assertNotNull(startNode); assertNotNull(endNode); List> paths = navigateSolution.allSimplePaths(stationMap, startNode, endNode, 40, 20, 200); assertFalse(paths.isEmpty(), "轻微错位但接触边高度重合时应自动判定为联通"); } @Test void compileToStoredMapData_doesNotBridgeClearlyMisalignedDevpElements() { BasMapEditorServiceImpl service = new BasMapEditorServiceImpl(); BasMapEditorDoc doc = buildDoc( createDevp("left", 0.0d, 0.0d, 10.0d, 10.0d, 101, 1), createDevp("right", 11.0d, 4.5d, 10.0d, 10.0d, 102, 2) ); List>> storedData = compileStoredMapData(service, doc); List> stationMap = buildStationMap(storedData); NavigateSolution navigateSolution = new NavigateSolution(); NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, 101); NavigateNode endNode = navigateSolution.findStationNavigateNode(stationMap, 102); assertNotNull(startNode); assertNotNull(endNode); List> paths = navigateSolution.allSimplePaths(stationMap, startNode, endNode, 40, 20, 200); assertTrue(paths.isEmpty(), "明显错位时不应被自动桥接为联通"); } @SuppressWarnings("unchecked") private List>> compileStoredMapData(BasMapEditorServiceImpl service, BasMapEditorDoc doc) { return (List>>) ReflectionTestUtils.invokeMethod(service, "compileToStoredMapData", doc); } private BasMapEditorDoc buildDoc(BasMapEditorElement... elements) { BasMapEditorDoc doc = new BasMapEditorDoc(); doc.setLev(1); doc.setEditorMode("free-v1"); doc.setCanvasWidth(80.0d); doc.setCanvasHeight(40.0d); doc.setElements(List.of(elements)); return doc; } private BasMapEditorElement createDevp(String id, double x, double y, double width, double height, int stationId, int deviceNo) { BasMapEditorElement element = new BasMapEditorElement(); element.setId(id); element.setType("devp"); element.setX(x); element.setY(y); element.setWidth(width); element.setHeight(height); JSONObject value = new JSONObject(); value.put("stationId", stationId); value.put("deviceNo", deviceNo); value.put("direction", List.of("left", "right")); element.setValue(value.toJSONString()); return element; } private List> buildStationMap(List>> storedData) { List> stationMap = new ArrayList<>(); for (int rowIndex = 0; rowIndex < storedData.size(); rowIndex++) { List> row = storedData.get(rowIndex); List navigateNodeRow = new ArrayList<>(); for (int colIndex = 0; colIndex < row.size(); colIndex++) { HashMap cell = row.get(colIndex); NavigateNode node = new NavigateNode(rowIndex, colIndex); String nodeType = cell == null ? null : String.valueOf(cell.get("type")); String mergeType = cell == null ? null : stringValue(cell.get("mergeType")); String nodeValue = cell == null ? null : stringValue(cell.get("value")); if ("devp".equals(nodeType) || ("merge".equals(nodeType) && "devp".equals(mergeType))) { node.setValue(MapNodeType.NORMAL_PATH.id); JSONObject valueObject = JSON.parseObject(nodeValue); node.setDirectionList(valueObject == null ? new ArrayList<>() : valueObject.getJSONArray("direction").toJavaList(String.class)); } else { node.setValue(MapNodeType.DISABLE.id); } node.setNodeType(nodeType); node.setNodeValue(nodeValue); navigateNodeRow.add(node); } stationMap.add(navigateNodeRow); } return stationMap; } private String stringValue(Object value) { return value == null ? null : String.valueOf(value); } }