package com.zy.ai.service; import com.zy.ai.domain.autotune.AutoTuneFlowTopologyItem; import com.zy.ai.domain.autotune.AutoTuneStationRuntimeItem; import com.zy.ai.service.impl.FlowTopologySnapshotServiceImpl; import com.zy.asrs.entity.StationFlowCapacity; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; class FlowTopologySnapshotServiceImplTest { @Test void buildTopologyItemUsesExplicitDirectionAndTargetStation() { FlowTopologySnapshotServiceImpl service = new FlowTopologySnapshotServiceImpl(); StationFlowCapacity capacity = capacity(101, "OUT", 3); Map> adjacency = new LinkedHashMap<>(); adjacency.put(101, Arrays.asList(103, 102)); AutoTuneFlowTopologyItem item = service.buildTopologyItem( capacity, adjacency, Arrays.asList(runtime(101, 1, 0, 0), runtime(102, 1, 1, 0)) ); assertEquals(101, item.getTargetStationId()); assertEquals("OUT", item.getDirection()); assertEquals(Arrays.asList(102, 103), item.getUpstreamStationIds()); assertEquals(Arrays.asList(102, 103), item.getDownstreamStationIds()); assertEquals(Arrays.asList(101, 102, 103), item.getFlowStationIds()); } @Test void calculateRuntimeCountsUsesOnlyAutoingLoadingAndTaskNo() { FlowTopologySnapshotServiceImpl service = new FlowTopologySnapshotServiceImpl(); List runtimeItems = Arrays.asList( runtime(101, 0, 0, 0), runtime(102, 1, 1, 0), runtime(103, 1, 0, 9001), runtime(104, 0, 1, 9002) ); FlowTopologySnapshotServiceImpl.RuntimeCount count = service.calculateRuntimeCount(runtimeItems); assertEquals(3, count.getOccupiedCount()); assertEquals(2, count.getNonAutoingCount()); assertEquals(2, count.getLoadingCount()); assertEquals(2, count.getTaskHoldingCount()); } @Test void findCapacityUsesStationIdAndDirectionCode() { FlowTopologySnapshotServiceImpl service = new FlowTopologySnapshotServiceImpl(); List capacities = Arrays.asList( capacity(101, "IN", 2), capacity(101, "OUT", 4), capacity(102, "OUT", 8) ); StationFlowCapacity result = service.findCapacity(capacities, 101, "OUT"); assertNotNull(result); assertEquals(4, result.getBufferCapacity()); assertEquals("OUT", result.getDirectionCode()); } @Test void flowStationIdsAndCountsAreNotTruncatedByBufferCapacity() { FlowTopologySnapshotServiceImpl service = new FlowTopologySnapshotServiceImpl(); StationFlowCapacity capacity = capacity(101, "OUT", 1); Map> adjacency = new LinkedHashMap<>(); adjacency.put(101, Arrays.asList(104, 102, 103)); AutoTuneFlowTopologyItem item = service.buildTopologyItem( capacity, adjacency, Arrays.asList( runtime(101, 1, 0, 0), runtime(102, 1, 1, 0), runtime(103, 1, 0, 9001), runtime(104, 0, 0, 0) ) ); assertEquals(Arrays.asList(101, 102, 103, 104), item.getFlowStationIds()); assertEquals(2, item.getOccupiedCount()); assertEquals(1, item.getLoadingCount()); assertEquals(1, item.getTaskHoldingCount()); assertEquals(1, item.getNonAutoingCount()); assertEquals(0, item.getFreeCount()); } private StationFlowCapacity capacity(Integer stationId, String directionCode, Integer bufferCapacity) { StationFlowCapacity capacity = new StationFlowCapacity(); capacity.setStationId(stationId); capacity.setDirectionCode(directionCode); capacity.setBufferCapacity(bufferCapacity); return capacity; } private AutoTuneStationRuntimeItem runtime(Integer stationId, Integer autoing, Integer loading, Integer taskNo) { AutoTuneStationRuntimeItem item = new AutoTuneStationRuntimeItem(); item.setStationId(stationId); item.setAutoing(autoing); item.setLoading(loading); item.setTaskNo(taskNo); return item; } }