ruby-graphviz_c 1.1.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.
Files changed (184) hide show
  1. checksums.yaml +7 -0
  2. data/.gemrc +0 -0
  3. data/.gitignore +9 -0
  4. data/.travis.yml +7 -0
  5. data/AUTHORS.rdoc +33 -0
  6. data/CHANGELOG.rdoc +287 -0
  7. data/COPYING.rdoc +133 -0
  8. data/Gemfile +4 -0
  9. data/README.rdoc +206 -0
  10. data/Rakefile +71 -0
  11. data/bin/dot2ruby +91 -0
  12. data/bin/gem2gv +165 -0
  13. data/bin/git2gv +167 -0
  14. data/bin/ruby2gv +234 -0
  15. data/bin/xml2gv +96 -0
  16. data/examples/dot/JSP.dot +52 -0
  17. data/examples/dot/balanced.dot +36 -0
  18. data/examples/dot/cluster.dot +30 -0
  19. data/examples/dot/dotgraph.dot +28 -0
  20. data/examples/dot/fsm.dot +20 -0
  21. data/examples/dot/genetic.dot +118 -0
  22. data/examples/dot/hello.dot +1 -0
  23. data/examples/dot/hello_test.rb +33 -0
  24. data/examples/dot/lion_share.dot +103 -0
  25. data/examples/dot/prof.dot +150 -0
  26. data/examples/dot/psg.dot +28 -0
  27. data/examples/dot/rank.dot +6 -0
  28. data/examples/dot/sdh.dot +284 -0
  29. data/examples/dot/siblings.dot +492 -0
  30. data/examples/dot/so-sample001.gv +30 -0
  31. data/examples/dot/so-sample002.gv +33 -0
  32. data/examples/dot/so-sample003.gv +45 -0
  33. data/examples/dot/test.dot +17 -0
  34. data/examples/dot/test_parse.rb +13 -0
  35. data/examples/dot/this_crach_with_dot_2.20.dot +24 -0
  36. data/examples/dot/unix.dot +104 -0
  37. data/examples/graphml/attributes.ext.graphml +12 -0
  38. data/examples/graphml/attributes.graphml +40 -0
  39. data/examples/graphml/cluster.graphml +75 -0
  40. data/examples/graphml/failed_graph.graphml +461 -0
  41. data/examples/graphml/hyper.graphml +29 -0
  42. data/examples/graphml/nested.graphml +54 -0
  43. data/examples/graphml/port.graphml +32 -0
  44. data/examples/graphml/simple.graphml +30 -0
  45. data/examples/hello.png +0 -0
  46. data/examples/rgv/rgv.ps +125 -0
  47. data/examples/rgv/test_rgv.rb +12 -0
  48. data/examples/sample01.rb +32 -0
  49. data/examples/sample02.rb +42 -0
  50. data/examples/sample03.rb +31 -0
  51. data/examples/sample04.rb +22 -0
  52. data/examples/sample05.rb +32 -0
  53. data/examples/sample06.rb +46 -0
  54. data/examples/sample07.rb +23 -0
  55. data/examples/sample08.rb +34 -0
  56. data/examples/sample09.rb +50 -0
  57. data/examples/sample10.rb +50 -0
  58. data/examples/sample11.rb +42 -0
  59. data/examples/sample12.rb +55 -0
  60. data/examples/sample13.rb +48 -0
  61. data/examples/sample14.rb +44 -0
  62. data/examples/sample15.rb +25 -0
  63. data/examples/sample16.rb +8 -0
  64. data/examples/sample17.rb +92 -0
  65. data/examples/sample18.rb +24 -0
  66. data/examples/sample19.rb +59 -0
  67. data/examples/sample20.rb +47 -0
  68. data/examples/sample21.rb +12 -0
  69. data/examples/sample22.rb +10 -0
  70. data/examples/sample23.rb +11 -0
  71. data/examples/sample24.rb +11 -0
  72. data/examples/sample25.rb +11 -0
  73. data/examples/sample26.rb +8 -0
  74. data/examples/sample27.rb +8 -0
  75. data/examples/sample28.rb +12 -0
  76. data/examples/sample29.rb +8 -0
  77. data/examples/sample30.rb +12 -0
  78. data/examples/sample31.rb +10 -0
  79. data/examples/sample32.rb +14 -0
  80. data/examples/sample33.rb +43 -0
  81. data/examples/sample34.rb +29 -0
  82. data/examples/sample35.rb +43 -0
  83. data/examples/sample36.rb +35 -0
  84. data/examples/sample37.rb +87 -0
  85. data/examples/sample38.rb +12 -0
  86. data/examples/sample39.rb +11 -0
  87. data/examples/sample40.rb +17 -0
  88. data/examples/sample41.rb +8 -0
  89. data/examples/sample42.rb +35 -0
  90. data/examples/sample43.rb +26 -0
  91. data/examples/sample44.rb +97 -0
  92. data/examples/sample45.rb +24 -0
  93. data/examples/sample46.rb +43 -0
  94. data/examples/sample47.rb +7 -0
  95. data/examples/sample48.rb +62 -0
  96. data/examples/sample49.rb +10 -0
  97. data/examples/sample50.rb +215 -0
  98. data/examples/sample51.rb +37 -0
  99. data/examples/sample52.rb +62 -0
  100. data/examples/sample53.rb +26 -0
  101. data/examples/sample54.rb +26 -0
  102. data/examples/sample55.rb +9 -0
  103. data/examples/sample56.rb +10 -0
  104. data/examples/sample57.rb +8 -0
  105. data/examples/sample58.rb +33 -0
  106. data/examples/sample59.rb +14 -0
  107. data/examples/sample60.rb +12 -0
  108. data/examples/sample61.rb +12 -0
  109. data/examples/sample62.rb +24 -0
  110. data/examples/sample63.rb +32 -0
  111. data/examples/sample64.rb +31 -0
  112. data/examples/sample65.rb +9 -0
  113. data/examples/sample66.rb +4 -0
  114. data/examples/sample67.rb +10 -0
  115. data/examples/sample68.rb +27 -0
  116. data/examples/sample69.rb +23 -0
  117. data/examples/sample70.rb +9 -0
  118. data/examples/sample99.rb +70 -0
  119. data/examples/sdlshapes/README +2 -0
  120. data/examples/sdlshapes/sdl.ps +655 -0
  121. data/examples/sdlshapes/sdlshapes.dot +78 -0
  122. data/examples/test.xml +26 -0
  123. data/examples/theory/pert.rb +47 -0
  124. data/examples/theory/tests.rb +87 -0
  125. data/lib/ext/gvpr/dot2ruby.g +185 -0
  126. data/lib/graphviz/attrs.rb +73 -0
  127. data/lib/graphviz/constants.rb +294 -0
  128. data/lib/graphviz/core_ext.rb +64 -0
  129. data/lib/graphviz/dot2ruby.rb +59 -0
  130. data/lib/graphviz/dot_script.rb +109 -0
  131. data/lib/graphviz/dsl.rb +67 -0
  132. data/lib/graphviz/edge.rb +197 -0
  133. data/lib/graphviz/elements.rb +39 -0
  134. data/lib/graphviz/ext.rb +17 -0
  135. data/lib/graphviz/family_tree/couple.rb +63 -0
  136. data/lib/graphviz/family_tree/generation.rb +39 -0
  137. data/lib/graphviz/family_tree/person.rb +120 -0
  138. data/lib/graphviz/family_tree/sibling.rb +13 -0
  139. data/lib/graphviz/family_tree.rb +118 -0
  140. data/lib/graphviz/graphml.rb +268 -0
  141. data/lib/graphviz/math/matrix.rb +221 -0
  142. data/lib/graphviz/node.rb +160 -0
  143. data/lib/graphviz/nothugly/nothugly.xsl +321 -0
  144. data/lib/graphviz/nothugly.rb +63 -0
  145. data/lib/graphviz/theory.rb +321 -0
  146. data/lib/graphviz/types/arrow_type.rb +32 -0
  147. data/lib/graphviz/types/color.rb +58 -0
  148. data/lib/graphviz/types/color_list.rb +24 -0
  149. data/lib/graphviz/types/esc_string.rb +20 -0
  150. data/lib/graphviz/types/gv_bool.rb +49 -0
  151. data/lib/graphviz/types/gv_double.rb +32 -0
  152. data/lib/graphviz/types/html_string.rb +18 -0
  153. data/lib/graphviz/types/lbl_string.rb +22 -0
  154. data/lib/graphviz/types/rect.rb +35 -0
  155. data/lib/graphviz/types/spline_type.rb +77 -0
  156. data/lib/graphviz/types.rb +22 -0
  157. data/lib/graphviz/utils/colors.rb +1018 -0
  158. data/lib/graphviz/utils.rb +70 -0
  159. data/lib/graphviz/xml.rb +119 -0
  160. data/lib/graphviz.rb +967 -0
  161. data/lib/ruby-graphviz.rb +1 -0
  162. data/man/dot2ruby.1 +66 -0
  163. data/man/dot2ruby.1.ronn +55 -0
  164. data/man/gem2gv.1 +60 -0
  165. data/man/gem2gv.1.ronn +47 -0
  166. data/man/git2gv.1 +48 -0
  167. data/man/git2gv.1.ronn +40 -0
  168. data/man/ruby2gv.1 +60 -0
  169. data/man/ruby2gv.1.ronn +47 -0
  170. data/man/xml2gv.1 +48 -0
  171. data/man/xml2gv.1.ronn +39 -0
  172. data/ruby-graphviz.gemspec +47 -0
  173. data/setup.rb +1585 -0
  174. data/test/helper.rb +13 -0
  175. data/test/support.rb +95 -0
  176. data/test/test_dot_script.rb +47 -0
  177. data/test/test_examples.rb +151 -0
  178. data/test/test_graph.rb +115 -0
  179. data/test/test_search.rb +29 -0
  180. data/test/test_subgraph.rb +27 -0
  181. data/test/test_theory.rb +98 -0
  182. data/test/test_types.rb +65 -0
  183. data/test/test_utils_colors.rb +52 -0
  184. metadata +301 -0
