package GKA.Graph;
import static org.junit.Assert.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import GKA.Controler.MainControler;
public class GKAGraphTest
{
GKAGraphInterface g1;
GKAGraphInterface g2;
GKAGraphInterface g3;
GKAGraphInterface g4;
GKAGraphInterface g5;
GKAGraphInterface g6;
GKAGraphInterface g7;
GKAGraphInterface g8;
@Before
public void testBefore()
{
//MainControler.main(null);
g1 = GKAGraphInterface.newGraph(GraphType.Directed);
g1.addEdge("a", "b", null, null);
g1.addEdge("a", "c", null, null);
g1.addEdge("a", "h", null, null);
g1.addEdge("a", "k", null, null);
g1.addEdge("b", "b", null, null);
g1.addEdge("b", "j", null, null);
g1.addEdge("b", "k", null, null);
g1.addEdge("b", "i", null, null);
g1.addEdge("c", "a", null, null);
g1.addEdge("c", "d", null, null);
g1.addEdge("d", "a", null, null);
g1.addEdge("d", "e", null, null);
g1.addEdge("d", "k", null, null);
g1.addEdge("e", "b", null, null);
g1.addEdge("e", "c", null, null);
g1.addEdge("e", "e", null, null);
g1.addEdge("e", "f", null, null);
g1.addEdge("f", "c", null, null);
g1.addEdge("f", "g", null, null);
g1.addEdge("g", "g", null, null);
g1.addEdge("g", "e", null, null);
g1.addEdge("g", "b", null, null);
g1.addEdge("g", "d", null, null);
g1.addEdge("h", "b", null, null);
g1.addEdge("h", "c", null, null);
g1.addEdge("i", "a", null, null);
g1.addEdge("i", "c", null, null);
g1.addEdge("i", "i", null, null);
g1.addEdge("j", "k", null, null);
g1.addEdge("j", "c", null, null);
g1.addEdge("j", "a", null, null);
g1.addEdge("j", "b", null, null);
g1.addEdge("k", "c", null, null);
g1.addEdge("k", "g", null, null);
g1.addEdge("k", "d", null, null);
g2 = GKAGraphInterface.newGraph(GraphType.Undirected);
g2.addEdge("a", "b", null, null);
g2.addEdge("a", "d", null, null);
g2.addEdge("a", "g", null, null);
g2.addEdge("a", "e", null, null);
g2.addEdge("b", "b", null, null);
g2.addEdge("b", "j", null, null);
g2.addEdge("b", "i", null, null);
g2.addEdge("c", "a", null, null);
g2.addEdge("c", "d", null, null);
g2.addEdge("d", "a", null, null);
g2.addEdge("d", "e", null, null);
g2.addEdge("d", "g", null, null);
g2.addEdge("e", "j", null, null);
g2.addEdge("e", "c", null, null);
g2.addEdge("e", "e", null, null);
g2.addEdge("e", "f", null, null);
g2.addEdge("f", "a", null, null);
g2.addEdge("f", "g", null, null);
g2.addEdge("f", "h", null, null);
g2.addEdge("f", "i", null, null);
g2.addEdge("g", "g", null, null);
g2.addEdge("g", "e", null, null);
g2.addEdge("g", "b", null, null);
g2.addEdge("g", "d", null, null);
g2.addEdge("h", "b", null, null);
g2.addEdge("h", "c", null, null);
g2.addEdge("h", "f", null, null);
g2.addEdge("i", "a", null, null);
g2.addEdge("i", "c", null, null);
g2.addEdge("i", "i", null, null);
g2.addEdge("i", "g", null, null);
g2.addEdge("j", "k", null, null);
g2.addEdge("j", "c", null, null);
g2.addEdge("j", "a", null, null);
g2.addEdge("j", "b", null, null);
g2.addEdge("k", "c", null, null);
g2.addEdge("k", "g", null, null);
g2.addEdge("k", "d", null, null);
g3 = GKAGraphInterface.newGraph(GraphType.UndirectedWeighted);
g3.addEdge("Paderborn","Hamburg", null, 228.0);
g3.addEdge("Bremen","Hamburg", null, 127.0);
g3.addEdge("Bremen","Bremerhaven", null, 66.0);
g3.addEdge("Norderstedt","Bremerhaven", null, 191.0);
g3.addEdge("Norderstedt","Husum", null, 145.0);
g3.addEdge("Kiel","Husum", null, 86.0);
g3.addEdge("Lüneburg","Lübeck", null, 115.0);
g3.addEdge("Lüneburg","Soltau", null, 52.0);
g3.addEdge("Hameln","Soltau", null, 134.0);
g3.addEdge("Hameln","Paderborn", null, 134.0);
g3.addEdge("Hameln","Detmold", null, 45.0);
g3.addEdge("Münster","Bremen", null, 173.0);
g3.addEdge("Münster","Minden", null, 131.0);
g3.addEdge("Minden","Hannover", null, 76.0);
g3.addEdge("Hannover","Oldenburg", null, 169.0);
g3.addEdge("Oldenburg","Cuxhaven", null, 105.0);
g3.addEdge("Cuxhaven","Hannover", null, 217.0);
g3.addEdge("Cuxhaven","Bremen", null, 100.0);
g3.addEdge("Bremerhaven","Rotenburg", null, 108.0);
g3.addEdge("Rotenburg","Soltau", null, 41.0);
g3.addEdge("Minden","Rotenburg", null, 171.0);
g3.addEdge("Rotenburg","Uelzen", null, 104.0);
g3.addEdge("Lüneburg","Buxtehude", null, 66.0);
g3.addEdge("Uelzen","Hameln", null, 160.0);
g3.addEdge("Hameln","Walsrode", null, 116.0);
g3.addEdge("Walsrode","Hamburg", null, 101.0);
g3.addEdge("Walsrode","Minden", null, 126.0);
g3.addEdge("Münster","Walsrode", null, 226.0);
g3.addEdge("Lüneburg","Münster", null, 295.0);
g3.addEdge("Münster","Paderborn", null, 149.0);
g3.addEdge("Lüneburg","Hamburg", null, 55.0);
g3.addEdge("Kiel","Uelzen", null, 190.0);
g3.addEdge("Oldenburg","Celle", null, 167.0);
g3.addEdge("Celle","Hannover", null, 43.0);
g3.addEdge("Celle","Soltau", null, 48.0);
g3.addEdge("Cuxhaven","Soltau", null, 194.0);
g3.addEdge("Soltau","Buxtehude", null, 60.0);
g3.addEdge("Buxtehude","Hamburg", null, 37.0);
g3.addEdge("Buxtehude","Minden", null, 223.0);
g3.addEdge("Buxtehude","Walsrode", null, 125.0);
g4 = GKAGraphInterface.newGraph(GraphType.UndirectedWeighted);
g4.addEdge("v4", "s", null, 1.0);
g4.addEdge("v3", "v1", null, 2.0);
g4.addEdge("v5", "v6", null, 2.0);
g4.addEdge("q", "s", null, 3.0);
g4.addEdge("v4", "v1", null, 3.0);
g4.addEdge("v2", "v4", null, 3.0);
g4.addEdge("v6", "v3", null, 3.0);
g4.addEdge("v7", "s", null, 3.0);
g4.addEdge("v1", "v3", null, 4.0);
g4.addEdge("v8", "v2", null, 4.0);
g4.addEdge("q", "v5", null, 6.0);
g4.addEdge("v6", "v4", null, 7.0);
g4.addEdge("v5", "v2", null, 7.0);
g4.addEdge("q", "v1", null, 8.0);
g4.addEdge("v6", "s", null, 8.0);
g4.addEdge("v7", "v8", null, 8.0);
g4.addEdge("q", "v2", null, 9.0);
g4.addEdge("v8", "s", null, 9.0);
g4.addEdge("v1", "v7", null, 9.0);
g4.addEdge("v2", "v3", null, 11.0);
g4.addEdge("v7", "v2", null, 11.0);
g4.addEdge("v3", "s", null, 12.0);
g4.addEdge("v4", "v2", null, 12.0);
g5 = GKAGraphInterface.newGraph(GraphType.UndirectedWeighted);
g5.addEdge("v1", "v2", null, 5.0);
g5.addEdge("v1", "v3", null, 7.0);
g5.addEdge("v1", "v4", null, 5.0);
g5.addEdge("v1", "v5", null, 3.0);
g5.addEdge("v1", "v6", null, 2.0);
g5.addEdge("v1", "v7", null, 6.0);
g5.addEdge("v2", "v3", null, 4.0);
g5.addEdge("v2", "v4", null, 1.0);
g5.addEdge("v2", "v5", null, 8.0);
g5.addEdge("v2", "v6", null, 3.0);
g5.addEdge("v2", "v7", null, 5.0);
g5.addEdge("v3", "v4", null, 3.0);
g5.addEdge("v3", "v5", null, 4.0);
g5.addEdge("v3", "v6", null, 7.0);
g5.addEdge("v3", "v7", null, 1.0);
g5.addEdge("v4", "v5", null, 7.0);
g5.addEdge("v4", "v6", null, 4.0);
g5.addEdge("v4", "v7", null, 4.0);
g5.addEdge("v5", "v6", null, 5.0);
g5.addEdge("v5", "v7", null, 3.0);
g5.addEdge("v6", "v7", null, 8.0);
g6 = GKAGraphInterface.newGraph(GraphType.Directed);
g6.addEdge("1", "2", null, null);
g6.addEdge("1", "3", null, null);
g6.addEdge("1", "8", null, null);
g6.addEdge("2", "4", null, null);
g6.addEdge("3", "5", null, null);
g6.addEdge("3", "8", null, null);
g6.addEdge("4", "5", null, null);
g6.addEdge("5", "2", null, null);
g6.addEdge("3", "4", null, null);
g6.addEdge("4", "1", null, null);
g6.addEdge("8", "5", null, null);
g6.addEdge("6", "7", null, null);
g6.addEdge("7", "9", null, null);
g6.addEdge("9", "6", null, null);
g6.addVertex("10");
g6.addVertex("12");
g6.addEdge("11", "12", null, null);
g7 = GKAGraphInterface.newGraph(GraphType.UndirectedWeighted);
g7.addEdge("v4", "s", null, 1.0);
g7.addEdge("v3", "v1", null, 2.0);
g7.addEdge("v5", "v6", null, 2.0);
g7.addEdge("q", "s", null, 3.0);
g7.addEdge("v4", "v1", null, 3.0);
g7.addEdge("v2", "v4", null, 3.0);
g7.addEdge("v6", "v3", null, 3.0);
g7.addEdge("v7", "s", null, 3.0);
g7.addEdge("v1", "v3", null, 4.0);
g7.addEdge("v8", "v2", null, 4.0);
g7.addEdge("q", "v5", null, 6.0);
g7.addEdge("v6", "v4", null, 7.0);
g7.addEdge("v5", "v2", null, 7.0);
g7.addEdge("q", "v1", null, 8.0);
g7.addEdge("v6", "s", null, 8.0);
g7.addEdge("v7", "v8", null, 8.0);
g7.addEdge("q", "v2", null, 9.0);
g7.addEdge("v8", "s", null, 9.0);
g7.addEdge("v1", "v7", null, 9.0);
g7.addEdge("v2", "v3", null, 11.0);
g7.addEdge("v7", "v2", null, 11.0);
g7.addEdge("v3", "s", null, 12.0);
g7.addEdge("v4", "v2", null, 12.0);
g8 = GKAGraphInterface.newGraph(GraphType.UndirectedWeighted);
g8.addEdge("v1", "v2", null, 5.0);
g8.addEdge("v1", "v3", null, 7.0);
g8.addEdge("v1", "v4", null, 5.0);
g8.addEdge("v1", "v5", null, 3.0);
g8.addEdge("v1", "v6", null, 2.0);
g8.addEdge("v1", "v7", null, 6.0);
g8.addEdge("v2", "v3", null, 4.0);
g8.addEdge("v2", "v4", null, 1.0);
g8.addEdge("v2", "v5", null, 8.0);
g8.addEdge("v2", "v6", null, 3.0);
g8.addEdge("v2", "v7", null, 5.0);
g8.addEdge("v3", "v4", null, 3.0);
g8.addEdge("v3", "v5", null, 4.0);
g8.addEdge("v3", "v6", null, 7.0);
g8.addEdge("v3", "v7", null, 1.0);
g8.addEdge("v4", "v5", null, 7.0);
g8.addEdge("v4", "v6", null, 4.0);
g8.addEdge("v4", "v7", null, 4.0);
g8.addEdge("v5", "v6", null, 5.0);
g8.addEdge("v5", "v7", null, 3.0);
g8.addEdge("v6", "v7", null, 8.0);
}
@Test
public void testNewGraphFile()
{
assertEquals(g1, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph1.gka")));
assertEquals(g2, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph2.gka")));
//assertEquals(g3, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph3.gka")));
assertEquals(g4, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph4.gka")));
assertEquals(g5, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph5.gka")));
assertEquals(g6, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph6.gka")));
assertEquals(g7, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph7.gka")));
assertEquals(g8, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph8.gka")));
}
@Test
public void testShortesPathBroadStringList()
{
assertEquals(new ArrayList<String>(Arrays.asList("Paderborn", "Hamburg", "Bremen")), ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph3.gka"))).shortesPathBroadStringList("Paderborn","Bremen"));
//graph1 von a nach j
assertEquals(new ArrayList(Arrays.asList("a", "b", "j")), ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph1.gka"))).shortesPathBroadStringList("a","j"));
//assertEquals("[(a : b), (b : j)]", GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph1.gka")).shortesPathBroad("a","j").toString());
//graph2 von a nach k mehrere Möglichkeiten
assertEquals(new ArrayList(Arrays.asList("a", "d", "k")), ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph2.gka"))).shortesPathBroadStringList("a","k"));
assertEquals(2, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph2.gka")).shortesPathBroad("a","k").size());
// graph3 von Paderborn nach Bremen
//assertEquals("[(Paderborn : Hamburg) : 228.0, (Bremen : Hamburg) : 127.0]", GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph3.gka")).shortesPathBroad("Paderborn","Bremen").toString());
//graph4 gewichtet von v4 nach s : 1.0
assertEquals(new ArrayList(Arrays.asList("v4", "s")), ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph4.gka"))).shortesPathBroadStringList("v4","s"));
assertEquals("[(v4 : s) : 1.0]", GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph4.gka")).shortesPathBroad("v4","s").toString());
//graph5 gewichtet von v1 nach v7 : 6.0
assertEquals(new ArrayList(Arrays.asList("v1", "v7")), ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph5.gka"))).shortesPathBroadStringList("v1","v7"));
// assertEquals("[(v1 : v7) : 6.0]", GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph5.gka")).shortesPathBroad("v1","v7").toString());
//graph6 von 10 nach 12 (keine Verbindung vorhanden)
assertEquals(null, ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph6.gka"))).shortesPathBroadStringList("10","12"));
//assertEquals(null, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph6.gka")).shortesPathBroad("10","12"));
//graph6 von 12 nach 11 gegen die Richtung
assertEquals(null, ((GKAGraph) GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph6.gka"))).shortesPathBroadStringList("12","11"));
assertEquals(null, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph6.gka")).shortesPathBroad("12","11"));
}
@Test
public void testSaveGraph()
{
g1.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g1, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
g2.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g2, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
// g3.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
// assertEquals(g3, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
g4.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g4, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
g5.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g5, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
g6.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g6, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
g7.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g7, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
g8.saveGraph(new File("..\\aufgabe1Bsp\\test.gka"),false);
assertEquals(g8, GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\test.gka")));
}
private double getWayLength(Collection<GKAEdge> list){
double retval = 0.0;
if(list != null)
{
for(GKAEdge edge : list){
retval += edge.getWeight();
}
}
else
{
retval = -1.0;
}
return retval;
}
@Test
public void testGraph3()
{
GKAGraphInterface testGraph = GKAGraphInterface.newGraph(new File("..\\aufgabe1Bsp\\graph3.gka"));
for(String vertex1 : testGraph.getjGraph().vertexSet())
{
for(String vertex2 : testGraph.getjGraph().vertexSet())
{
assertEquals(getWayLength(testGraph.dijkstra(vertex1, vertex2)), getWayLength(testGraph.floydWarschall(vertex1, vertex2)), 0.01);
}
}
}
class RandomGraph
{
private GKAGraphInterface graph;
private String way1Source;
private String way1Target;
private double way1Weight;
private String way2Source;
private String way2Target;
private double way2Weight;
RandomGraph(GKAGraphInterface graph, String way1Source, String way1Target, double way1Weight, String way2Source, String way2Target, double way2Weight)
{
this.setGraph(graph);
this.setWay1Source(way1Source);
this.setWay1Target(way1Target);
this.setWay1Weight(way1Weight);
this.setWay2Source(way2Source);
this.setWay2Target(way2Target);
this.setWay2Weight(way2Weight);
}
public GKAGraphInterface getGraph()
{
return graph;
}
private void setGraph(GKAGraphInterface graph)
{
this.graph = graph;
}
public String getWay1Source()
{
return way1Source;
}
private void setWay1Source(String way1Source)
{
this.way1Source = way1Source;
}
public String getWay1Target()
{
return way1Target;
}
private void setWay1Target(String way1Target)
{
this.way1Target = way1Target;
}
public double getWay1Weight()
{
return way1Weight;
}
private void setWay1Weight(double way1Weight)
{
this.way1Weight = way1Weight;
}
public String getWay2Source()
{
return way2Source;
}
private void setWay2Source(String way2Source)
{
this.way2Source = way2Source;
}
public String getWay2Target()
{
return way2Target;
}
private void setWay2Target(String way2Target)
{
this.way2Target = way2Target;
}
public double getWay2Weight()
{
return way2Weight;
}
private void setWay2Weight(double way2Weight)
{
this.way2Weight = way2Weight;
}
}
public RandomGraph generateGraph(int vertexAnzahl, int edgeAnzahl)
{
GKAGraphInterface retval = GKAGraphInterface.newGraph(GraphType.DirectedWeighted);
for(int i = 0; i < vertexAnzahl; i++)
{
retval.addVertex(String.valueOf(i));
}
for(int i = 0; i < (vertexAnzahl / 2) - 1; i++)
{
retval.addEdge(String.valueOf(i), String.valueOf(i+1), null, 0.1);
}
for(int i = vertexAnzahl / 2 ; i < vertexAnzahl; i++)
{
retval.addEdge(String.valueOf(i), String.valueOf(i+1), null, 0.1);
}
for(int i = 0 ; i < edgeAnzahl; i++)
{
int target = (int) (Math.random() * (vertexAnzahl - 1));
int source = (int) (Math.random() * (vertexAnzahl - 1));
retval.addEdge(String.valueOf(source), String.valueOf(target), null, ((Math.random() * edgeAnzahl) + ((vertexAnzahl / 2) + 1) * 0.1));
}
return new RandomGraph(retval, String.valueOf(0), String.valueOf((vertexAnzahl / 2) - 1), ((vertexAnzahl /2) - 1) * 0.1, String.valueOf(vertexAnzahl / 2), String.valueOf(vertexAnzahl - 1), ((vertexAnzahl /2) - 1) * 0.1);
}
@Test
public void testRandomGraph()
{
long startTime = System.currentTimeMillis();
RandomGraph testGraph = generateGraph(100, 6000);
System.out.println(System.currentTimeMillis() - startTime);
startTime = System.currentTimeMillis();
assertEquals(getWayLength(testGraph.getGraph().dijkstra(testGraph.getWay1Source(), testGraph.getWay1Target())), testGraph.getWay1Weight(), 0.01);
System.out.println(System.currentTimeMillis() - startTime);
startTime = System.currentTimeMillis();
assertEquals(getWayLength(testGraph.getGraph().dijkstra(testGraph.getWay2Source(), testGraph.getWay2Target())), testGraph.getWay2Weight(), 0.01);
System.out.println(System.currentTimeMillis() - startTime);
startTime = System.currentTimeMillis();
assertEquals(getWayLength(testGraph.getGraph().floydWarschall(testGraph.getWay1Source(), testGraph.getWay1Target())), testGraph.getWay1Weight(), 0.01);
System.out.println(System.currentTimeMillis() - startTime);
startTime = System.currentTimeMillis();
assertEquals(getWayLength(testGraph.getGraph().floydWarschall(testGraph.getWay2Source(), testGraph.getWay2Target())), testGraph.getWay2Weight(), 0.01);
System.out.println(System.currentTimeMillis() - startTime);
startTime = System.currentTimeMillis();
}
}