GraphMetadataTest.java

/**
 * Copyright (c) 2019, 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.sld.svg;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import com.powsybl.commons.json.JsonUtil;
import com.powsybl.sld.layout.LayoutParameters;
import com.powsybl.sld.library.AnchorOrientation;
import com.powsybl.sld.library.AnchorPoint;
import com.powsybl.sld.library.Component;
import com.powsybl.sld.library.ComponentSize;
import com.powsybl.sld.model.coordinate.Direction;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;

import static com.powsybl.sld.library.ComponentTypeName.*;

/**
 * @author Benoit Jeanson {@literal <benoit.jeanson at rte-france.com>}
 * @author Nicolas Duchene
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 * @author Franck Lecuyer {@literal <franck.lecuyer at rte-france.com>}
 */
class GraphMetadataTest {

    private FileSystem fileSystem;
    private Path tmpDir;

    @BeforeEach
    public void setUp() throws IOException {
        fileSystem = Jimfs.newFileSystem(Configuration.unix());
        tmpDir = Files.createDirectory(fileSystem.getPath("/tmp"));
    }

    @AfterEach
    public void tearDown() throws Exception {
        fileSystem.close();
    }

    @Test
    void test() throws IOException {
        GraphMetadata metadata = new GraphMetadata(new LayoutParameters(), new SvgParameters());
        metadata.addComponent(new Component(BREAKER, ImmutableList.of(new AnchorPoint(5, 4, AnchorOrientation.NONE)),
            new ComponentSize(10, 12), "breaker", Collections.emptyMap(), null));

        List<GraphMetadata.NodeLabelMetadata> labels = Collections.singletonList(new GraphMetadata.NodeLabelMetadata("id", "position_name", "user_id"));

        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata(null, "id1", "vid1", null, BREAKER, false, Direction.UNDEFINED, false, null, labels));
        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata(null, "id2", "vid2", null, BUSBAR_SECTION, false, Direction.UNDEFINED, false, null, labels));
        metadata.addWireMetadata(new GraphMetadata.WireMetadata("id3", "id1", "id2", false, false));
        metadata.addFeederInfoMetadata(new GraphMetadata.FeederInfoMetadata("id1", "id3", "ONE", "COMPONENT_TYPE", "user_id"));
        metadata.addBusLegendInfoMetadata(new GraphMetadata.BusLegendInfoMetadata("id1"));
        metadata.addBusInfoMetadata(new GraphMetadata.BusInfoMetadata("id6", "busNodeId1", "user_id"));

        ObjectMapper objectMapper = JsonUtil.createObjectMapper();
        String json = objectMapper.writerWithDefaultPrettyPrinter()
                                  .writeValueAsString(metadata);

        GraphMetadata metadata2 = objectMapper.readValue(json, GraphMetadata.class);
        assertEquals(1, metadata2.getComponentMetadata().size());
        assertNotNull(metadata2.getComponentMetadata(BREAKER));
        assertEquals(1, metadata2.getComponentMetadata(BREAKER).getAnchorPoints().size());
        assertEquals(5, metadata2.getComponentMetadata(BREAKER).getAnchorPoints().get(0).getX(), 0);
        assertEquals(4, metadata2.getComponentMetadata(BREAKER).getAnchorPoints().get(0).getY(), 0);
        assertEquals(AnchorOrientation.NONE, metadata2.getComponentMetadata(BREAKER).getAnchorPoints().get(0).getOrientation());
        assertEquals(10, metadata2.getComponentMetadata(BREAKER).getSize().getWidth(), 0);
        assertEquals(12, metadata2.getComponentMetadata(BREAKER).getSize().getHeight(), 0);
        assertEquals(2, metadata2.getNodeMetadata().size());
        assertNotNull(metadata2.getNodeMetadata("id1"));
        assertEquals("id1", metadata2.getNodeMetadata("id1").getId());
        assertEquals("vid1", metadata2.getNodeMetadata("id1").getVId());
        assertEquals(BREAKER, metadata2.getNodeMetadata("id1").getComponentType());
        assertEquals(BUSBAR_SECTION, metadata2.getNodeMetadata("id2").getComponentType());
        assertEquals("id2", metadata2.getNodeMetadata("id2").getId());
        assertEquals("vid2", metadata2.getNodeMetadata("id2").getVId());
        assertNotNull(metadata2.getNodeMetadata("id1").getLabels());
        assertEquals("id", metadata2.getNodeMetadata("id1").getLabels().get(0).getId());
        assertEquals("user_id", metadata2.getNodeMetadata("id1").getLabels().get(0).getUserDefinedId());
        assertEquals("position_name", metadata2.getNodeMetadata("id1").getLabels().get(0).getPositionName());
        assertNotNull(metadata2.getNodeMetadata("id2"));
        assertEquals(1, metadata2.getWireMetadata().size());
        assertNotNull(metadata2.getWireMetadata("id3"));
        assertEquals("id3", metadata2.getWireMetadata("id3").getId());
        assertEquals("id1", metadata2.getWireMetadata("id3").getNodeId1());
        assertEquals("id2", metadata2.getWireMetadata("id3").getNodeId2());
        assertFalse(metadata2.getWireMetadata("id3").isStraight());
        assertNotNull(metadata2.getFeederInfoMetadata("id1"));
        assertEquals("id3", metadata2.getFeederInfoMetadata("id1").getEquipmentId());
        assertEquals("ONE", metadata2.getFeederInfoMetadata("id1").getSide());
        assertEquals("user_id", metadata2.getFeederInfoMetadata("id1").getUserDefinedId());
        assertEquals("COMPONENT_TYPE", metadata2.getFeederInfoMetadata("id1").getComponentType());

        assertNotNull(metadata2.getBusLegendInfoMetadata("id1"));

        assertNotNull(metadata2.getBusInfoMetadata("id6"));
        assertEquals("busNodeId1", metadata2.getBusInfoMetadata("id6").getBusNodeId());
        assertEquals("user_id", metadata2.getBusInfoMetadata("id6").getUserDefinedId());

        assertEquals(AnchorOrientation.NONE, metadata2.getAnchorPoints(BREAKER).get(0).getOrientation());
        assertEquals(5, metadata2.getAnchorPoints(BREAKER).get(0).getX(), 0);
        assertEquals(4, metadata2.getAnchorPoints(BREAKER).get(0).getY(), 0);

        Path meta = tmpDir.resolve("meta.json");
        metadata.writeJson(meta);
        GraphMetadata metadata3 = GraphMetadata.parseJson(meta);
        assertEquals(1, metadata3.getComponentMetadata().size());
        assertNotNull(metadata3.getComponentMetadata(BREAKER));
        assertEquals(1, metadata3.getComponentMetadata(BREAKER).getAnchorPoints().size());
        assertEquals(5, metadata3.getComponentMetadata(BREAKER).getAnchorPoints().get(0).getX(), 0);
        assertEquals(4, metadata3.getComponentMetadata(BREAKER).getAnchorPoints().get(0).getY(), 0);
        assertEquals(AnchorOrientation.NONE, metadata3.getComponentMetadata(BREAKER).getAnchorPoints().get(0).getOrientation());
        assertEquals(10, metadata3.getComponentMetadata(BREAKER).getSize().getWidth(), 0);
        assertEquals(12, metadata3.getComponentMetadata(BREAKER).getSize().getHeight(), 0);
        assertEquals(2, metadata3.getNodeMetadata().size());
        assertNotNull(metadata3.getNodeMetadata("id1"));
        assertEquals("id1", metadata3.getNodeMetadata("id1").getId());
        assertEquals("vid1", metadata3.getNodeMetadata("id1").getVId());
        assertEquals(BREAKER, metadata3.getNodeMetadata("id1").getComponentType());
        assertEquals(BUSBAR_SECTION, metadata3.getNodeMetadata("id2").getComponentType());
        assertEquals("id2", metadata3.getNodeMetadata("id2").getId());
        assertEquals("vid2", metadata3.getNodeMetadata("id2").getVId());
        assertNotNull(metadata3.getNodeMetadata("id2"));
        assertEquals(1, metadata3.getWireMetadata().size());
        assertNotNull(metadata3.getWireMetadata("id3"));
        assertEquals("id3", metadata3.getWireMetadata("id3").getId());
        assertEquals("id1", metadata3.getWireMetadata("id3").getNodeId1());
        assertEquals("id2", metadata3.getWireMetadata("id3").getNodeId2());
        assertFalse(metadata3.getWireMetadata("id3").isStraight());
        assertEquals("id3", metadata3.getFeederInfoMetadata("id1").getEquipmentId());
    }

    @Test
    void testGraphMetadataWithLine() throws IOException {
        GraphMetadata metadata = new GraphMetadata(new LayoutParameters(), new SvgParameters());
        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata("STATION_EXAMPLE", "idSTATION_95_EXAMPLE", "vid1", null, LCC_CONVERTER_STATION, false, Direction.UNDEFINED, false, null, Collections.emptyList()));
        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata(null, "bid1", "vid1", null, BUSBAR_SECTION, false, Direction.UNDEFINED, false, null, Collections.emptyList()));
        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata(null, "lid1", "vid1", null, LINE, false, Direction.UNDEFINED, false, null, Collections.emptyList()));
        metadata.addWireMetadata(new GraphMetadata.WireMetadata("wid1", "bid1", "lid1", false, false));
        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata(null, "bid2", "vid2", null, BUSBAR_SECTION, false, Direction.UNDEFINED, false, null, Collections.emptyList()));
        metadata.addNodeMetadata(new GraphMetadata.NodeMetadata(null, "lid2", "vid2", null, LINE, false, Direction.UNDEFINED, false, null, Collections.emptyList()));
        metadata.addWireMetadata(new GraphMetadata.WireMetadata("wid2", "bid2", "lid2", false, false));
        metadata.addLineMetadata(new GraphMetadata.LineMetadata("lid", "lid1", "lid2"));

        ObjectMapper objectMapper = JsonUtil.createObjectMapper();
        String json = objectMapper.writerWithDefaultPrettyPrinter()
                                  .writeValueAsString(metadata);
        GraphMetadata metadata2 = objectMapper.readValue(json, GraphMetadata.class);
        checkMetadata(metadata2);

        Path meta = tmpDir.resolve("meta.json");
        metadata.writeJson(meta);
        GraphMetadata metadata3 = GraphMetadata.parseJson(meta);
        checkMetadata(metadata3);
    }

    private void checkMetadata(GraphMetadata metadata) {
        assertEquals(5, metadata.getNodeMetadata().size());
        assertEquals("STATION_EXAMPLE", metadata.getNodeMetadata("idSTATION_95_EXAMPLE").getUnescapedId());
        assertNotNull(metadata.getNodeMetadata("bid1"));
        assertNull(metadata.getNodeMetadata("bid1").getUnescapedId());
        assertEquals("bid1", metadata.getNodeMetadata("bid1").getId());
        assertEquals("vid1", metadata.getNodeMetadata("bid1").getVId());
        assertEquals(BUSBAR_SECTION, metadata.getNodeMetadata("bid1").getComponentType());
        assertEquals("lid1", metadata.getNodeMetadata("lid1").getId());
        assertEquals("vid1", metadata.getNodeMetadata("lid1").getVId());
        assertEquals(LINE, metadata.getNodeMetadata("lid1").getComponentType());
        assertEquals("bid2", metadata.getNodeMetadata("bid2").getId());
        assertEquals("vid2", metadata.getNodeMetadata("bid2").getVId());
        assertEquals(BUSBAR_SECTION, metadata.getNodeMetadata("bid2").getComponentType());
        assertEquals("lid2", metadata.getNodeMetadata("lid2").getId());
        assertEquals("vid2", metadata.getNodeMetadata("lid2").getVId());
        assertEquals(LINE, metadata.getNodeMetadata("lid2").getComponentType());

        assertEquals(2, metadata.getWireMetadata().size());
        assertNotNull(metadata.getWireMetadata("wid1"));
        assertEquals("wid1", metadata.getWireMetadata("wid1").getId());
        assertEquals("bid1", metadata.getWireMetadata("wid1").getNodeId1());
        assertEquals("lid1", metadata.getWireMetadata("wid1").getNodeId2());
        assertNotNull(metadata.getWireMetadata("wid2"));
        assertEquals("wid2", metadata.getWireMetadata("wid2").getId());
        assertEquals("bid2", metadata.getWireMetadata("wid2").getNodeId1());
        assertEquals("lid2", metadata.getWireMetadata("wid2").getNodeId2());

        assertEquals(1, metadata.getLineMetadata().size());
        assertNotNull(metadata.getLineMetadata("lid"));
        assertEquals("lid", metadata.getLineMetadata("lid").getId());
        assertEquals("lid1", metadata.getLineMetadata("lid").getNodeId1());
        assertEquals("lid2", metadata.getLineMetadata("lid").getNodeId2());
    }

}