Skip to content

Commit 0c4eed6

Browse files
authored
v.depgraph: fix resolve(), add tests (fix #24075), (fix #23970), (fix #23968), (fix #22391) (#24076)
1 parent fcd2eed commit 0c4eed6

File tree

2 files changed

+82
-8
lines changed

2 files changed

+82
-8
lines changed

vlib/v/depgraph/depgraph.v

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,8 @@ pub fn (graph &DepGraph) resolve() &DepGraph {
118118
node_names.add(node.name, node.deps)
119119
node_deps.add(node.name, node.deps)
120120
}
121-
mut iterations := 0
122121
mut resolved := new_dep_graph()
123122
for node_deps.size() != 0 {
124-
iterations++
125123
mut ready_set := []string{}
126124
for name in node_deps.keys {
127125
deps := node_deps.get(name)
@@ -130,12 +128,11 @@ pub fn (graph &DepGraph) resolve() &DepGraph {
130128
}
131129
}
132130
if ready_set.len == 0 {
133-
mut g := new_dep_graph()
134-
g.acyclic = false
131+
resolved.acyclic = false
135132
for name in node_deps.keys {
136-
g.add_with_value(name, node_names.get(name), graph.values[name])
133+
resolved.add_with_value(name, node_names.get(name), graph.values[name])
137134
}
138-
return g
135+
return resolved
139136
}
140137
for name in ready_set {
141138
node_deps.delete(name)
@@ -156,8 +153,12 @@ pub fn (graph &DepGraph) last_node() DepGraphNode {
156153
pub fn (graph &DepGraph) display() string {
157154
mut out := []string{}
158155
for node in graph.nodes {
159-
for dep in node.deps {
160-
out << ' * ${node.name} -> ${dep}'
156+
if node.deps.len == 0 {
157+
out << ' * ${node.name}'
158+
} else {
159+
for dep in node.deps {
160+
out << ' * ${node.name} -> ${dep}'
161+
}
161162
}
162163
}
163164
return out.join('\n')

vlib/v/depgraph/depgraph_test.v

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
module depgraph
2+
3+
fn test_resolve_has_deps_no_cyclic() {
4+
mut g := new_dep_graph()
5+
g.add('A', [])
6+
g.add('B', [])
7+
g.add('X', ['Y', 'G'])
8+
g.add('C', [])
9+
g.add('D', ['A', 'X'])
10+
g.add('E', [])
11+
g.add('F', [])
12+
g.add('G', ['A'])
13+
g.add('H', [])
14+
g.add('Y', [])
15+
resolved_graph := g.resolve()
16+
assert resolved_graph.acyclic
17+
assert resolved_graph.display() == ' * A
18+
* B
19+
* C
20+
* E
21+
* F
22+
* H
23+
* Y
24+
* G -> A
25+
* X -> Y
26+
* X -> G
27+
* D -> A
28+
* D -> X'
29+
}
30+
31+
fn test_resolve_has_deps_cyclic() {
32+
mut g := new_dep_graph()
33+
g.add('A', [])
34+
g.add('B', [])
35+
g.add('X', ['Y', 'G'])
36+
g.add('C', [])
37+
g.add('D', ['A', 'X'])
38+
g.add('E', [])
39+
g.add('F', [])
40+
g.add('G', ['D'])
41+
g.add('H', [])
42+
g.add('Y', [])
43+
resolved_graph := g.resolve()
44+
assert !resolved_graph.acyclic
45+
assert resolved_graph.display() == ' * A
46+
* B
47+
* C
48+
* E
49+
* F
50+
* H
51+
* Y
52+
* X -> Y
53+
* X -> G
54+
* D -> A
55+
* D -> X
56+
* G -> D'
57+
}
58+
59+
fn test_resolve_no_deps() {
60+
mut g := new_dep_graph()
61+
g.add('X', [])
62+
g.add('A', [])
63+
g.add('B', [])
64+
g.add('C', [])
65+
g.add('D', [])
66+
resolved_graph := g.resolve()
67+
assert resolved_graph.acyclic
68+
assert resolved_graph.display() == ' * X
69+
* A
70+
* B
71+
* C
72+
* D'
73+
}

0 commit comments

Comments
 (0)