View Javadoc
1   package org.codehaus.plexus.util.dag;
2   
3   /*
4    * Copyright The Codehaus Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  
22  import org.junit.jupiter.api.Test;
23  
24  import static org.junit.jupiter.api.Assertions.assertEquals;
25  
26  /**
27   * <p>TopologicalSorterTest class.</p>
28   *
29   * @author <a href="michal.maczka@dimatics.com">Michal Maczka</a>
30   * @since 3.4.0
31   */
32  class TopologicalSorterTest {
33  
34      @Test
35      void dfs() throws Exception {
36          // a --> b --->c
37          //
38          // result a,b,c
39          final DAG dag1 = new DAG();
40  
41          dag1.addEdge("a", "b");
42  
43          dag1.addEdge("b", "c");
44  
45          final List<String> expected1 = new ArrayList<>();
46  
47          expected1.add("c");
48  
49          expected1.add("b");
50  
51          expected1.add("a");
52  
53          final List<String> actual1 = TopologicalSorter.sort(dag1);
54  
55          assertEquals(expected1, actual1, "Order is different then expected");
56  
57          //
58          // a <-- b <---c
59          //
60          // result c, b, a
61          final DAG dag2 = new DAG();
62  
63          dag2.addVertex("a");
64  
65          dag2.addVertex("b");
66  
67          dag2.addVertex("c");
68  
69          dag2.addEdge("b", "a");
70  
71          dag2.addEdge("c", "b");
72  
73          final List<String> expected2 = new ArrayList<>();
74  
75          expected2.add("a");
76  
77          expected2.add("b");
78  
79          expected2.add("c");
80  
81          final List<String> actual2 = TopologicalSorter.sort(dag2);
82  
83          assertEquals(expected2, actual2, "Order is different then expected");
84  
85          //
86          // a --> b --> c --> e
87          // | | |
88          // | V V
89          // --> d <-- f --> g
90          // result d, g, f, c, b, a
91          final DAG dag3 = new DAG();
92  
93          // force order of nodes in the graph
94          dag3.addVertex("a");
95  
96          dag3.addVertex("b");
97  
98          dag3.addVertex("c");
99  
100         dag3.addVertex("d");
101 
102         dag3.addVertex("e");
103 
104         dag3.addVertex("f");
105 
106         dag3.addEdge("a", "b");
107 
108         dag3.addEdge("b", "c");
109 
110         dag3.addEdge("b", "d");
111 
112         dag3.addEdge("c", "d");
113 
114         dag3.addEdge("c", "e");
115 
116         dag3.addEdge("f", "d");
117 
118         dag3.addEdge("e", "f");
119 
120         dag3.addEdge("f", "g");
121 
122         final List<String> expected3 = new ArrayList<>();
123 
124         expected3.add("d");
125 
126         expected3.add("g");
127 
128         expected3.add("f");
129 
130         expected3.add("e");
131 
132         expected3.add("c");
133 
134         expected3.add("b");
135 
136         expected3.add("a");
137 
138         final List<String> actual3 = TopologicalSorter.sort(dag3);
139 
140         assertEquals(expected3, actual3, "Order is different then expected");
141 
142         //
143         // a --> b --> c --> e
144         // | | |
145         // | V V
146         // --> d <-- f
147         // result d, f, e, c, b, a
148         final DAG dag4 = new DAG();
149         // force order of nodes in the graph
150 
151         dag4.addVertex("f");
152 
153         dag4.addVertex("e");
154 
155         dag4.addVertex("d");
156 
157         dag4.addVertex("c");
158 
159         dag4.addVertex("a");
160 
161         dag4.addVertex("b");
162 
163         dag4.addEdge("a", "b");
164 
165         dag4.addEdge("b", "c");
166 
167         dag4.addEdge("b", "d");
168 
169         dag4.addEdge("c", "d");
170 
171         dag4.addEdge("c", "e");
172 
173         dag4.addEdge("f", "d");
174 
175         dag4.addEdge("e", "f");
176 
177         final List<String> expected4 = new ArrayList<>();
178 
179         expected4.add("d");
180 
181         expected4.add("f");
182 
183         expected4.add("e");
184 
185         expected4.add("c");
186 
187         expected4.add("b");
188 
189         expected4.add("a");
190 
191         final List<String> actual4 = TopologicalSorter.sort(dag4);
192 
193         assertEquals(expected4, actual4, "Order is different then expected");
194     }
195 }