LayoutContextTest.java

/**
 * Copyright (c) 2025, 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.diagram.util.layout.geometry;

import com.powsybl.diagram.util.layout.GraphTestData;
import com.powsybl.diagram.util.layout.ResourceUtils;
import com.powsybl.diagram.util.layout.Layout;
import org.jgrapht.graph.DefaultEdge;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;

import static org.junit.jupiter.api.Assertions.*;

/**
 * @author Nathan Dissoubray {@literal <nathan.dissoubray at rte-france.com>}
 */
class LayoutContextTest {
    @TempDir
    File tempDirectory;

    @Test
    void graphCreation() {
        LayoutContext<String, DefaultEdge> layoutContext = GraphTestData.getLayoutContext();
        assertEquals(5, layoutContext.getSimpleGraph().vertexSet().size());
        assertEquals(4, layoutContext.getSimpleGraph().edgeSet().size());
        assertEquals(1, layoutContext.getFixedPoints().size());
        assertEquals(1, layoutContext.getFixedNodes().size());
        assertEquals(5, layoutContext.getInitialPoints().size());
        assertEquals(4, layoutContext.getMovingPoints().size());
    }

    @Test
    void setFixedPoints() {
        LayoutContext<String, DefaultEdge> layoutContext = GraphTestData.getLayoutContext();
        Map<String, Point> fixedPoints = new HashMap<>();
        fixedPoints.put("2", new Point(1.414, 15));
        fixedPoints.put("4", new Point(0, 0));
        fixedPoints.put("-1", new Point(-2, 6));
        layoutContext.setFixedPoints(fixedPoints);
        assertEquals(2, layoutContext.getInitialPoints().size());
    }

    @Test
    void setCenter() {
        LayoutContext<String, DefaultEdge> layoutContext = GraphTestData.getLayoutContext();
        Vector2D newCenter = new Vector2D(-445, 23.3);
        layoutContext.setCenter(newCenter);
        assertEquals(newCenter.getX(), layoutContext.getCenter().getX());
        assertEquals(newCenter.getY(), layoutContext.getCenter().getY());
        Vector2D otherNewCenter = new Vector2D(3.4, -6.1);
        layoutContext.setCenter(otherNewCenter);
        assertEquals(otherNewCenter.getX(), layoutContext.getCenter().getX());
        assertEquals(otherNewCenter.getY(), layoutContext.getCenter().getY());
    }

    @Test
    void toSvg() {
        LayoutContext<String, DefaultEdge> layoutContext = GraphTestData.getLayoutContext();
        Function<String, String> tooltip = v -> String.format("Vertex %s", v);
        Layout<String, DefaultEdge> layout = Layout.createBasicForceLayout();
        layout.run(layoutContext);
        StringWriter sw = new StringWriter();
        layoutContext.toSVG(tooltip, sw);
        assertEquals(ResourceUtils.toString("basic_5_nodes.svg"), sw.toString());
    }

    @Test
    void notExecuted() {
        LayoutContext<String, DefaultEdge> layoutContext = GraphTestData.getLayoutContext();
        Function<String, String> tooltip = v -> String.format("Vertex %s", v);
        assertDoesNotThrow(() -> layoutContext.toSVG(tooltip, tempDirectory.toPath().resolve("test.svg")));
        assertDoesNotThrow(() -> layoutContext.getStablePosition("0"));
    }

    @Test
    void setFixedNodesUnknownNodes() {
        LayoutContext<String, DefaultEdge> layoutContext = new LayoutContext<>(GraphTestData.getGraph());
        Set<String> fixedNodes = new HashSet<>();
        fixedNodes.add("1");
        fixedNodes.add("2");
        fixedNodes.add("-1");
        fixedNodes.add("a");
        fixedNodes.add("4738387");
        layoutContext.setFixedNodes(fixedNodes);
        Set<String> actualFixedNodes = new HashSet<>();
        actualFixedNodes.add("1");
        actualFixedNodes.add("2");
        assertEquals(actualFixedNodes, layoutContext.getFixedNodes());
    }

    @Test
    void setFixedPointsWithUnknownPoint() {
        LayoutContext<String, DefaultEdge> layoutContext = new LayoutContext<>(GraphTestData.getGraph());
        Map<String, Point> fixedPoints = new HashMap<>();
        fixedPoints.put("1", new Point(1, 1));
        fixedPoints.put("4", new Point(-2, 3));
        fixedPoints.put("-1", new Point(0, 3));
        fixedPoints.put("dfsfds", new Point(-2, -3.3));
        fixedPoints.put("45", new Point(45, 45));
        layoutContext.setFixedPoints(fixedPoints);
        Map<String, Point> expectedFixedPoints = new HashMap<>();
        expectedFixedPoints.put("1", new Point(1, 1));
        expectedFixedPoints.put("4", new Point(-2, 3));
        Set<Map.Entry<String, Point>> actualFixedPoints = layoutContext.getInitialPoints().entrySet();
        assertEquals(expectedFixedPoints.size(), actualFixedPoints.size());
        for (Map.Entry<String, Point> entry : actualFixedPoints) {
            Vector2D expectedPosition = expectedFixedPoints.get(entry.getKey()).getPosition();
            Vector2D actualPosition = entry.getValue().getPosition();
            assertEquals(expectedPosition.getX(), actualPosition.getX());
            assertEquals(expectedPosition.getY(), actualPosition.getY());
        }
        assertEquals(expectedFixedPoints.keySet(), layoutContext.getFixedNodes());
    }
}