BusRefTest.java
/**
* Copyright (c) 2021, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.iidm.network;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
/**
* @author Yichen TANG {@literal <yichen.tang at rte-france.com>}
*/
class BusRefTest {
private final Bus bvBus = mock(Bus.class);
private final Bus bbvBus = mock(Bus.class);
@Test
void testIdBasedBusRef() throws JsonProcessingException {
Network network = mock(Network.class);
Network.BusView bv = mock(Network.BusView.class);
VoltageLevel vl = mock(VoltageLevel.class);
when(bbvBus.getVoltageLevel()).thenReturn(vl);
when(network.getBusView()).thenReturn(bv);
when(bv.getBus(eq("busId"))).thenReturn(bvBus);
final BusRef busRef = new IdBasedBusRef("busId");
when(network.getIdentifiable(eq("busId"))).thenReturn((Identifiable) bvBus);
when(bvBus.getId()).thenReturn("busId");
Terminal busTerminal = mock(Terminal.class);
Terminal.BusView terBusView = mock(Terminal.BusView.class);
when(busTerminal.getBusView()).thenReturn(terBusView);
when(terBusView.getBus()).thenReturn(bvBus);
final Set<Terminal> singleton = Collections.singleton(busTerminal);
final Stream mock = singleton.stream();
when(bvBus.getConnectedTerminalStream()).thenReturn(mock);
assertEquals(bvBus, busRef.resolve(network, TopologyLevel.BUS_BRANCH).orElseThrow(IllegalStateException::new));
when(network.getIdentifiable(eq("busId"))).thenReturn((Identifiable) bbvBus);
assertEquals(bbvBus, busRef.resolve(network, TopologyLevel.BUS_BREAKER).orElseThrow(IllegalStateException::new));
assertFalse(new IdBasedBusRef("another").resolve(network, TopologyLevel.BUS_BRANCH).isPresent());
ObjectMapper objectMapper = new ObjectMapper();
final String json = objectMapper.writeValueAsString(busRef);
assertEquals("{\"@c\":\".IdBasedBusRef\",\"id\":\"busId\"}", json);
final BusRef deserialized = objectMapper.readValue(json, BusRef.class);
assertEquals(busRef, deserialized);
Identifiable busbarSection = mock(BusbarSection.class);
when(network.getIdentifiable(eq("busbarId"))).thenReturn(busbarSection);
final BusbarSection bbs = (BusbarSection) busbarSection;
Terminal terminal = mock(Terminal.class);
when(bbs.getTerminal()).thenReturn(terminal);
Terminal.BusView tbv = mock(Terminal.BusView.class);
when(terminal.getBusView()).thenReturn(tbv);
when(tbv.getBus()).thenReturn(bvBus);
final IdBasedBusRef busbarRef = new IdBasedBusRef("busbarId");
assertEquals(bvBus, busbarRef.resolve(network, TopologyLevel.BUS_BRANCH).orElseThrow(IllegalStateException::new));
Terminal.BusBreakerView bbv = mock(Terminal.BusBreakerView.class);
when(terminal.getBusBreakerView()).thenReturn(bbv);
when(bbv.getBus()).thenReturn(bbvBus);
assertEquals(bbvBus, busbarRef.resolve(network, TopologyLevel.BUS_BREAKER).orElseThrow(IllegalStateException::new));
Identifiable branch = mock(Branch.class);
when(network.getIdentifiable(eq("branchId"))).thenReturn(branch);
try {
new IdBasedBusRef("branchId").resolve(network, TopologyLevel.BUS_BRANCH);
fail();
} catch (Exception e) {
assertEquals("branchId is not a bus or injection.", e.getMessage());
}
try {
new IdBasedBusRef("branchId").resolve(network, TopologyLevel.NODE_BREAKER);
fail();
} catch (Exception e) {
assertEquals("NODE_BREAKER is not supported in resolve a BusRef.", e.getMessage());
}
}
@Test
void testBranch() throws JsonProcessingException {
Network network = mock(Network.class);
Branch branch = mock(Branch.class);
when(network.getIdentifiable("branchId")).thenReturn(branch);
Terminal terminal = mock(Terminal.class);
Terminal.BusView bv = mock(Terminal.BusView.class);
when(branch.getTerminal(TwoSides.ONE)).thenReturn(terminal);
when(terminal.getBusView()).thenReturn(bv);
when(bv.getBus()).thenReturn(bvBus);
final BusRef busRef = new IdBasedBusRef("branchId", TwoSides.ONE);
assertEquals(bvBus, busRef.resolve(network, TopologyLevel.BUS_BRANCH).orElseThrow(IllegalStateException::new));
Terminal terminal2 = mock(Terminal.class);
Terminal.BusView bv2 = mock(Terminal.BusView.class);
when(branch.getTerminal(TwoSides.TWO)).thenReturn(terminal2);
when(terminal2.getBusView()).thenReturn(bv2);
Bus bus2 = mock(Bus.class);
when(bv2.getBus()).thenReturn(bus2);
final BusRef busRef2 = new IdBasedBusRef("branchId", TwoSides.TWO);
assertEquals(bus2, busRef2.resolve(network, TopologyLevel.BUS_BRANCH).orElseThrow(IllegalStateException::new));
ObjectMapper objectMapper = new ObjectMapper();
final String json = objectMapper.writeValueAsString(busRef);
assertEquals("{\"@c\":\".IdBasedBusRef\",\"id\":\"branchId\",\"side\":\"ONE\"}", json);
final BusRef deserialized = objectMapper.readValue(json, BusRef.class);
assertEquals(busRef, deserialized);
assertEquals(busRef, new IdBasedBusRef("branchId", TwoSides.ONE));
}
@Test
void testInvalidBranch() {
Network network = mock(Network.class);
when(network.getBranch("branchId")).thenReturn(null);
BusRef busRef = new IdBasedBusRef("branchId", TwoSides.TWO);
Optional<Bus> bus = busRef.resolve(network, TopologyLevel.BUS_BRANCH);
assertTrue(bus.isEmpty());
}
}