/*******************************************************************************
* Copyright (c) 2015, 2016 itemis AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alexander Nyßen (itemis AG) - initial API and implementation
*
*******************************************************************************/
package org.eclipse.gef.graph.tests;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.BiConsumer;
import org.eclipse.gef.graph.Edge;
import org.eclipse.gef.graph.Graph;
import org.eclipse.gef.graph.Graph.Builder;
import org.eclipse.gef.graph.Node;
import org.junit.Test;
import javafx.collections.ObservableList;
public class GraphBuilderTests {
public static class Semantic {
public String data;
public Semantic(String data) {
this.data = data;
}
}
private void addNodeBuilders(Graph.Builder graphBuilder, int count,
int startNumber) {
for (int i = 0; i < count; i++) {
graphBuilder.node().attr("label", "" + (startNumber + i));
}
}
private void addNodes(Graph.Builder graphBuilder, int count,
int startNumber) {
List<Node> nodes = new ArrayList<>();
for (int i = 0; i < count; i++) {
nodes.add(new Node.Builder().attr("label", "" + (startNumber + i))
.buildNode());
}
graphBuilder.nodes(nodes);
}
@Test
public void buildGraph() {
// build graph
Graph graph = new Graph.Builder().attr("graph_attr", "graph_attr_value")//
.node("n1")//
.attr("label", "n1")//
.attr("node_attr", "n1_node_attr_value")//
.node("n2")//
.attr("label", "n2")//
.attr("node_attr", "n2_node_attr_value")//
.node("n3")//
.attr("label", "n3")//
.attr("node_attr", "n3_node_attr_value")//
.edge("n1", "n2").attr("label", "n1->n2")//
.attr("edge_attr", "n1->n2_edge_attr_value")//
.edge("n1", "n3")//
.attr("label", "n1->n3")//
.attr("edge_attr", "n1->n3_edge_attr_value")//
.build();
assertEquals(graph.getAttributes().get("graph_attr"),
"graph_attr_value");
// sort nodes, so we can safely access them via indices
ObservableList<Node> nodes = graph.getNodes();
Collections.sort(nodes, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return ((String) o1.attributesProperty().get("label"))
.compareTo(
(String) o2.attributesProperty().get("label"));
}
});
// sort edges, so we can safely access them via indices
ObservableList<Edge> edges = graph.getEdges();
Collections.sort(edges, new Comparator<Edge>() {
@Override
public int compare(Edge o1, Edge o2) {
return ((String) o1.attributesProperty().get("label"))
.compareTo(
(String) o2.attributesProperty().get("label"));
}
});
assertEquals(3, nodes.size());
assertEquals(2, edges.size());
assertEquals(nodes.get(0).getAttributes().get("label"), "n1");
assertEquals(nodes.get(0).getAttributes().get("node_attr"),
"n1_node_attr_value");
assertEquals(nodes.get(1).getAttributes().get("label"), "n2");
assertEquals(nodes.get(1).getAttributes().get("node_attr"),
"n2_node_attr_value");
assertEquals(nodes.get(2).getAttributes().get("label"), "n3");
assertEquals(nodes.get(2).getAttributes().get("node_attr"),
"n3_node_attr_value");
assertEquals(edges.get(0).getAttributes().get("label"), "n1->n2");
assertEquals(edges.get(0).getAttributes().get("edge_attr"),
"n1->n2_edge_attr_value");
assertEquals(edges.get(0).getTarget().getAttributes().get("label"),
"n2");
assertEquals(edges.get(0).getSource().getAttributes().get("label"),
"n1");
assertEquals(edges.get(0).getTarget().getAttributes().get("label"),
"n2");
assertEquals(edges.get(1).getAttributes().get("label"), "n1->n3");
assertEquals(edges.get(1).getAttributes().get("edge_attr"),
"n1->n3_edge_attr_value");
assertEquals(edges.get(1).getSource().getAttributes().get("label"),
"n1");
assertEquals(edges.get(1).getTarget().getAttributes().get("label"),
"n3");
}
@Test
public void buildSemanticTwice() {
Builder b = new Graph.Builder();
Semantic s1 = new Semantic("a");
b.node(s1).attr("test", "value");
b.node(s1).attr("test2", "value2");
Graph graph = b.build();
assertEquals(1, graph.getNodes().size());
assertEquals(0, graph.getEdges().size());
assertEquals("value",
graph.getNodes().get(0).getAttributes().get("test"));
assertEquals("value2",
graph.getNodes().get(0).getAttributes().get("test2"));
}
@Test
public void buildWithExistingNodes() {
Node n1 = new Node.Builder().attr("label", "n1")//
.attr("node_attr", "n1_node_attr_value").buildNode();
Node n2 = new Node.Builder().attr("label", "n2")//
.attr("node_attr", "n2_node_attr_value").buildNode();
Node n3 = new Node.Builder().attr("label", "n3")//
.attr("node_attr", "n3_node_attr_value").buildNode();
Graph graph = new Graph.Builder().attr("graph_attr", "graph_attr_value")
.nodes(n1, n2, n3)//
.edge(n1, n2)//
.attr("label", "n1->n2")//
.attr("edge_attr", "n1->n2_edge_attr_value")//
.edge(n1, n3)//
.attr("label", "n1->n3")//
.attr("edge_attr", "n1->n3_edge_attr_value")//
.build();
assertEquals(graph.getAttributes().get("graph_attr"),
"graph_attr_value");
assertEquals(3, graph.getNodes().size());
assertEquals(2, graph.getEdges().size());
assertEquals(graph.getNodes().get(0).getAttributes().get("label"),
"n1");
assertEquals(graph.getNodes().get(0).getAttributes().get("node_attr"),
"n1_node_attr_value");
assertEquals(graph.getNodes().get(1).getAttributes().get("label"),
"n2");
assertEquals(graph.getNodes().get(1).getAttributes().get("node_attr"),
"n2_node_attr_value");
assertEquals(graph.getNodes().get(2).getAttributes().get("label"),
"n3");
assertEquals(graph.getNodes().get(2).getAttributes().get("node_attr"),
"n3_node_attr_value");
assertEquals(graph.getEdges().get(0).getAttributes().get("label"),
"n1->n2");
assertEquals(graph.getEdges().get(0).getAttributes().get("edge_attr"),
"n1->n2_edge_attr_value");
assertEquals(graph.getEdges().get(0).getTarget().getAttributes()
.get("label"), "n2");
assertEquals(graph.getEdges().get(0).getSource().getAttributes()
.get("label"), "n1");
assertEquals(graph.getEdges().get(0).getTarget().getAttributes()
.get("label"), "n2");
assertEquals(graph.getEdges().get(1).getAttributes().get("label"),
"n1->n3");
assertEquals(graph.getEdges().get(1).getAttributes().get("edge_attr"),
"n1->n3_edge_attr_value");
assertEquals(graph.getEdges().get(1).getSource().getAttributes()
.get("label"), "n1");
assertEquals(graph.getEdges().get(1).getTarget().getAttributes()
.get("label"), "n3");
}
/**
* Test that values are overwritten in the order they are specified in the
* builder.
*/
@Test
public void overrideAttributeWithSetter() {
Builder b = new Graph.Builder();
b.attr(new BiConsumer<Graph, String>() {
@Override
public void accept(Graph t, String u) {
t.attributesProperty().put("test", u);
}
}, "v1");
assertEquals("v1", b.build().attributesProperty().get("test"));
b.attr("test", "v2");
assertEquals("v2", b.build().attributesProperty().get("test"));
b.attr(new BiConsumer<Graph, String>() {
@Override
public void accept(Graph t, String u) {
t.attributesProperty().put("test", u);
}
}, "v3");
assertEquals("v3", b.build().attributesProperty().get("test"));
b.attr(new BiConsumer<Graph, String>() {
@Override
public void accept(Graph t, String u) {
t.attributesProperty().put("test", u);
}
}, "v4");
assertEquals("v4", b.build().attributesProperty().get("test"));
}
@Test
public void preserveNodeOrder() {
// first nodes, then builders
Builder gb = new Graph.Builder();
addNodes(gb, 5, 1);
addNodeBuilders(gb, 5, 6);
Graph g = gb.build();
assertEquals(10, g.getNodes().size());
for (int i = 0; i < g.getNodes().size(); i++) {
assertEquals(new Integer(i + 1).toString(),
g.getNodes().get(i).getAttributes().get("label"));
}
// first builders, then nodes
gb = new Graph.Builder();
addNodeBuilders(gb, 5, 1);
addNodes(gb, 5, 6);
g = gb.build();
assertEquals(10, g.getNodes().size());
for (int i = 0; i < g.getNodes().size(); i++) {
assertEquals(new Integer(i + 1).toString(),
g.getNodes().get(i).getAttributes().get("label"));
}
// a few nodes, all builders, rest nodes
gb = new Graph.Builder();
addNodes(gb, 2, 1);
addNodeBuilders(gb, 5, 3);
addNodes(gb, 3, 8);
g = gb.build();
assertEquals(10, g.getNodes().size());
for (int i = 0; i < g.getNodes().size(); i++) {
assertEquals(new Integer(i + 1).toString(),
g.getNodes().get(i).getAttributes().get("label"));
}
// a few builders, all nodes, rest builders
gb = new Graph.Builder();
addNodeBuilders(gb, 2, 1);
addNodes(gb, 5, 3);
addNodeBuilders(gb, 3, 8);
g = gb.build();
assertEquals(10, g.getNodes().size());
for (int i = 0; i < g.getNodes().size(); i++) {
assertEquals(new Integer(i + 1).toString(),
g.getNodes().get(i).getAttributes().get("label"));
}
// alternating nodes and builders
gb = new Graph.Builder();
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
addNodes(gb, 1, i + 1);
} else {
addNodeBuilders(gb, 1, i + 1);
}
}
g = gb.build();
assertEquals(10, g.getNodes().size());
for (int i = 0; i < g.getNodes().size(); i++) {
assertEquals(new Integer(i + 1).toString(),
g.getNodes().get(i).getAttributes().get("label"));
}
}
}