rgl 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +19 -10
- data/Gemfile +3 -0
- data/{README → README.rdoc} +70 -98
- data/Rakefile +44 -150
- data/examples/canvas.rb +63 -64
- data/examples/examples.rb +42 -42
- data/examples/graph.dot +46 -0
- data/examples/images/example.jpg +0 -0
- data/examples/images/module_graph.jpg +0 -0
- data/examples/images/rgl_modules.png +0 -0
- data/examples/{insel-der-tausend-gefahren.rb → insel_der_tausend_gefahren.rb} +18 -19
- data/examples/north.rb +2 -2
- data/examples/north2.rb +11 -11
- data/examples/rdep-rgl.rb +218 -222
- data/lib/rgl/adjacency.rb +78 -74
- data/lib/rgl/base.rb +160 -78
- data/lib/rgl/bellman_ford.rb +115 -0
- data/lib/rgl/bidirectional.rb +17 -10
- data/lib/rgl/bipartite.rb +87 -0
- data/lib/rgl/condensation.rb +13 -4
- data/lib/rgl/connected_components.rb +38 -30
- data/lib/rgl/dijkstra.rb +158 -0
- data/lib/rgl/dijkstra_visitor.rb +42 -0
- data/lib/rgl/dot.rb +40 -32
- data/lib/rgl/edge_properties_map.rb +55 -0
- data/lib/rgl/edmonds_karp.rb +136 -0
- data/lib/rgl/enumerable_ext.rb +4 -1
- data/lib/rgl/graph_iterator.rb +15 -0
- data/lib/rgl/graph_visitor.rb +138 -0
- data/lib/rgl/graph_wrapper.rb +15 -0
- data/lib/rgl/graphxml.rb +20 -10
- data/lib/rgl/implicit.rb +68 -66
- data/lib/rgl/mutable.rb +37 -31
- data/lib/rgl/path_builder.rb +40 -0
- data/lib/rgl/prim.rb +52 -0
- data/lib/rgl/rdot.rb +411 -374
- data/lib/rgl/topsort.rb +23 -16
- data/lib/rgl/transitivity.rb +29 -27
- data/lib/rgl/traversal.rb +67 -205
- data/rakelib/dep_graph.rake +4 -3
- data/test/bellman_ford_test.rb +187 -0
- data/test/bipartite_test.rb +47 -0
- data/test/components_test.rb +80 -0
- data/test/cycles_test.rb +60 -0
- data/test/dijkstra_test.rb +148 -0
- data/test/directed_graph_test.rb +118 -0
- data/test/dot_test.rb +26 -0
- data/test/edge_properties_map_test.rb +63 -0
- data/test/edge_test.rb +35 -0
- data/test/edmonds_karp_test.rb +105 -0
- data/{tests/TestGraph.rb → test/graph_test.rb} +6 -6
- data/test/graph_xml_test.rb +57 -0
- data/test/implicit_test.rb +53 -0
- data/test/prim_test.rb +98 -0
- data/{tests/TestRdot.rb → test/rdot_test.rb} +309 -308
- data/{tests → test}/test_helper.rb +4 -1
- data/{tests/TestTransitivity.rb → test/transitivity_test.rb} +43 -43
- data/test/traversal_test.rb +221 -0
- data/test/undirected_graph_test.rb +103 -0
- metadata +226 -145
- data/examples/example.jpg +0 -0
- data/examples/module_graph.jpg +0 -0
- data/install.rb +0 -49
- data/tests/TestComponents.rb +0 -65
- data/tests/TestCycles.rb +0 -61
- data/tests/TestDirectedGraph.rb +0 -125
- data/tests/TestDot.rb +0 -18
- data/tests/TestEdge.rb +0 -34
- data/tests/TestGraphXML.rb +0 -57
- data/tests/TestImplicit.rb +0 -52
- data/tests/TestTraversal.rb +0 -220
- data/tests/TestUnDirectedGraph.rb +0 -102
data/test/prim_test.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
require 'rgl/prim'
|
4
|
+
require 'rgl/adjacency'
|
5
|
+
|
6
|
+
include RGL
|
7
|
+
|
8
|
+
class TestPrim < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@graph = AdjacencyGraph[1,2, 1,3, 2,3, 2,4, 3,4]
|
12
|
+
|
13
|
+
@edge_weights = {
|
14
|
+
[1, 2] => 10,
|
15
|
+
[1, 3] => 1,
|
16
|
+
[2, 3] => 1,
|
17
|
+
[2, 4] => 1,
|
18
|
+
[3, 4] => 10
|
19
|
+
}
|
20
|
+
|
21
|
+
@edge_weights_lambda = lambda { |edge| @edge_weights[edge] }
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_minimum_spanning_tree
|
25
|
+
assert(minimum_spanning_tree.is_a?(AdjacencyGraph))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_minimum_spanning_tree_edges
|
29
|
+
assert_equal([[1, 3], [2, 3], [2, 4]], minimum_spanning_tree_edges)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_minimum_spanning_tree_for_disconnected_graph
|
33
|
+
@graph.add_edge(5, 6)
|
34
|
+
@graph.add_edge(6, 7)
|
35
|
+
@edge_weights.merge!([5, 6] => 1, [6, 7] => 2)
|
36
|
+
|
37
|
+
assert_equal([[1, 3], [2, 3], [2, 4]], minimum_spanning_tree_edges(@edge_weights, 1))
|
38
|
+
assert_equal([[5, 6], [6, 7]], minimum_spanning_tree_edges(@edge_weights, 5))
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_visitor
|
42
|
+
visitor = DijkstraVisitor.new(@graph)
|
43
|
+
|
44
|
+
events = []
|
45
|
+
|
46
|
+
%w[examine_vertex examine_edge edge_relaxed edge_not_relaxed finish_vertex].each do |event|
|
47
|
+
visitor.send("set_#{event}_event_handler") { |*args| events << { event.to_sym => args } }
|
48
|
+
end
|
49
|
+
|
50
|
+
@graph.prim_minimum_spanning_tree(@edge_weights, 1, visitor)
|
51
|
+
|
52
|
+
assert_equal(
|
53
|
+
[
|
54
|
+
{ :examine_vertex => [1] },
|
55
|
+
{ :examine_edge => [1, 2] },
|
56
|
+
{ :edge_relaxed => [1, 2] },
|
57
|
+
{ :examine_edge => [1, 3] },
|
58
|
+
{ :edge_relaxed => [1, 3] },
|
59
|
+
{ :finish_vertex => [1] },
|
60
|
+
{ :examine_vertex => [3] },
|
61
|
+
{ :examine_edge => [3, 2] },
|
62
|
+
{ :edge_relaxed => [3, 2] },
|
63
|
+
{ :examine_edge => [3, 4] },
|
64
|
+
{ :edge_relaxed => [3, 4] },
|
65
|
+
{ :finish_vertex => [3] },
|
66
|
+
{ :examine_vertex => [2] },
|
67
|
+
{ :examine_edge => [2, 4] },
|
68
|
+
{ :edge_relaxed => [2, 4] },
|
69
|
+
{ :finish_vertex => [2] },
|
70
|
+
{ :examine_vertex => [4] },
|
71
|
+
{ :finish_vertex => [4] },
|
72
|
+
],
|
73
|
+
events
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_negative_weights
|
78
|
+
@edge_weights[[1, 3]] = -2
|
79
|
+
@edge_weights[[2, 3]] = -2
|
80
|
+
|
81
|
+
assert_equal([[1, 3], [2, 3], [2, 4]], minimum_spanning_tree_edges)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def minimum_spanning_tree_edges(edge_weights = @edge_weights, start_vertex = nil)
|
87
|
+
sorted_edges(@graph.prim_minimum_spanning_tree(edge_weights, start_vertex))
|
88
|
+
end
|
89
|
+
|
90
|
+
def minimum_spanning_tree(edge_weights = @edge_weights)
|
91
|
+
@graph.prim_minimum_spanning_tree(edge_weights)
|
92
|
+
end
|
93
|
+
|
94
|
+
def sorted_edges(graph)
|
95
|
+
graph.edges.map { |e| [e.source, e.target].sort }.sort
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require '
|
1
|
+
require 'test_helper'
|
2
|
+
|
2
3
|
require 'rgl/rdot'
|
3
4
|
|
4
5
|
include RGL
|
@@ -44,7 +45,7 @@ class TestDotPort < Test::Unit::TestCase
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def test_name_label_and_nested_ports
|
47
|
-
port
|
48
|
+
port = DOT::Port.new('test_name', 'test_label')
|
48
49
|
port.ports = [DOT::Port.new(nil, 'a'), DOT::Port.new(nil, 'b')]
|
49
50
|
assert_equal('{a | b}', port.to_s)
|
50
51
|
end
|
@@ -55,51 +56,51 @@ class TestDotNode < Test::Unit::TestCase
|
|
55
56
|
|
56
57
|
def test_no_name
|
57
58
|
node = DOT::Node.new()
|
58
|
-
dot
|
59
|
+
dot = node.to_s
|
59
60
|
assert_nil(dot)
|
60
61
|
end
|
61
62
|
|
62
63
|
# bug 16125
|
63
64
|
def test_1prop_0comma
|
64
|
-
node = DOT::Node.new({"label"=>"the_label"})
|
65
|
-
dot
|
65
|
+
node = DOT::Node.new({ "label" => "the_label" })
|
66
|
+
dot = node.to_s
|
66
67
|
assert_no_match(dot, /,/)
|
67
68
|
end
|
68
69
|
|
69
70
|
def test_2prop_1comma
|
70
|
-
node = DOT::Node.new({"label"=>"the_label", "shape"=>"ellipse"})
|
71
|
-
dot
|
71
|
+
node = DOT::Node.new({ "label" => "the_label", "shape" => "ellipse" })
|
72
|
+
dot = node.to_s
|
72
73
|
assert_match(dot, /\[[^,]*,[^,]*\]/)
|
73
74
|
end
|
74
75
|
|
75
76
|
def test_name_without_label
|
76
|
-
node = DOT::Node.new({"name"=>"test_name"})
|
77
|
-
dot
|
77
|
+
node = DOT::Node.new({ "name" => "test_name" })
|
78
|
+
dot = node.to_s
|
78
79
|
assert_no_match(dot, /label/)
|
79
80
|
end
|
80
81
|
|
81
82
|
def test_no_label
|
82
|
-
node = DOT::Node.new({"shape"=>"ellipse"})
|
83
|
-
dot
|
83
|
+
node = DOT::Node.new({ "shape" => "ellipse" })
|
84
|
+
dot = node.to_s
|
84
85
|
assert_no_match(dot, /label/)
|
85
86
|
end
|
86
87
|
|
87
88
|
def test_Mrecord_no_label_no_ports
|
88
|
-
node = DOT::Node.new({"name" => "test_name", "shape"=>"Mrecord"})
|
89
|
-
dot
|
89
|
+
node = DOT::Node.new({ "name" => "test_name", "shape" => "Mrecord" })
|
90
|
+
dot = node.to_s
|
90
91
|
assert_match(dot, /shape\s*=\s*Mrecord/)
|
91
92
|
assert_no_match(dot, /label/)
|
92
93
|
end
|
93
94
|
|
94
95
|
def test_Mrecord_label_no_ports
|
95
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "test_label", "shape"=>"Mrecord"})
|
96
|
-
dot
|
96
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "test_label", "shape" => "Mrecord" })
|
97
|
+
dot = node.to_s
|
97
98
|
assert_match(dot, /shape\s*=\s*Mrecord/)
|
98
99
|
assert_match(dot, /label\s*=\s*test_label/)
|
99
100
|
end
|
100
101
|
|
101
102
|
def test_Mrecord_label_with_ports
|
102
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "test_label", "shape"=>"Mrecord"})
|
103
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "test_label", "shape" => "Mrecord" })
|
103
104
|
node.ports << DOT::Port.new(nil, "a")
|
104
105
|
node.ports << DOT::Port.new(nil, "b")
|
105
106
|
dot = node.to_s
|
@@ -108,7 +109,7 @@ class TestDotNode < Test::Unit::TestCase
|
|
108
109
|
end
|
109
110
|
|
110
111
|
def test_Mrecord_no_label_with_ports
|
111
|
-
node = DOT::Node.new({"name" => "test_name", "shape"=>"Mrecord"})
|
112
|
+
node = DOT::Node.new({ "name" => "test_name", "shape" => "Mrecord" })
|
112
113
|
node.ports << DOT::Port.new(nil, "a")
|
113
114
|
node.ports << DOT::Port.new(nil, "b")
|
114
115
|
dot = node.to_s
|
@@ -117,21 +118,21 @@ class TestDotNode < Test::Unit::TestCase
|
|
117
118
|
end
|
118
119
|
|
119
120
|
def test_record_no_label_no_ports
|
120
|
-
node = DOT::Node.new({"name" => "test_name", "shape"=>"record"})
|
121
|
-
dot
|
121
|
+
node = DOT::Node.new({ "name" => "test_name", "shape" => "record" })
|
122
|
+
dot = node.to_s
|
122
123
|
assert_match(dot, /shape\s*=\s*record/)
|
123
124
|
assert_no_match(dot, /label/)
|
124
125
|
end
|
125
126
|
|
126
127
|
def test_record_label_no_ports
|
127
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "test_label", "shape"=>"record"})
|
128
|
-
dot
|
128
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "test_label", "shape" => "record" })
|
129
|
+
dot = node.to_s
|
129
130
|
assert_match(dot, /shape\s*=\s*record/)
|
130
131
|
assert_match(dot, /label\s*=\s*test_label/)
|
131
132
|
end
|
132
133
|
|
133
134
|
def test_record_label_with_ports
|
134
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "test_label", "shape"=>"record"})
|
135
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "test_label", "shape" => "record" })
|
135
136
|
node.ports << DOT::Port.new(nil, "a")
|
136
137
|
node.ports << DOT::Port.new(nil, "b")
|
137
138
|
dot = node.to_s
|
@@ -140,7 +141,7 @@ class TestDotNode < Test::Unit::TestCase
|
|
140
141
|
end
|
141
142
|
|
142
143
|
def test_record_no_label_with_ports
|
143
|
-
node = DOT::Node.new({"name" => "test_name", "shape"=>"record"})
|
144
|
+
node = DOT::Node.new({ "name" => "test_name", "shape" => "record" })
|
144
145
|
node.ports << DOT::Port.new(nil, "a")
|
145
146
|
node.ports << DOT::Port.new(nil, "b")
|
146
147
|
dot = node.to_s
|
@@ -149,7 +150,7 @@ class TestDotNode < Test::Unit::TestCase
|
|
149
150
|
end
|
150
151
|
|
151
152
|
def test_no_shape_no_label_no_ports
|
152
|
-
node = DOT::Node.new({"name" => "test_name"})
|
153
|
+
node = DOT::Node.new({ "name" => "test_name" })
|
153
154
|
node.ports << DOT::Port.new(nil, "a")
|
154
155
|
node.ports << DOT::Port.new(nil, "b")
|
155
156
|
dot = node.to_s
|
@@ -158,7 +159,7 @@ class TestDotNode < Test::Unit::TestCase
|
|
158
159
|
end
|
159
160
|
|
160
161
|
def test_no_shape_no_label_with_ports
|
161
|
-
node = DOT::Node.new({"name" => "test_name"})
|
162
|
+
node = DOT::Node.new({ "name" => "test_name" })
|
162
163
|
node.ports << DOT::Port.new(nil, "a")
|
163
164
|
node.ports << DOT::Port.new(nil, "b")
|
164
165
|
dot = node.to_s
|
@@ -167,140 +168,140 @@ class TestDotNode < Test::Unit::TestCase
|
|
167
168
|
end
|
168
169
|
|
169
170
|
def test_name_quoting
|
170
|
-
node = DOT::Node.new({"name" => "Name with spaces"})
|
171
|
-
dot
|
171
|
+
node = DOT::Node.new({ "name" => "Name with spaces" })
|
172
|
+
dot = node.to_s
|
172
173
|
assert_match(dot, /^"Name with spaces"$/)
|
173
174
|
|
174
|
-
node = DOT::Node.new({"name" => "Name with \"quotes\""})
|
175
|
-
dot
|
175
|
+
node = DOT::Node.new({ "name" => "Name with \"quotes\"" })
|
176
|
+
dot = node.to_s
|
176
177
|
assert_match(dot, /^"Name with \\"quotes\\""$/)
|
177
178
|
|
178
|
-
node = DOT::Node.new({"name" => "Name with \\backslashes\\"})
|
179
|
-
dot
|
179
|
+
node = DOT::Node.new({ "name" => "Name with \\backslashes\\" })
|
180
|
+
dot = node.to_s
|
180
181
|
assert_match(dot, /^"Name with \\\\backslashes\\\\"$/)
|
181
182
|
|
182
|
-
node = DOT::Node.new({"name" => "Name with\nembedded\nnewlines"})
|
183
|
-
dot
|
183
|
+
node = DOT::Node.new({ "name" => "Name with\nembedded\nnewlines" })
|
184
|
+
dot = node.to_s
|
184
185
|
assert_match(dot, /\A.*"Name with\nembedded\nnewlines".*\Z/m)
|
185
186
|
|
186
|
-
node = DOT::Node.new({"name" => "Name_with_trailing_newline\n"})
|
187
|
-
dot
|
187
|
+
node = DOT::Node.new({ "name" => "Name_with_trailing_newline\n" })
|
188
|
+
dot = node.to_s
|
188
189
|
assert_match(dot, /\A.*"Name_with_trailing_newline\n".*\Z/m)
|
189
190
|
|
190
|
-
node = DOT::Node.new({"name" => "123.456"})
|
191
|
-
dot
|
191
|
+
node = DOT::Node.new({ "name" => "123.456" })
|
192
|
+
dot = node.to_s
|
192
193
|
assert_match(dot, /^123.456$/)
|
193
194
|
|
194
|
-
node = DOT::Node.new({"name" => ".456"})
|
195
|
-
dot
|
195
|
+
node = DOT::Node.new({ "name" => ".456" })
|
196
|
+
dot = node.to_s
|
196
197
|
assert_match(dot, /^.456$/)
|
197
198
|
|
198
|
-
node = DOT::Node.new({"name" => "-.456"})
|
199
|
-
dot
|
199
|
+
node = DOT::Node.new({ "name" => "-.456" })
|
200
|
+
dot = node.to_s
|
200
201
|
assert_match(dot, /^-.456$/)
|
201
202
|
|
202
|
-
node = DOT::Node.new({"name" => "-456"})
|
203
|
-
dot
|
203
|
+
node = DOT::Node.new({ "name" => "-456" })
|
204
|
+
dot = node.to_s
|
204
205
|
assert_match(dot, /^-456$/)
|
205
206
|
|
206
|
-
node = DOT::Node.new({"name" => "-123.456"})
|
207
|
-
dot
|
207
|
+
node = DOT::Node.new({ "name" => "-123.456" })
|
208
|
+
dot = node.to_s
|
208
209
|
assert_match(dot, /^-123.456$/)
|
209
210
|
|
210
|
-
node = DOT::Node.new({"name" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
211
|
-
dot
|
211
|
+
node = DOT::Node.new({ "name" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
212
|
+
dot = node.to_s
|
212
213
|
assert_match(dot, /^<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>$/)
|
213
214
|
end
|
214
215
|
|
215
216
|
def test_label_quoting
|
216
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Label with spaces"})
|
217
|
-
dot
|
217
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Label with spaces" })
|
218
|
+
dot = node.to_s
|
218
219
|
assert_match(dot, /label\s*=\s*"Label with spaces"/)
|
219
220
|
|
220
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Label with \"quotes\""})
|
221
|
-
dot
|
221
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Label with \"quotes\"" })
|
222
|
+
dot = node.to_s
|
222
223
|
assert_match(dot, /label\s*=\s*"Label with \\"quotes\\""/)
|
223
224
|
|
224
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Label with \\backslashes\\"})
|
225
|
-
dot
|
225
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Label with \\backslashes\\" })
|
226
|
+
dot = node.to_s
|
226
227
|
assert_match(dot, /label\s*=\s*"Label with \\\\backslashes\\\\"/)
|
227
228
|
|
228
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Label with\nembedded\nnewlines"})
|
229
|
-
dot
|
229
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Label with\nembedded\nnewlines" })
|
230
|
+
dot = node.to_s
|
230
231
|
assert_match(dot, /label\s*=\s*"Label with\\nembedded\\nnewlines"/)
|
231
232
|
|
232
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Label_with_a_trailing_newline\n"})
|
233
|
-
dot
|
233
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Label_with_a_trailing_newline\n" })
|
234
|
+
dot = node.to_s
|
234
235
|
assert_match(dot, /label\s*=\s*"Label_with_a_trailing_newline\\n"/)
|
235
236
|
|
236
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Left justified label\\l"})
|
237
|
-
dot
|
237
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Left justified label\\l" })
|
238
|
+
dot = node.to_s
|
238
239
|
assert_match(dot, /label\s*=\s*"Left justified label\\l"/)
|
239
240
|
|
240
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "Right justified label\\r"})
|
241
|
-
dot
|
241
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "Right justified label\\r" })
|
242
|
+
dot = node.to_s
|
242
243
|
assert_match(dot, /label\s*=\s*"Right justified label\\r"/)
|
243
244
|
|
244
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "123.456"})
|
245
|
-
dot
|
245
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "123.456" })
|
246
|
+
dot = node.to_s
|
246
247
|
assert_match(dot, /label\s*=\s*123.456/)
|
247
248
|
|
248
|
-
node = DOT::Node.new({"name" => "test_name", "label" => ".456"})
|
249
|
-
dot
|
249
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => ".456" })
|
250
|
+
dot = node.to_s
|
250
251
|
assert_match(dot, /label\s*=\s*.456/)
|
251
252
|
|
252
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "-.456"})
|
253
|
-
dot
|
253
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "-.456" })
|
254
|
+
dot = node.to_s
|
254
255
|
assert_match(dot, /label\s*=\s*-.456/)
|
255
256
|
|
256
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "-456"})
|
257
|
-
dot
|
257
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "-456" })
|
258
|
+
dot = node.to_s
|
258
259
|
assert_match(dot, /label\s*=\s*-456/)
|
259
260
|
|
260
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "-123.456"})
|
261
|
-
dot
|
261
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "-123.456" })
|
262
|
+
dot = node.to_s
|
262
263
|
assert_match(dot, /label\s*=\s*-123.456/)
|
263
264
|
|
264
|
-
node = DOT::Node.new({"name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
265
|
-
dot
|
265
|
+
node = DOT::Node.new({ "name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
266
|
+
dot = node.to_s
|
266
267
|
assert_match(dot, /label\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
267
268
|
end
|
268
269
|
|
269
270
|
def test_option_quoting
|
270
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "Comment with spaces"})
|
271
|
-
dot
|
271
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "Comment with spaces" })
|
272
|
+
dot = node.to_s
|
272
273
|
assert_match(dot, /comment\s*=\s*"Comment with spaces"/)
|
273
274
|
|
274
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "Comment with \"quotes\""})
|
275
|
-
dot
|
275
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "Comment with \"quotes\"" })
|
276
|
+
dot = node.to_s
|
276
277
|
assert_match(dot, /comment\s*=\s*"Comment with \\"quotes\\""/)
|
277
278
|
|
278
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "Comment with \\backslashes\\"})
|
279
|
-
dot
|
279
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "Comment with \\backslashes\\" })
|
280
|
+
dot = node.to_s
|
280
281
|
assert_match(dot, /comment\s*=\s*"Comment with \\\\backslashes\\\\"/)
|
281
282
|
|
282
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "123.456"})
|
283
|
-
dot
|
283
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "123.456" })
|
284
|
+
dot = node.to_s
|
284
285
|
assert_match(dot, /comment\s*=\s*123.456/)
|
285
286
|
|
286
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => ".456"})
|
287
|
-
dot
|
287
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => ".456" })
|
288
|
+
dot = node.to_s
|
288
289
|
assert_match(dot, /comment\s*=\s*.456/)
|
289
290
|
|
290
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "-.456"})
|
291
|
-
dot
|
291
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "-.456" })
|
292
|
+
dot = node.to_s
|
292
293
|
assert_match(dot, /comment\s*=\s*-.456/)
|
293
294
|
|
294
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "-456"})
|
295
|
-
dot
|
295
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "-456" })
|
296
|
+
dot = node.to_s
|
296
297
|
assert_match(dot, /comment\s*=\s*-456/)
|
297
298
|
|
298
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "-123.456"})
|
299
|
-
dot
|
299
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "-123.456" })
|
300
|
+
dot = node.to_s
|
300
301
|
assert_match(dot, /comment\s*=\s*-123.456/)
|
301
302
|
|
302
|
-
node = DOT::Node.new({"name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
303
|
-
dot
|
303
|
+
node = DOT::Node.new({ "name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
304
|
+
dot = node.to_s
|
304
305
|
assert_match(dot, /comment\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
305
306
|
end
|
306
307
|
end
|
@@ -309,26 +310,26 @@ end
|
|
309
310
|
class TestDotEdge < Test::Unit::TestCase
|
310
311
|
|
311
312
|
def test_0prop
|
312
|
-
edge = DOT::Edge.new({'from' => 'a', 'to' => 'b'})
|
313
|
-
dot
|
313
|
+
edge = DOT::Edge.new({ 'from' => 'a', 'to' => 'b' })
|
314
|
+
dot = edge.to_s
|
314
315
|
assert_equal('a -- b', dot)
|
315
316
|
end
|
316
317
|
|
317
318
|
def test_1prop_0comma
|
318
|
-
edge = DOT::Edge.new({"label"=>"the_label"})
|
319
|
-
dot
|
319
|
+
edge = DOT::Edge.new({ "label" => "the_label" })
|
320
|
+
dot = edge.to_s
|
320
321
|
assert_no_match(dot, /,/)
|
321
322
|
end
|
322
323
|
|
323
324
|
def test_2prop_1comma
|
324
|
-
edge = DOT::Edge.new({"label"=>"the_label", "weight"=>"2"})
|
325
|
-
dot
|
325
|
+
edge = DOT::Edge.new({ "label" => "the_label", "weight" => "2" })
|
326
|
+
dot = edge.to_s
|
326
327
|
assert_match(dot, /\[[^,]*,[^,]*\]/)
|
327
328
|
end
|
328
329
|
|
329
330
|
def test_no_label
|
330
|
-
edge = DOT::Edge.new({"weight"=>"2"})
|
331
|
-
dot
|
331
|
+
edge = DOT::Edge.new({ "weight" => "2" })
|
332
|
+
dot = edge.to_s
|
332
333
|
assert_no_match(dot, /label/)
|
333
334
|
end
|
334
335
|
end
|
@@ -337,26 +338,26 @@ end
|
|
337
338
|
class TestDotDirectedEdge < Test::Unit::TestCase
|
338
339
|
|
339
340
|
def test_0prop
|
340
|
-
edge = DOT::DirectedEdge.new({'from' => 'a', 'to' => 'b'})
|
341
|
-
dot
|
341
|
+
edge = DOT::DirectedEdge.new({ 'from' => 'a', 'to' => 'b' })
|
342
|
+
dot = edge.to_s
|
342
343
|
assert_equal('a -> b', dot)
|
343
344
|
end
|
344
345
|
|
345
346
|
def test_1prop_0comma
|
346
|
-
edge = DOT::DirectedEdge.new({"label"=>"the_label"})
|
347
|
-
dot
|
347
|
+
edge = DOT::DirectedEdge.new({ "label" => "the_label" })
|
348
|
+
dot = edge.to_s
|
348
349
|
assert_no_match(dot, /,/)
|
349
350
|
end
|
350
351
|
|
351
352
|
def test_2prop_1comma
|
352
|
-
edge = DOT::DirectedEdge.new({"label"=>"the_label", "weight"=>"2"})
|
353
|
-
dot
|
353
|
+
edge = DOT::DirectedEdge.new({ "label" => "the_label", "weight" => "2" })
|
354
|
+
dot = edge.to_s
|
354
355
|
assert_match(dot, /\[[^,]*,[^,]*\]/)
|
355
356
|
end
|
356
357
|
|
357
358
|
def test_no_label
|
358
|
-
edge = DOT::DirectedEdge.new({"weight"=>"2"})
|
359
|
-
dot
|
359
|
+
edge = DOT::DirectedEdge.new({ "weight" => "2" })
|
360
|
+
dot = edge.to_s
|
360
361
|
assert_no_match(dot, /label/)
|
361
362
|
end
|
362
363
|
end
|
@@ -365,145 +366,145 @@ end
|
|
365
366
|
class TestDotGraph < Test::Unit::TestCase
|
366
367
|
def test_graph_statement
|
367
368
|
graph = DOT::Graph.new()
|
368
|
-
dot
|
369
|
+
dot = graph.to_s
|
369
370
|
assert_match(dot, /^\s*graph /)
|
370
371
|
end
|
371
372
|
|
372
373
|
def test_name_quoting
|
373
|
-
node = DOT::Graph.new({"name" => "Name with spaces"})
|
374
|
-
dot
|
374
|
+
node = DOT::Graph.new({ "name" => "Name with spaces" })
|
375
|
+
dot = node.to_s
|
375
376
|
assert_match(dot, /^graph "Name with spaces" \{$/)
|
376
377
|
|
377
|
-
node = DOT::Graph.new({"name" => "Name with \"quotes\""})
|
378
|
-
dot
|
378
|
+
node = DOT::Graph.new({ "name" => "Name with \"quotes\"" })
|
379
|
+
dot = node.to_s
|
379
380
|
assert_match(dot, /^graph "Name with \\"quotes\\"" \{$/)
|
380
381
|
|
381
|
-
node = DOT::Graph.new({"name" => "Name with \\backslashes\\"})
|
382
|
-
dot
|
382
|
+
node = DOT::Graph.new({ "name" => "Name with \\backslashes\\" })
|
383
|
+
dot = node.to_s
|
383
384
|
assert_match(dot, /^graph "Name with \\\\backslashes\\\\" \{$/)
|
384
385
|
|
385
|
-
node = DOT::Graph.new({"name" => "Name with\nembedded\nnewlines"})
|
386
|
-
dot
|
386
|
+
node = DOT::Graph.new({ "name" => "Name with\nembedded\nnewlines" })
|
387
|
+
dot = node.to_s
|
387
388
|
assert_match(dot, /\A.*"Name with\nembedded\nnewlines".*\Z/m)
|
388
389
|
|
389
|
-
node = DOT::Graph.new({"name" => "Name_with_trailing_newline\n"})
|
390
|
-
dot
|
390
|
+
node = DOT::Graph.new({ "name" => "Name_with_trailing_newline\n" })
|
391
|
+
dot = node.to_s
|
391
392
|
assert_match(dot, /\A.*"Name_with_trailing_newline\n".*\Z/m)
|
392
393
|
|
393
|
-
node = DOT::Graph.new({"name" => "123.456"})
|
394
|
-
dot
|
394
|
+
node = DOT::Graph.new({ "name" => "123.456" })
|
395
|
+
dot = node.to_s
|
395
396
|
assert_match(dot, /^graph 123.456 \{$/)
|
396
397
|
|
397
|
-
node = DOT::Graph.new({"name" => ".456"})
|
398
|
-
dot
|
398
|
+
node = DOT::Graph.new({ "name" => ".456" })
|
399
|
+
dot = node.to_s
|
399
400
|
assert_match(dot, /^graph .456 \{$/)
|
400
401
|
|
401
|
-
node = DOT::Graph.new({"name" => "-.456"})
|
402
|
-
dot
|
402
|
+
node = DOT::Graph.new({ "name" => "-.456" })
|
403
|
+
dot = node.to_s
|
403
404
|
assert_match(dot, /^graph -.456 \{$/)
|
404
405
|
|
405
|
-
node = DOT::Graph.new({"name" => "-456"})
|
406
|
-
dot
|
406
|
+
node = DOT::Graph.new({ "name" => "-456" })
|
407
|
+
dot = node.to_s
|
407
408
|
assert_match(dot, /^graph -456 \{$/)
|
408
409
|
|
409
|
-
node = DOT::Graph.new({"name" => "-123.456"})
|
410
|
-
dot
|
410
|
+
node = DOT::Graph.new({ "name" => "-123.456" })
|
411
|
+
dot = node.to_s
|
411
412
|
assert_match(dot, /^graph -123.456 \{$/)
|
412
413
|
|
413
|
-
node = DOT::Graph.new({"name" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
414
|
-
dot
|
414
|
+
node = DOT::Graph.new({ "name" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
415
|
+
dot = node.to_s
|
415
416
|
assert_match(dot, /^graph <html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html> \{$/)
|
416
417
|
end
|
417
418
|
|
418
419
|
def test_label_quoting
|
419
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Label with spaces"})
|
420
|
-
dot
|
420
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Label with spaces" })
|
421
|
+
dot = node.to_s
|
421
422
|
assert_match(dot, /label\s*=\s*"Label with spaces"/)
|
422
423
|
|
423
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Label with \"quotes\""})
|
424
|
-
dot
|
424
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Label with \"quotes\"" })
|
425
|
+
dot = node.to_s
|
425
426
|
assert_match(dot, /label\s*=\s*"Label with \\"quotes\\""/)
|
426
427
|
|
427
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Label with \\backslashes\\"})
|
428
|
-
dot
|
428
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Label with \\backslashes\\" })
|
429
|
+
dot = node.to_s
|
429
430
|
assert_match(dot, /label\s*=\s*"Label with \\\\backslashes\\\\"/)
|
430
431
|
|
431
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Label with\nembedded\nnewlines"})
|
432
|
-
dot
|
432
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Label with\nembedded\nnewlines" })
|
433
|
+
dot = node.to_s
|
433
434
|
assert_match(dot, /label\s*=\s*"Label with\\nembedded\\nnewlines"/)
|
434
435
|
|
435
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Label_with_a_trailing_newline\n"})
|
436
|
-
dot
|
436
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Label_with_a_trailing_newline\n" })
|
437
|
+
dot = node.to_s
|
437
438
|
assert_match(dot, /label\s*=\s*"Label_with_a_trailing_newline\\n"/)
|
438
439
|
|
439
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Left justified label\\l"})
|
440
|
-
dot
|
440
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Left justified label\\l" })
|
441
|
+
dot = node.to_s
|
441
442
|
assert_match(dot, /label\s*=\s*"Left justified label\\l"/)
|
442
443
|
|
443
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "Right justified label\\r"})
|
444
|
-
dot
|
444
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "Right justified label\\r" })
|
445
|
+
dot = node.to_s
|
445
446
|
assert_match(dot, /label\s*=\s*"Right justified label\\r"/)
|
446
447
|
|
447
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "123.456"})
|
448
|
-
dot
|
448
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "123.456" })
|
449
|
+
dot = node.to_s
|
449
450
|
assert_match(dot, /label\s*=\s*123.456/)
|
450
451
|
|
451
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => ".456"})
|
452
|
-
dot
|
452
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => ".456" })
|
453
|
+
dot = node.to_s
|
453
454
|
assert_match(dot, /label\s*=\s*.456/)
|
454
455
|
|
455
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "-.456"})
|
456
|
-
dot
|
456
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "-.456" })
|
457
|
+
dot = node.to_s
|
457
458
|
assert_match(dot, /label\s*=\s*-.456/)
|
458
459
|
|
459
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "-456"})
|
460
|
-
dot
|
460
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "-456" })
|
461
|
+
dot = node.to_s
|
461
462
|
assert_match(dot, /label\s*=\s*-456/)
|
462
463
|
|
463
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "-123.456"})
|
464
|
-
dot
|
464
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "-123.456" })
|
465
|
+
dot = node.to_s
|
465
466
|
assert_match(dot, /label\s*=\s*-123.456/)
|
466
467
|
|
467
|
-
node = DOT::Graph.new({"name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
468
|
-
dot
|
468
|
+
node = DOT::Graph.new({ "name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
469
|
+
dot = node.to_s
|
469
470
|
assert_match(dot, /label\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
470
471
|
end
|
471
472
|
|
472
473
|
def test_option_quoting
|
473
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "Comment with spaces"})
|
474
|
-
dot
|
474
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "Comment with spaces" })
|
475
|
+
dot = node.to_s
|
475
476
|
assert_match(dot, /comment\s*=\s*"Comment with spaces"/)
|
476
477
|
|
477
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "Comment with \"quotes\""})
|
478
|
-
dot
|
478
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "Comment with \"quotes\"" })
|
479
|
+
dot = node.to_s
|
479
480
|
assert_match(dot, /comment\s*=\s*"Comment with \\"quotes\\""/)
|
480
481
|
|
481
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "Comment with \\backslashes\\"})
|
482
|
-
dot
|
482
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "Comment with \\backslashes\\" })
|
483
|
+
dot = node.to_s
|
483
484
|
assert_match(dot, /comment\s*=\s*"Comment with \\\\backslashes\\\\"/)
|
484
485
|
|
485
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "123.456"})
|
486
|
-
dot
|
486
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "123.456" })
|
487
|
+
dot = node.to_s
|
487
488
|
assert_match(dot, /comment\s*=\s*123.456/)
|
488
489
|
|
489
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => ".456"})
|
490
|
-
dot
|
490
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => ".456" })
|
491
|
+
dot = node.to_s
|
491
492
|
assert_match(dot, /comment\s*=\s*.456/)
|
492
493
|
|
493
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "-.456"})
|
494
|
-
dot
|
494
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "-.456" })
|
495
|
+
dot = node.to_s
|
495
496
|
assert_match(dot, /comment\s*=\s*-.456/)
|
496
497
|
|
497
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "-456"})
|
498
|
-
dot
|
498
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "-456" })
|
499
|
+
dot = node.to_s
|
499
500
|
assert_match(dot, /comment\s*=\s*-456/)
|
500
501
|
|
501
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "-123.456"})
|
502
|
-
dot
|
502
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "-123.456" })
|
503
|
+
dot = node.to_s
|
503
504
|
assert_match(dot, /comment\s*=\s*-123.456/)
|
504
505
|
|
505
|
-
node = DOT::Graph.new({"name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
506
|
-
dot
|
506
|
+
node = DOT::Graph.new({ "name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
507
|
+
dot = node.to_s
|
507
508
|
assert_match(dot, /comment\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
508
509
|
end
|
509
510
|
|
@@ -532,145 +533,145 @@ end
|
|
532
533
|
class TestDotDigraph < Test::Unit::TestCase
|
533
534
|
def test_digraph_statement
|
534
535
|
digraph = DOT::Digraph.new()
|
535
|
-
dot
|
536
|
+
dot = digraph.to_s
|
536
537
|
assert_match(dot, /^\s*digraph /)
|
537
538
|
end
|
538
539
|
|
539
540
|
def test_name_quoting
|
540
|
-
node = DOT::Digraph.new({"name" => "Name with spaces"})
|
541
|
-
dot
|
541
|
+
node = DOT::Digraph.new({ "name" => "Name with spaces" })
|
542
|
+
dot = node.to_s
|
542
543
|
assert_match(dot, /^digraph "Name with spaces" \{$/)
|
543
544
|
|
544
|
-
node = DOT::Digraph.new({"name" => "Name with \"quotes\""})
|
545
|
-
dot
|
545
|
+
node = DOT::Digraph.new({ "name" => "Name with \"quotes\"" })
|
546
|
+
dot = node.to_s
|
546
547
|
assert_match(dot, /^digraph "Name with \\"quotes\\"" \{$/)
|
547
548
|
|
548
|
-
node = DOT::Digraph.new({"name" => "Name with \\backslashes\\"})
|
549
|
-
dot
|
549
|
+
node = DOT::Digraph.new({ "name" => "Name with \\backslashes\\" })
|
550
|
+
dot = node.to_s
|
550
551
|
assert_match(dot, /^digraph "Name with \\\\backslashes\\\\" \{$/)
|
551
552
|
|
552
|
-
node = DOT::Digraph.new({"name" => "Name with\nembedded\nnewlines"})
|
553
|
-
dot
|
553
|
+
node = DOT::Digraph.new({ "name" => "Name with\nembedded\nnewlines" })
|
554
|
+
dot = node.to_s
|
554
555
|
assert_match(dot, /\A.*"Name with\nembedded\nnewlines".*\Z/m)
|
555
556
|
|
556
|
-
node = DOT::Digraph.new({"name" => "Name_with_trailing_newline\n"})
|
557
|
-
dot
|
557
|
+
node = DOT::Digraph.new({ "name" => "Name_with_trailing_newline\n" })
|
558
|
+
dot = node.to_s
|
558
559
|
assert_match(dot, /\A.*"Name_with_trailing_newline\n".*\Z/m)
|
559
560
|
|
560
|
-
node = DOT::Digraph.new({"name" => "123.456"})
|
561
|
-
dot
|
561
|
+
node = DOT::Digraph.new({ "name" => "123.456" })
|
562
|
+
dot = node.to_s
|
562
563
|
assert_match(dot, /^digraph 123.456 \{$/)
|
563
564
|
|
564
|
-
node = DOT::Digraph.new({"name" => ".456"})
|
565
|
-
dot
|
565
|
+
node = DOT::Digraph.new({ "name" => ".456" })
|
566
|
+
dot = node.to_s
|
566
567
|
assert_match(dot, /^digraph .456 \{$/)
|
567
568
|
|
568
|
-
node = DOT::Digraph.new({"name" => "-.456"})
|
569
|
-
dot
|
569
|
+
node = DOT::Digraph.new({ "name" => "-.456" })
|
570
|
+
dot = node.to_s
|
570
571
|
assert_match(dot, /^digraph -.456 \{$/)
|
571
572
|
|
572
|
-
node = DOT::Digraph.new({"name" => "-456"})
|
573
|
-
dot
|
573
|
+
node = DOT::Digraph.new({ "name" => "-456" })
|
574
|
+
dot = node.to_s
|
574
575
|
assert_match(dot, /^digraph -456 \{$/)
|
575
576
|
|
576
|
-
node = DOT::Digraph.new({"name" => "-123.456"})
|
577
|
-
dot
|
577
|
+
node = DOT::Digraph.new({ "name" => "-123.456" })
|
578
|
+
dot = node.to_s
|
578
579
|
assert_match(dot, /^digraph -123.456 \{$/)
|
579
580
|
|
580
|
-
node = DOT::Digraph.new({"name" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
581
|
-
dot
|
581
|
+
node = DOT::Digraph.new({ "name" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
582
|
+
dot = node.to_s
|
582
583
|
assert_match(dot, /^digraph <html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html> \{$/)
|
583
584
|
end
|
584
585
|
|
585
586
|
def test_label_quoting
|
586
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Label with spaces"})
|
587
|
-
dot
|
587
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Label with spaces" })
|
588
|
+
dot = node.to_s
|
588
589
|
assert_match(dot, /label\s*=\s*"Label with spaces"/)
|
589
590
|
|
590
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Label with \"quotes\""})
|
591
|
-
dot
|
591
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Label with \"quotes\"" })
|
592
|
+
dot = node.to_s
|
592
593
|
assert_match(dot, /label\s*=\s*"Label with \\"quotes\\""/)
|
593
594
|
|
594
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Label with \\backslashes\\"})
|
595
|
-
dot
|
595
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Label with \\backslashes\\" })
|
596
|
+
dot = node.to_s
|
596
597
|
assert_match(dot, /label\s*=\s*"Label with \\\\backslashes\\\\"/)
|
597
598
|
|
598
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Label with\nembedded\nnewlines"})
|
599
|
-
dot
|
599
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Label with\nembedded\nnewlines" })
|
600
|
+
dot = node.to_s
|
600
601
|
assert_match(dot, /label\s*=\s*"Label with\\nembedded\\nnewlines"/)
|
601
602
|
|
602
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Label_with_a_trailing_newline\n"})
|
603
|
-
dot
|
603
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Label_with_a_trailing_newline\n" })
|
604
|
+
dot = node.to_s
|
604
605
|
assert_match(dot, /label\s*=\s*"Label_with_a_trailing_newline\\n"/)
|
605
606
|
|
606
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Left justified label\\l"})
|
607
|
-
dot
|
607
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Left justified label\\l" })
|
608
|
+
dot = node.to_s
|
608
609
|
assert_match(dot, /label\s*=\s*"Left justified label\\l"/)
|
609
610
|
|
610
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "Right justified label\\r"})
|
611
|
-
dot
|
611
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "Right justified label\\r" })
|
612
|
+
dot = node.to_s
|
612
613
|
assert_match(dot, /label\s*=\s*"Right justified label\\r"/)
|
613
614
|
|
614
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "123.456"})
|
615
|
-
dot
|
615
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "123.456" })
|
616
|
+
dot = node.to_s
|
616
617
|
assert_match(dot, /label\s*=\s*123.456/)
|
617
618
|
|
618
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => ".456"})
|
619
|
-
dot
|
619
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => ".456" })
|
620
|
+
dot = node.to_s
|
620
621
|
assert_match(dot, /label\s*=\s*.456/)
|
621
622
|
|
622
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "-.456"})
|
623
|
-
dot
|
623
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "-.456" })
|
624
|
+
dot = node.to_s
|
624
625
|
assert_match(dot, /label\s*=\s*-.456/)
|
625
626
|
|
626
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "-456"})
|
627
|
-
dot
|
627
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "-456" })
|
628
|
+
dot = node.to_s
|
628
629
|
assert_match(dot, /label\s*=\s*-456/)
|
629
630
|
|
630
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "-123.456"})
|
631
|
-
dot
|
631
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "-123.456" })
|
632
|
+
dot = node.to_s
|
632
633
|
assert_match(dot, /label\s*=\s*-123.456/)
|
633
634
|
|
634
|
-
node = DOT::Digraph.new({"name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
635
|
-
dot
|
635
|
+
node = DOT::Digraph.new({ "name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
636
|
+
dot = node.to_s
|
636
637
|
assert_match(dot, /label\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
637
638
|
end
|
638
639
|
|
639
640
|
def test_option_quoting
|
640
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "Comment with spaces"})
|
641
|
-
dot
|
641
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "Comment with spaces" })
|
642
|
+
dot = node.to_s
|
642
643
|
assert_match(dot, /comment\s*=\s*"Comment with spaces"/)
|
643
644
|
|
644
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "Comment with \"quotes\""})
|
645
|
-
dot
|
645
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "Comment with \"quotes\"" })
|
646
|
+
dot = node.to_s
|
646
647
|
assert_match(dot, /comment\s*=\s*"Comment with \\"quotes\\""/)
|
647
648
|
|
648
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "Comment with \\backslashes\\"})
|
649
|
-
dot
|
649
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "Comment with \\backslashes\\" })
|
650
|
+
dot = node.to_s
|
650
651
|
assert_match(dot, /comment\s*=\s*"Comment with \\\\backslashes\\\\"/)
|
651
652
|
|
652
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "123.456"})
|
653
|
-
dot
|
653
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "123.456" })
|
654
|
+
dot = node.to_s
|
654
655
|
assert_match(dot, /comment\s*=\s*123.456/)
|
655
656
|
|
656
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => ".456"})
|
657
|
-
dot
|
657
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => ".456" })
|
658
|
+
dot = node.to_s
|
658
659
|
assert_match(dot, /comment\s*=\s*.456/)
|
659
660
|
|
660
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "-.456"})
|
661
|
-
dot
|
661
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "-.456" })
|
662
|
+
dot = node.to_s
|
662
663
|
assert_match(dot, /comment\s*=\s*-.456/)
|
663
664
|
|
664
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "-456"})
|
665
|
-
dot
|
665
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "-456" })
|
666
|
+
dot = node.to_s
|
666
667
|
assert_match(dot, /comment\s*=\s*-456/)
|
667
668
|
|
668
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "-123.456"})
|
669
|
-
dot
|
669
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "-123.456" })
|
670
|
+
dot = node.to_s
|
670
671
|
assert_match(dot, /comment\s*=\s*-123.456/)
|
671
672
|
|
672
|
-
node = DOT::Digraph.new({"name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
673
|
-
dot
|
673
|
+
node = DOT::Digraph.new({ "name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
674
|
+
dot = node.to_s
|
674
675
|
assert_match(dot, /comment\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
675
676
|
end
|
676
677
|
|
@@ -699,145 +700,145 @@ end
|
|
699
700
|
class TestDotSubgraph < Test::Unit::TestCase
|
700
701
|
def test_subgraph_statement
|
701
702
|
subgraph = DOT::Subgraph.new()
|
702
|
-
dot
|
703
|
+
dot = subgraph.to_s
|
703
704
|
assert_match(dot, /^\s*subgraph /)
|
704
705
|
end
|
705
706
|
|
706
707
|
def test_name_quoting
|
707
|
-
node = DOT::Subgraph.new({"name" => "Name with spaces"})
|
708
|
-
dot
|
708
|
+
node = DOT::Subgraph.new({ "name" => "Name with spaces" })
|
709
|
+
dot = node.to_s
|
709
710
|
assert_match(dot, /^subgraph "Name with spaces" \{$/)
|
710
711
|
|
711
|
-
node = DOT::Subgraph.new({"name" => "Name with \"quotes\""})
|
712
|
-
dot
|
712
|
+
node = DOT::Subgraph.new({ "name" => "Name with \"quotes\"" })
|
713
|
+
dot = node.to_s
|
713
714
|
assert_match(dot, /^subgraph "Name with \\"quotes\\"" \{$/)
|
714
715
|
|
715
|
-
node = DOT::Subgraph.new({"name" => "Name with \\backslashes\\"})
|
716
|
-
dot
|
716
|
+
node = DOT::Subgraph.new({ "name" => "Name with \\backslashes\\" })
|
717
|
+
dot = node.to_s
|
717
718
|
assert_match(dot, /^subgraph "Name with \\\\backslashes\\\\" \{$/)
|
718
719
|
|
719
|
-
node = DOT::Subgraph.new({"name" => "Name with\nembedded\nnewlines"})
|
720
|
-
dot
|
720
|
+
node = DOT::Subgraph.new({ "name" => "Name with\nembedded\nnewlines" })
|
721
|
+
dot = node.to_s
|
721
722
|
assert_match(dot, /\A.*"Name with\nembedded\nnewlines".*\Z/m)
|
722
723
|
|
723
|
-
node = DOT::Subgraph.new({"name" => "Name_with_trailing_newline\n"})
|
724
|
-
dot
|
724
|
+
node = DOT::Subgraph.new({ "name" => "Name_with_trailing_newline\n" })
|
725
|
+
dot = node.to_s
|
725
726
|
assert_match(dot, /\A.*"Name_with_trailing_newline\n".*\Z/m)
|
726
727
|
|
727
|
-
node = DOT::Subgraph.new({"name" => "123.456"})
|
728
|
-
dot
|
728
|
+
node = DOT::Subgraph.new({ "name" => "123.456" })
|
729
|
+
dot = node.to_s
|
729
730
|
assert_match(dot, /^subgraph 123.456 \{$/)
|
730
731
|
|
731
|
-
node = DOT::Subgraph.new({"name" => ".456"})
|
732
|
-
dot
|
732
|
+
node = DOT::Subgraph.new({ "name" => ".456" })
|
733
|
+
dot = node.to_s
|
733
734
|
assert_match(dot, /^subgraph .456 \{$/)
|
734
735
|
|
735
|
-
node = DOT::Subgraph.new({"name" => "-.456"})
|
736
|
-
dot
|
736
|
+
node = DOT::Subgraph.new({ "name" => "-.456" })
|
737
|
+
dot = node.to_s
|
737
738
|
assert_match(dot, /^subgraph -.456 \{$/)
|
738
739
|
|
739
|
-
node = DOT::Subgraph.new({"name" => "-456"})
|
740
|
-
dot
|
740
|
+
node = DOT::Subgraph.new({ "name" => "-456" })
|
741
|
+
dot = node.to_s
|
741
742
|
assert_match(dot, /^subgraph -456 \{$/)
|
742
743
|
|
743
|
-
node = DOT::Subgraph.new({"name" => "-123.456"})
|
744
|
-
dot
|
744
|
+
node = DOT::Subgraph.new({ "name" => "-123.456" })
|
745
|
+
dot = node.to_s
|
745
746
|
assert_match(dot, /^subgraph -123.456 \{$/)
|
746
747
|
|
747
|
-
node = DOT::Subgraph.new({"name" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
748
|
-
dot
|
748
|
+
node = DOT::Subgraph.new({ "name" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
749
|
+
dot = node.to_s
|
749
750
|
assert_match(dot, /^subgraph <html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html> \{$/)
|
750
751
|
end
|
751
752
|
|
752
753
|
def test_label_quoting
|
753
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Label with spaces"})
|
754
|
-
dot
|
754
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Label with spaces" })
|
755
|
+
dot = node.to_s
|
755
756
|
assert_match(dot, /label\s*=\s*"Label with spaces"/)
|
756
757
|
|
757
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Label with \"quotes\""})
|
758
|
-
dot
|
758
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Label with \"quotes\"" })
|
759
|
+
dot = node.to_s
|
759
760
|
assert_match(dot, /label\s*=\s*"Label with \\"quotes\\""/)
|
760
761
|
|
761
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Label with \\backslashes\\"})
|
762
|
-
dot
|
762
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Label with \\backslashes\\" })
|
763
|
+
dot = node.to_s
|
763
764
|
assert_match(dot, /label\s*=\s*"Label with \\\\backslashes\\\\"/)
|
764
765
|
|
765
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Label with\nembedded\nnewlines"})
|
766
|
-
dot
|
766
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Label with\nembedded\nnewlines" })
|
767
|
+
dot = node.to_s
|
767
768
|
assert_match(dot, /label\s*=\s*"Label with\\nembedded\\nnewlines"/)
|
768
769
|
|
769
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Label_with_a_trailing_newline\n"})
|
770
|
-
dot
|
770
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Label_with_a_trailing_newline\n" })
|
771
|
+
dot = node.to_s
|
771
772
|
assert_match(dot, /label\s*=\s*"Label_with_a_trailing_newline\\n"/)
|
772
773
|
|
773
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Left justified label\\l"})
|
774
|
-
dot
|
774
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Left justified label\\l" })
|
775
|
+
dot = node.to_s
|
775
776
|
assert_match(dot, /label\s*=\s*"Left justified label\\l"/)
|
776
777
|
|
777
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "Right justified label\\r"})
|
778
|
-
dot
|
778
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "Right justified label\\r" })
|
779
|
+
dot = node.to_s
|
779
780
|
assert_match(dot, /label\s*=\s*"Right justified label\\r"/)
|
780
781
|
|
781
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "123.456"})
|
782
|
-
dot
|
782
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "123.456" })
|
783
|
+
dot = node.to_s
|
783
784
|
assert_match(dot, /label\s*=\s*123.456/)
|
784
785
|
|
785
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => ".456"})
|
786
|
-
dot
|
786
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => ".456" })
|
787
|
+
dot = node.to_s
|
787
788
|
assert_match(dot, /label\s*=\s*.456/)
|
788
789
|
|
789
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "-.456"})
|
790
|
-
dot
|
790
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "-.456" })
|
791
|
+
dot = node.to_s
|
791
792
|
assert_match(dot, /label\s*=\s*-.456/)
|
792
793
|
|
793
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "-456"})
|
794
|
-
dot
|
794
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "-456" })
|
795
|
+
dot = node.to_s
|
795
796
|
assert_match(dot, /label\s*=\s*-456/)
|
796
797
|
|
797
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "-123.456"})
|
798
|
-
dot
|
798
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "-123.456" })
|
799
|
+
dot = node.to_s
|
799
800
|
assert_match(dot, /label\s*=\s*-123.456/)
|
800
801
|
|
801
|
-
node = DOT::Subgraph.new({"name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
802
|
-
dot
|
802
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "label" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
803
|
+
dot = node.to_s
|
803
804
|
assert_match(dot, /label\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
804
805
|
end
|
805
806
|
|
806
807
|
def test_option_quoting
|
807
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "Comment with spaces"})
|
808
|
-
dot
|
808
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "Comment with spaces" })
|
809
|
+
dot = node.to_s
|
809
810
|
assert_match(dot, /comment\s*=\s*"Comment with spaces"/)
|
810
811
|
|
811
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "Comment with \"quotes\""})
|
812
|
-
dot
|
812
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "Comment with \"quotes\"" })
|
813
|
+
dot = node.to_s
|
813
814
|
assert_match(dot, /comment\s*=\s*"Comment with \\"quotes\\""/)
|
814
815
|
|
815
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "Comment with \\backslashes\\"})
|
816
|
-
dot
|
816
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "Comment with \\backslashes\\" })
|
817
|
+
dot = node.to_s
|
817
818
|
assert_match(dot, /comment\s*=\s*"Comment with \\\\backslashes\\\\"/)
|
818
819
|
|
819
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "123.456"})
|
820
|
-
dot
|
820
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "123.456" })
|
821
|
+
dot = node.to_s
|
821
822
|
assert_match(dot, /comment\s*=\s*123.456/)
|
822
823
|
|
823
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => ".456"})
|
824
|
-
dot
|
824
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => ".456" })
|
825
|
+
dot = node.to_s
|
825
826
|
assert_match(dot, /comment\s*=\s*.456/)
|
826
827
|
|
827
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "-.456"})
|
828
|
-
dot
|
828
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "-.456" })
|
829
|
+
dot = node.to_s
|
829
830
|
assert_match(dot, /comment\s*=\s*-.456/)
|
830
831
|
|
831
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "-456"})
|
832
|
-
dot
|
832
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "-456" })
|
833
|
+
dot = node.to_s
|
833
834
|
assert_match(dot, /comment\s*=\s*-456/)
|
834
835
|
|
835
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "-123.456"})
|
836
|
-
dot
|
836
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "-123.456" })
|
837
|
+
dot = node.to_s
|
837
838
|
assert_match(dot, /comment\s*=\s*-123.456/)
|
838
839
|
|
839
|
-
node = DOT::Subgraph.new({"name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>"})
|
840
|
-
dot
|
840
|
+
node = DOT::Subgraph.new({ "name" => "test_name", "comment" => "<html><head><title>test</title></head>\n<body>text</body></html>" })
|
841
|
+
dot = node.to_s
|
841
842
|
assert_match(dot, /comment\s*=\s*<html><head><title>test<\/title><\/head>\n<body>text<\/body><\/html>/)
|
842
843
|
end
|
843
844
|
|