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<List<HashMap<String, Object>>> storedData = compileStoredMapData(service, doc);
|
List<List<NavigateNode>> stationMap = buildStationMap(storedData);
|
NavigateSolution navigateSolution = new NavigateSolution();
|
|
NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, 101);
|
NavigateNode endNode = navigateSolution.findStationNavigateNode(stationMap, 102);
|
assertNotNull(startNode);
|
assertNotNull(endNode);
|
|
List<List<NavigateNode>> 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<List<HashMap<String, Object>>> storedData = compileStoredMapData(service, doc);
|
List<List<NavigateNode>> stationMap = buildStationMap(storedData);
|
NavigateSolution navigateSolution = new NavigateSolution();
|
|
NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, 101);
|
NavigateNode endNode = navigateSolution.findStationNavigateNode(stationMap, 102);
|
assertNotNull(startNode);
|
assertNotNull(endNode);
|
|
List<List<NavigateNode>> paths = navigateSolution.allSimplePaths(stationMap, startNode, endNode, 40, 20, 200);
|
assertTrue(paths.isEmpty(), "明显错位时不应被自动桥接为联通");
|
}
|
|
@SuppressWarnings("unchecked")
|
private List<List<HashMap<String, Object>>> compileStoredMapData(BasMapEditorServiceImpl service, BasMapEditorDoc doc) {
|
return (List<List<HashMap<String, Object>>>) 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<List<NavigateNode>> buildStationMap(List<List<HashMap<String, Object>>> storedData) {
|
List<List<NavigateNode>> stationMap = new ArrayList<>();
|
for (int rowIndex = 0; rowIndex < storedData.size(); rowIndex++) {
|
List<HashMap<String, Object>> row = storedData.get(rowIndex);
|
List<NavigateNode> navigateNodeRow = new ArrayList<>();
|
for (int colIndex = 0; colIndex < row.size(); colIndex++) {
|
HashMap<String, Object> 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);
|
}
|
}
|