Junjie
昨天 ed266efb662c5b8460ecc22e31a070a718f35f9c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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);
    }
}