blob: b27a5de98f6c00f718d23f7467c1bed16a35e01b [file] [log] [blame]
Aaron Kruglikov07d80382015-12-07 16:54:37 -08001package org.onlab.graph;
2
3import com.google.common.collect.Lists;
4import org.junit.Before;
5import org.junit.Test;
6
7import java.util.Iterator;
8import java.util.List;
9import java.util.Set;
10
11import static com.google.common.collect.ImmutableSet.of;
12import static org.junit.Assert.assertEquals;
13import static org.junit.Assert.assertTrue;
14
15/**
16 * Class for test KshortestPathsSearch.
17 */
18public class KShortestPathsSearchTest<V extends Vertex, E extends Edge<V>> extends GraphTest {
19 private KShortestPathsSearch<TestVertex, TestEdge> kShortestPathsSearch = new KShortestPathsSearch<>();
20 private GraphPathSearch.Result<TestVertex, TestEdge> result;
21
22 @Before
23 public void setUp() {
24 graph = new AdjacencyListsGraph<>(vertexes(), edges());
25 }
26 @Test
27 public void noPath() {
28 graph = new AdjacencyListsGraph<>(of(A, B, C, D),
29 of(new TestEdge(A, B, 1),
30 new TestEdge(B, A, 1),
31 new TestEdge(C, D, 1),
32 new TestEdge(D, C, 1)));
33 KShortestPathsSearch<TestVertex, TestEdge> kShortestPathsSearch = new KShortestPathsSearch<>();
34 GraphPathSearch.Result<TestVertex, TestEdge> result = kShortestPathsSearch.search(graph, A, D, weight, 1);
35 Set<Path<TestVertex, TestEdge>> resultPathSet = result.paths();
36 assertTrue("There should not be any paths.", resultPathSet.isEmpty());
37 }
38
39 @Test
40 public void testSinglePath() {
41 //Tests that there is only a single path possible between A and B
42 graph = new AdjacencyListsGraph<>(vertexes(), edges());
43 this.result = kShortestPathsSearch.search(graph, A, B, weight, 2);
44 Iterator<Path<TestVertex, TestEdge>> itr = result.paths().iterator();
45 assertEquals("incorrect paths count", 1, result.paths().size());
46 List<TestEdge> correctEdgeList = Lists.newArrayList();
47 correctEdgeList.add(new TestEdge(A, B, 1));
48 assertTrue("That wrong path was returned.",
49 edgeListsAreEqual(correctEdgeList, result.paths().iterator().next().edges()));
50 }
51
52 @Test
53 public void testTwoPath() {
54 //Tests that there are only two paths between A and C and that they are returned in the correct order
55 result = kShortestPathsSearch.search(graph, A, C, weight, 3);
56 assertTrue("There are an unexpected number of paths.", result.paths().size() == 2);
57 Iterator<Path<TestVertex, TestEdge>> edgeListIterator = result.paths().iterator();
58 List<TestEdge> correctEdgeList = Lists.newArrayList();
59 correctEdgeList.add(new TestEdge(A, B, 1));
60 correctEdgeList.add(new TestEdge(B, C, 1));
61 assertTrue("The first path from A to C was incorrect.",
62 edgeListsAreEqual(edgeListIterator.next().edges(), correctEdgeList));
63 correctEdgeList.clear();
64 correctEdgeList.add(new TestEdge(A, C, 3));
65 assertTrue("The second path from A to C was incorrect.",
66 edgeListsAreEqual(edgeListIterator.next().edges(), correctEdgeList));
67 }
68
69 @Test
70 public void testFourPath() {
71 //Tests that there are only four paths between A and E and that they are returned in the correct order
72 //Also tests the special case where some correct solutions are equal
73 result = kShortestPathsSearch.search(graph, A, E, weight, 5);
74 assertTrue("There are an unexpected number of paths.", result.paths().size() == 4);
75 Iterator<Path<TestVertex, TestEdge>> edgeListIterator = result.paths().iterator();
76 List<TestEdge> correctEdgeList = Lists.newArrayList();
77 correctEdgeList.add(new TestEdge(A, B, 1));
78 correctEdgeList.add(new TestEdge(B, C, 1));
79 correctEdgeList.add(new TestEdge(C, E, 1));
80 assertTrue("The first path from A to E was incorrect.",
81 edgeListsAreEqual(edgeListIterator.next().edges(), correctEdgeList));
82 correctEdgeList.clear();
83 //There are two paths of equal length that should hold positions two and three
84 List<TestEdge> alternateCorrectEdgeList = Lists.newArrayList();
85 correctEdgeList.add(new TestEdge(A, C, 3));
86 correctEdgeList.add(new TestEdge(C, E, 1));
87 alternateCorrectEdgeList.add(new TestEdge(A, B, 1));
88 alternateCorrectEdgeList.add(new TestEdge(B, D, 2));
89 alternateCorrectEdgeList.add(new TestEdge(D, E, 1));
90 List<TestEdge> candidateOne = edgeListIterator.next().edges();
91 List<TestEdge> candidateTwo = edgeListIterator.next().edges();
92 if (candidateOne.size() == 2) {
93 assertTrue("The second path from A to E was incorrect.",
94 edgeListsAreEqual(candidateOne, correctEdgeList));
95 assertTrue("The third path from A to E was incorrect.",
96 edgeListsAreEqual(candidateTwo, alternateCorrectEdgeList));
97 } else {
98 assertTrue("The second path from A to E was incorrect.",
99 edgeListsAreEqual(candidateOne, alternateCorrectEdgeList));
100 assertTrue("The third path from A to E was incorrect.",
101 edgeListsAreEqual(candidateTwo, correctEdgeList));
102 }
103 correctEdgeList.clear();
104 correctEdgeList.add(new TestEdge(A, B, 1));
105 correctEdgeList.add(new TestEdge(B, E, 4));
106 assertTrue("The fourth path rom A to E was incorrect",
107 edgeListsAreEqual(edgeListIterator.next().edges(), correctEdgeList));
108
109 }
110
111 @Test
112 public void testPathsFromSink() {
113 //H is a sink in this topology, insure there are no paths from it to any other location
114 for (TestVertex vertex : vertexes()) {
115 assertTrue("There should be no paths from vertex H to any other node.",
116 kShortestPathsSearch.search(graph, H, vertex, weight, 1).paths().size() == 0);
117 }
118 }
119
120 @Test
121 public void testLimitPathSetSize() {
122 //Checks to make sure that no more than K paths are returned
123 result = kShortestPathsSearch.search(graph, A, E, weight, 3);
124 assertTrue("There are an unexpected number of paths.", result.paths().size() == 3);
125 result = kShortestPathsSearch.search(graph, A, G, weight, 1);
126 assertTrue("There are an unexpected number of paths.", result.paths().size() == 1);
127 }
128
129 private boolean edgeListsAreEqual(List<TestEdge> edgeListOne, List<TestEdge> edgeListTwo) {
130 if (edgeListOne.size() != edgeListTwo.size()) {
131 return false;
132 }
133 TestEdge edgeOne;
134 TestEdge edgeTwo;
135 for (int i = 0; i < edgeListOne.size(); i++) {
136 edgeOne = edgeListOne.get(i);
137 edgeTwo = edgeListTwo.get(i);
138 if (!edgeOne.equals(edgeTwo)) {
139 return false;
140 }
141 }
142 return true;
143 }
144}