data/test/helper.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'pathname'
5
+
6
+ cur = Pathname.new(File.expand_path("..", __FILE__))
7
+ lib = cur.join('..', 'lib')
8
+
9
+ $LOAD_PATH.unshift(lib.to_s, cur.to_s)
10
+ require 'graphviz'
11
+ require 'graphviz/theory'
12
+ require 'graphviz/math/matrix'
13
+ require 'graphviz/utils/colors'
data/test/support.rb ADDED
@@ -0,0 +1,95 @@
1
+ require 'helper'
2
+ require 'stringio'
3
+
4
+ # hack so that the example scripts don't unnecessarily unshift @todo
5
+ class << $:
6
+ def unshift path
7
+ include?(path) ? self : super # super will return self, too
8
+ end
9
+ end
10
+
11
+ module TestSupport
12
+ extend self
13
+
14
+ # @todo move to app?
15
+ def windows?
16
+ /mswin|mingw/ =~ RUBY_PLATFORM
17
+ end
18
+
19
+ def dev_null
20
+ windows? ? 'NUL' : '/dev/null'
21
+ end
22
+ end
23
+
24
+ module IoHack
25
+
26
+ #
27
+ # this is a ridiculous hack to capture what was written to $stdout/$stderr for testing
28
+ # an alternative is to use Open3.popen3 on external calls which has overhead
29
+ # and OS dependencies.
30
+ #
31
+ # This hack would apparently not be as bad on 1.9, which would allow you to simply
32
+ # set $stdout and $stderr to instances of StringIO
33
+ #
34
+ # I don't know what is the 'right way' to test this kind of thing
35
+ #
36
+
37
+ class IoHackStream < File
38
+ #
39
+ # pre 1.9 you can't assign $stdout and $stderr to anything other than
40
+ # an IO::File instance. what we *want* is to have them be StringIOs that
41
+ # we can read from like strings for testing. So this is a crazy proxy
42
+ # around StringIO. Note it makes *all* methods except a few protected,
43
+ # which for me was failing silently when i forgot to make the appropriate
44
+ # ones public. hack!
45
+ #
46
+
47
+ except = %w(inspect kind_of?)
48
+ except += except.map{|x| x.to_sym } # for Ruby 1.9
49
+ these = ancestors[0].instance_methods
50
+ # these = [1,2,3].map{|x| ancestors[x].instance_methods(false)}.flatten
51
+ eraseme = (these - except)
52
+ eraseme.each{ |name| protected name }
53
+ attr_reader :io
54
+ def initialize()
55
+ @io = StringIO.new
56
+ super(TestSupport.dev_null, 'r+') # probably doesn't matter the mode
57
+ end
58
+ these = %w(write << puts)
59
+ these.each do |name|
60
+ define_method(name) do |*a|
61
+ @io.send(name, *a)
62
+ end
63
+ end
64
+ end
65
+
66
+ def fake_popen2 path
67
+ push_io
68
+ require path # caller assumes responsibility for exceptions vis-a-vis stack
69
+ pop_io
70
+ end
71
+
72
+ def io_stack
73
+ @io_stack ||= []
74
+ end
75
+
76
+ def push_io
77
+ io_stack.push [$stdout, $stderr]
78
+ $stdout = IoHackStream.new
79
+ $stderr = IoHackStream.new
80
+ nil
81
+ end
82
+
83
+ def pop_io
84
+ fail('stack empty') unless io_stack.any?
85
+ result = [$stdout, $stderr]
86
+ $stdout, $stderr = io_stack.pop
87
+ result.each_with_index do |io,idx|
88
+ if io.kind_of? IoHackStream
89
+ io.io.seek(0)
90
+ result[idx] = io.io.read
91
+ end
92
+ end
93
+ result
94
+ end
95
+ end
@@ -0,0 +1,47 @@
1
+ require 'helper'
2
+
3
+ class GraphVizDOTScriptTest < Test::Unit::TestCase
4
+ def setup
5
+ @script = GraphViz::DOTScript.new
6
+ end
7
+
8
+ def test_appends_a_newline_character_if_it_is_missing
9
+ str = "Test without newline"
10
+ @script.append(str)
11
+ assert_equal @script.to_s, str + "\n"
12
+ end
13
+
14
+ def test_does_not_append_a_newline_if_already_present
15
+ str = "Linebreak follows at my tail:\n"
16
+ @script.append(str)
17
+ assert_equal @script.to_s, str
18
+ end
19
+
20
+ def test_can_prepend_lines_to_its_content
21
+ start_content = "I want to be at the top!\n"
22
+ additional_content = "No way!\n"
23
+
24
+ @script.append(start_content)
25
+ @script.prepend(additional_content)
26
+
27
+ assert_equal @script.to_s, additional_content + start_content
28
+ end
29
+
30
+ def test_can_add_types_with_data
31
+ data = "some random data"
32
+ @script.add_type("node_attr", data)
33
+ assert_match(/\s*node\s*\[\s*#{data}\s*\]\s*/, @script.to_s)
34
+ end
35
+
36
+ def test_does_nothing_if_data_is_empty
37
+ @script.add_type("anything", "")
38
+ assert_equal true, @script.to_s.empty?
39
+ end
40
+
41
+ def test_raises_an_argument_error_on_unknown_types
42
+ assert_raise ArgumentError do
43
+ @script.add_type("invalid", "some data")
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,151 @@
1
+ #require File.expand_path('support.rb', File.dirname(__FILE__))
2
+ require 'support'
3
+
4
+ class GraphVizTest < Test::Unit::TestCase
5
+
6
+ #
7
+ # you can run a subset of all the samples like this:
8
+ # ruby test/test_examples.rb --name='/sample3[6-9]/'
9
+ #
10
+ # The above will run samples 36, 37, 38, and 39
11
+ #
12
+
13
+
14
+ include IoHack
15
+
16
+ RootDir = File.expand_path('../..', __FILE__)
17
+ ExampleDir = File.join(RootDir,'examples')
18
+ OutputDir = File.join(File.dirname(__FILE__),'output')
19
+ # OutputDir = File.join(RootDir,'test','output')
20
+
21
+
22
+ # the below tests write to stdout. the other tests write to filesystem
23
+
24
+ Skips = {
25
+ #'35' => 'hanging for me',
26
+ '33' => 'FamilyTree is broken',
27
+ '36' => 'hangs for me',
28
+ '53' => 'FamilyTree is broken',
29
+ '57' => 'will not be able to find the graphml script',
30
+ '98' => 'This test is just for debug',
31
+ '99' => 'FamilyTree is broken'
32
+ }
33
+
34
+
35
+ def test_sample07
36
+ assert_output_pattern(/\Adigraph structs \{.+\}\n\Z/m, '07')
37
+ end
38
+
39
+ def test_sample22
40
+ assert_output_pattern(/\Adigraph mainmap \{.+\}\n\Z/m, '22')
41
+ end
42
+
43
+ def test_sample23
44
+ assert_output_pattern(%r{\A<map.+</map>\n\Z}m, '23')
45
+ end
46
+
47
+ def test_sample27
48
+ assert_output_pattern(/\Adigraph G \{.*\}\n\Z/m, '27')
49
+ end
50
+
51
+ def test_sample38
52
+ assert_output_pattern(/\Adigraph G \{.*\}\n\Z/m, '38')
53
+ end
54
+
55
+ def test_sample40
56
+ assert_output_pattern(/\Adigraph G \{.*\}\n\Z/m, '40')
57
+ end
58
+
59
+ def test_sample41
60
+ assert_output_pattern(/\A.*\Z/m, '40')
61
+ end
62
+
63
+ def test_sample55
64
+ assert_output_pattern(/\Agraph G \{.*\}\n\Z/m, '55')
65
+ end
66
+
67
+ def test_sample62
68
+ assert_output_pattern(/\ANode.*\n\Z/m, '62')
69
+ end
70
+
71
+ def test_sample70
72
+ assert_output_pattern(/\Agraph G \{.*\}\n\Z/m, '70')
73
+ end
74
+
75
+ #
76
+ # for every sample file in the examples directory that matches the
77
+ # pattern ("sample01.rb, sample02.rb, etc) make a corresponding
78
+ # test method: test_sample01(), test_sample02(), etc. To actually define
79
+ # this methods in this way instead of just iterating over the list of files
80
+ # will make it easier to use command-line options to isolate certain
81
+ # tests,
82
+ # (for example: ruby test/test_examples.rb --name '/sample0[1-5]/' )
83
+ # and to integrate better with certain kinds of test output and
84
+ # reporting tools.
85
+ #
86
+ # we will skip over any methods already defined
87
+ #
88
+
89
+ @last_image_path = nil
90
+ @number_to_path = {}
91
+ class << self
92
+ def make_sample_test_method path
93
+ fail("failed match: #{path}") unless
94
+ matches = %r{/(sample(\d\d))\.rb\Z}.match(path)
95
+ basename, number = matches.captures
96
+ number_to_path[number] = path
97
+ meth = "test_#{basename}"
98
+ return if method_defined?(meth) # if we hand-write one
99
+ if Skips[number]
100
+ puts "skipping #{basename} - #{Skips[number]}"
101
+ return
102
+ end
103
+ define_method(meth){ assert_sample_file_has_no_output(path) }
104
+ end
105
+ attr_accessor :last_image_path, :number_to_path
106
+ end
107
+
108
+ samples = Dir[File.join(ExampleDir,'sample*.rb')].sort
109
+ samples.each {|path| make_sample_test_method(path) }
110
+
111
+
112
+ private
113
+
114
+ def assert_output_pattern tgt_regexp, number
115
+ path = self.class.number_to_path[number]
116
+ setup_sample path
117
+ out, err = fake_popen2(path)
118
+ assert_equal "", err, "no errors"
119
+ assert_match tgt_regexp, out.gsub(/\r\n/, "\n"), "output for sample#{number} should match regexp"
120
+ end
121
+
122
+ def assert_sample_file_has_no_output path
123
+ setup_sample(path)
124
+ begin
125
+ out, err = fake_popen2(path)
126
+ assert_equal(0, out.length, "expecting empty output")
127
+ assert_equal(0, err.length, "expecting empty errorput")
128
+ msg = "maybe generated #{self.class.last_image_path}"
129
+ print "\n", msg
130
+ rescue Exception => e
131
+ assert(false, "got exception on #{File.basename(path)}: #{e.message}")
132
+ puts "out: ", out.inspect, "err:", err.inspect
133
+ end
134
+ end
135
+
136
+ def setup_sample path
137
+ unless File.directory? OutputDir
138
+ FileUtils.mkdir_p(OutputDir, :verbose => true)
139
+ end
140
+ ARGV[0] = nil if ARGV.any? # hack trigger searching for 'dot' executable
141
+ hack_output_path path
142
+ end
143
+
144
+ def hack_output_path path
145
+ # hack $0 to change where the output image is written to
146
+ fake_example_path = File.join(OutputDir, File.basename(path))
147
+ $program_name = fake_example_path.dup
148
+ alias $0 $program_name
149
+ self.class.last_image_path = "#{$0}.png"
150
+ end
151
+ end
@@ -0,0 +1,115 @@
1
+ require 'helper'
2
+
3
+ class GraphVizTest < Test::Unit::TestCase
4
+ def setup
5
+ @graph = GraphViz::new( :G )
6
+ end
7
+
8
+ def test_graph
9
+ assert(@graph, 'Create graph faild.')
10
+
11
+ assert_block 'Set attribut for graph faild.' do
12
+ @graph['size'] = "10,10"
13
+ end
14
+
15
+ assert_equal( "\"10,10\"", @graph['size'].to_s, 'Get attribut for graph faild.' )
16
+
17
+ assert_equal( "G", @graph.name, "Wrong graph name." )
18
+ end
19
+
20
+ def test_node
21
+ n, m = nil, nil
22
+
23
+ assert_block 'Create node failed.' do
24
+ n = @graph.add_nodes( "n1" )
25
+ end
26
+
27
+ assert_block 'Get node failed.' do
28
+ m = @graph.get_node( "n1" )
29
+ end
30
+
31
+ assert_equal( m, n, "Node corrupted when get." )
32
+
33
+ assert_equal( @graph.node_count, 1, "Wrong number of nodes" )
34
+
35
+ assert_block 'Set attribut for node faild.' do
36
+ n['label'] = "Hello\n\"world\"\\l"
37
+ end
38
+
39
+ assert_equal( "\"Hello\\n\\\"world\\\"\\l\"", n['label'].to_s, 'Get attribut for node faild.' )
40
+ end
41
+
42
+ def test_search
43
+ g = GraphViz::new( "G" )
44
+ g.node["shape"] = "ellipse"
45
+ g.node["color"] = "black"
46
+
47
+ g["color"] = "black"
48
+
49
+ c0 = g.add_graph( "cluster0" )
50
+ c0["label"] = "process #1"
51
+ c0["style"] = "filled"
52
+ c0["color"] = "lightgrey"
53
+ a0 = c0.add_nodes( "a0", "style" => "filled", "color" => "white" )
54
+ a1 = c0.add_nodes( "a1", "style" => "filled", "color" => "white" )
55
+ a2 = c0.add_nodes( "a2", "style" => "filled", "color" => "white" )
56
+ a3 = c0.add_nodes( "a3", "style" => "filled", "color" => "white" )
57
+ c0.add_edges( a0, a1 )
58
+ c0.add_edges( a1, a2 )
59
+ c0.add_edges( a2, a3 )
60
+
61
+ c1 = g.add_graph( "cluster1", "label" => "process #2" )
62
+ b0 = c1.add_nodes( "b0", "style" => "filled", "color" => "blue" )
63
+ b1 = c1.add_nodes( "b1", "style" => "filled", "color" => "blue" )
64
+ b2 = c1.add_nodes( "b2", "style" => "filled", "color" => "blue" )
65
+ b3 = c1.add_nodes( "b3", "style" => "filled", "color" => "blue" )
66
+ c1.add_edges( b0, b1 )
67
+ c1.add_edges( b1, b2 )
68
+ c1.add_edges( b2, b3 )
69
+
70
+ start = g.add_nodes( "start", "shape" => "Mdiamond" )
71
+ endn = g.add_nodes( "end", "shape" => "Msquare" )
72
+
73
+ g.add_edges( start, a0 )
74
+ g.add_edges( start, b0 )
75
+ g.add_edges( a1, b3 )
76
+ g.add_edges( b2, a3 )
77
+ g.add_edges( a3, a0 )
78
+ g.add_edges( a3, endn )
79
+
80
+ assert g
81
+
82
+ assert_equal g.get_node("start"), start
83
+ assert_equal g.find_node("start"), start
84
+ assert_equal g.search_node("start"), start
85
+
86
+ assert_nil g.get_node("a0")
87
+ assert_equal g.find_node("a0"), a0
88
+ assert_equal g.search_node("a0"), a0
89
+
90
+ assert_nil c0.get_node("start")
91
+ assert_equal c0.find_node("start"), start
92
+ assert_nil c0.search_node("start")
93
+
94
+ assert_equal c0.get_node("a0"), a0
95
+ assert_equal c0.find_node("a0"), a0
96
+ assert_equal c0.search_node("a0"), a0
97
+
98
+ assert_nil c1.get_node("start")
99
+ assert_equal c1.find_node("start"), start
100
+ assert_nil c1.search_node("start")
101
+
102
+ assert_nil c1.get_node("a0")
103
+ assert_equal c1.find_node("a0"), a0
104
+ assert_nil c1.search_node("a0")
105
+ end
106
+
107
+ def test_to_s
108
+ assert_nothing_raised 'to_s with edge with numeric label failed.' do
109
+ a = @graph.add_nodes('a')
110
+ b = @graph.add_nodes('b')
111
+ @graph.add_edges(a, b, :label => 5)
112
+ @graph.to_s
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,29 @@
1
+ require 'helper'
2
+
3
+ class GraphVizSearch < Test::Unit::TestCase
4
+ def setup
5
+ @graph = GraphViz.graph(:G)
6
+ @graph.add_nodes(["A", "B", "C", "D", "E", "F", "G"])
7
+ @graph.add_edges("A", ["B", "C", "E"])
8
+ @graph.add_edges("B", ["D", "F"])
9
+ @graph.add_edges("C", "G")
10
+ @graph.add_edges("F", "E")
11
+ @theory = GraphViz::Theory.new(@graph)
12
+ end
13
+
14
+ def test_dfs
15
+ order = []
16
+ @theory.dfs("A") { |node|
17
+ order << node.id
18
+ }
19
+ assert_equal order, ["A", "B", "D", "F", "E", "C", "G"]
20
+ end
21
+
22
+ def test_bfs
23
+ order = []
24
+ @theory.bfs("A") { |node|
25
+ order << node.id
26
+ }
27
+ assert_equal order, ["A", "B", "C", "E", "D", "F", "G"]
28
+ end
29
+ end