rgl 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|