/
TopologicalSortUtilSpec.scala
93 lines (74 loc) · 3.01 KB
/
TopologicalSortUtilSpec.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Copyright © 2015-2021 the contributors (see Contributors.md).
*
* This file is part of Knora.
*
* Knora is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Knora is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with Knora. If not, see <http://www.gnu.org/licenses/>.
*/
package org.knora.webapi.util.search.gravsearch.prequery
import org.knora.webapi.CoreSpec
import org.knora.webapi.messages.util.search.gravsearch.prequery.TopologicalSortUtil
import scalax.collection.Graph
import scalax.collection.GraphEdge._
/**
* Tests [[TopologicalSortUtil]].
*/
class TopologicalSortUtilSpec extends CoreSpec() {
type NodeT = Graph[Int, DiHyperEdge]#NodeT
private def nodesToValues(orders: Set[Vector[NodeT]]): Set[Vector[Int]] = {
orders.map { order: Vector[NodeT] =>
order.map(_.value)
}
}
"TopologicalSortUtilSpec" should {
"return all topological orders of a graph with one leaf" in {
val graph: Graph[Int, DiHyperEdge] =
Graph[Int, DiHyperEdge](DiHyperEdge[Int](2, 4), DiHyperEdge[Int](2, 7), DiHyperEdge[Int](4, 5))
val allOrders: Set[Vector[Int]] = nodesToValues(
TopologicalSortUtil
.findAllTopologicalOrderPermutations(graph))
val expectedOrders = Set(
Vector(2, 7, 4, 5)
)
assert(allOrders == expectedOrders)
}
"return all topological orders of a graph with multiple leaves" in {
val graph: Graph[Int, DiHyperEdge] =
Graph[Int, DiHyperEdge](DiHyperEdge[Int](2, 4), DiHyperEdge[Int](2, 7), DiHyperEdge[Int](2, 8), DiHyperEdge[Int](4, 5), DiHyperEdge[Int](7, 3))
val allOrders: Set[Vector[Int]] = nodesToValues(
TopologicalSortUtil
.findAllTopologicalOrderPermutations(graph))
val expectedOrders = Set(
Vector(2, 8, 4, 7, 5, 3),
Vector(2, 8, 7, 4, 3, 5)
)
assert(allOrders == expectedOrders)
}
"return an empty set of orders for an empty graph" in {
val graph: Graph[Int, DiHyperEdge] = Graph[Int, DiHyperEdge]()
val allOrders: Set[Vector[Int]] = nodesToValues(
TopologicalSortUtil
.findAllTopologicalOrderPermutations(graph))
assert(allOrders.isEmpty)
}
"return an empty set of orders for a cyclic graph" in {
val graph: Graph[Int, DiHyperEdge] =
Graph[Int, DiHyperEdge](DiHyperEdge[Int](2, 4), DiHyperEdge[Int](4, 7), DiHyperEdge[Int](7, 2))
val allOrders: Set[Vector[Int]] = nodesToValues(
TopologicalSortUtil
.findAllTopologicalOrderPermutations(graph))
assert(allOrders.isEmpty)
}
}
}