/*
* Copyright 2012 Odysseus Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.odysseus.ithaka.digraph.io.dot;
import java.awt.Color;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Arrays;
import org.junit.Assert;
import org.junit.Test;
import de.odysseus.ithaka.digraph.DigraphProvider;
import de.odysseus.ithaka.digraph.SimpleDigraph;
import de.odysseus.ithaka.digraph.SimpleDigraphAdapter;
import de.odysseus.ithaka.digraph.io.dot.DotAttribute;
import de.odysseus.ithaka.digraph.io.dot.DotExporter;
import de.odysseus.ithaka.digraph.io.dot.DotProvider;
public class DotExporterTest {
@Test
public void testSimple() throws IOException {
DotProvider<Integer, Boolean, SimpleDigraph<Integer>> provider = new DotProvider<Integer, Boolean, SimpleDigraph<Integer>>() {
@Override
public String getNodeId(Integer vertex) {
return "v" + vertex;
}
@Override
public Iterable<DotAttribute> getNodeAttributes(Integer vertex) {
return vertex == 7 ? Arrays.asList(new DotAttribute("color", Color.red)) : null;
}
@Override
public Iterable<DotAttribute> getEdgeAttributes(Integer source, Integer target, Boolean edge) {
return source == 1 ? Arrays.asList(new DotAttribute("arrowtail", "diamond")) : null;
}
@Override
public Iterable<DotAttribute> getDefaultNodeAttributes(SimpleDigraph<Integer> digraph) {
return Arrays.asList(new DotAttribute("shape", "plaintext"));
}
@Override
public Iterable<DotAttribute> getDefaultGraphAttributes(SimpleDigraph<Integer> digraph) {
return null;
}
@Override
public Iterable<DotAttribute> getDefaultEdgeAttributes(SimpleDigraph<Integer> digraph) {
return null;
}
@Override
public Iterable<DotAttribute> getSubgraphAttributes(SimpleDigraph<Integer> subgraph, Integer vertex) {
return null;
}
};
SimpleDigraph<Integer> digraph = new SimpleDigraphAdapter<Integer>();
digraph.add(1, 2);
digraph.add(1, 3);
digraph.add(4, 2);
digraph.add(5, 6);
digraph.add(7);
StringWriter writer = new StringWriter();
new DotExporter("", "").export(provider, digraph, null, writer);
Assert.assertEquals(
"digraph G {node[shape=plaintext];v1;v2;v3;v4;v5;v6;v7[color=\"#FF0000\"];v1 -> v2[arrowtail=diamond];v1 -> v3[arrowtail=diamond];v4 -> v2;v5 -> v6;}",
writer.toString());
// writer = new StringWriter();
// new DotExporter().export(provider, digraph, null, writer);
// System.out.print(writer);
}
@Test
public void testSubgraph() throws IOException {
DotProvider<Integer, Boolean, SimpleDigraph<Integer>> provider = new DotProvider<Integer, Boolean, SimpleDigraph<Integer>>() {
@Override
public String getNodeId(Integer vertex) {
return "v" + vertex;
}
@Override
public Iterable<DotAttribute> getNodeAttributes(Integer vertex) {
return null;
}
@Override
public Iterable<DotAttribute> getEdgeAttributes(Integer source, Integer target, Boolean edge) {
return null;
}
@Override
public Iterable<DotAttribute> getDefaultNodeAttributes(SimpleDigraph<Integer> digraph) {
return null;
}
@Override
public Iterable<DotAttribute> getDefaultGraphAttributes(SimpleDigraph<Integer> digraph) {
return null;
}
@Override
public Iterable<DotAttribute> getDefaultEdgeAttributes(SimpleDigraph<Integer> digraph) {
return null;
}
@Override
public Iterable<DotAttribute> getSubgraphAttributes(SimpleDigraph<Integer> subgraph, Integer vertex) {
return Arrays.asList(new DotAttribute("label", getNodeId(vertex)));
}
};
DigraphProvider<Integer, SimpleDigraph<Integer>> subgraphs = new DigraphProvider<Integer, SimpleDigraph<Integer>>() {
SimpleDigraph<Integer> subgraph1 = new SimpleDigraphAdapter<Integer>();
SimpleDigraph<Integer> subgraph2 = new SimpleDigraphAdapter<Integer>();
{
subgraph1.add(10);
subgraph2.add(20);
}
@Override
public SimpleDigraph<Integer> get(Integer value) {
return value == 1 ? subgraph1 : value == 2 ? subgraph2 : null;
}
};
SimpleDigraph<Integer> digraph = new SimpleDigraphAdapter<Integer>();
digraph.add(1, 2);
digraph.add(1, 3);
digraph.add(3, 2);
Writer writer = new StringWriter();
new DotExporter("", "").export(provider, digraph, subgraphs, writer);
Assert.assertEquals(
"digraph G {compound=true;subgraph cluster_v1 {graph[label=v1];v10;}subgraph cluster_v2 {graph[label=v2];v20;}v3;v10 -> v20[ltail=cluster_v1, lhead=cluster_v2];v10 -> v3[ltail=cluster_v1];v3 -> v20[lhead=cluster_v2];}",
writer.toString());
// writer = new StringWriter();
// new DotExporter().export(provider, digraph, subgraphs, writer);
// System.out.print(writer);
}
}