rumld 0.4.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.
@@ -0,0 +1,101 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ module Rumld
4
+ describe 'Node' do
5
+ before(:each) do
6
+ @node = Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Rumld::Node')
7
+ end
8
+
9
+ it 'to_dot for belongs_to relation is blank when there association is empty' do
10
+ assoc = stub('Assoc', :options => {})
11
+ @node.send(:to_dot_for_belongs_to, assoc).should be_empty
12
+ end
13
+
14
+ it 'have an empty active record associations if the object does not have associations' do
15
+ @node.send(:active_record_associations).should == []
16
+ end
17
+
18
+ it 'active record associations reflect on all associations when available' do
19
+ @node.send(:constant).expects(:reflect_on_all_associations).returns(['One'])
20
+ @node.send(:active_record_associations).should == ['One']
21
+ end
22
+
23
+ it 'uses constant name to derive the constant' do
24
+ @node.send(:constant).should == Rumld::Node
25
+ end
26
+
27
+ it 'uses the intersect of rdoc_insepctors all included modules and trees constant names to determine included modules' do
28
+ @node.tree.expects(:constant_names).returns(['A', 'C', 'A::D'])
29
+ @node.stubs(:rdoc_inspector).returns(stub('RDocInspector', :all_included_modules => ['A', 'B'] ))
30
+ @node.included_modules.should == ['A']
31
+ end
32
+
33
+ it 'converts included_modules to_dot' do
34
+ @node.expects(:included_modules).returns(['NPR', 'Radio'])
35
+ @node.included_modules_to_dot.should == ['"Rumld::Node" -> "NPR" [style=dotted, arrowhead=empty]', '"Rumld::Node" -> "Radio" [style=dotted, arrowhead=empty]']
36
+ end
37
+
38
+ it 'should use self_to_dot in node_to_dot if there are no children' do
39
+ @node.expects(:self_to_dot).returns('No Children')
40
+ @node.expects(:children?).returns(false)
41
+ @node.node_to_dot.should == 'No Children'
42
+ end
43
+
44
+ it 'should use self_to_dot and children node_to_dot if there are children' do
45
+ child = Rumld::Node.new(@node.tree, "#{@node.constant_name}::Considered")
46
+ @node.expects(:self_to_dot).returns('Children')
47
+ child.expects(:self_to_dot).returns('I am a child')
48
+ @node.children << child
49
+
50
+ @node.node_to_dot.no_whitespace.should match(/#{Regexp.escape(%(subgraphclusterNode{label="Node))}/ )
51
+
52
+ end
53
+
54
+ it 'should have a self_and_descendants' do
55
+ child = Rumld::Node.new(@node.tree, "#{@node.constant_name}::Considered")
56
+ child.expects(:self_and_descendants).returns([child]).at_least(1)
57
+ @node.children << child
58
+ @node.self_and_descendants.should == [@node, child]
59
+ end
60
+
61
+ it 'by default it should have no children' do
62
+ @node.children.should == []
63
+ @node.children?.should == false
64
+ end
65
+
66
+ it 'should not be a parent of a constant at the same level in the module tree' do
67
+ @node = Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Object')
68
+ @node.should_be_parent_of?('Rumld').should be_false
69
+ end
70
+
71
+ it 'should be a parent of a constant one level deeper in the module tree' do
72
+ @node.should_be_parent_of?("#{@node.constant_name}::Considered").should be_true
73
+ end
74
+
75
+ it 'should not be a parent of itself' do
76
+ @node.should_be_parent_of?("#{@node.constant_name}").should be_false
77
+ end
78
+
79
+ it 'should not be a parent of a constant in the wrong module space' do
80
+ @node.should_be_parent_of?("Piggly::#{@node.constant_name}::Considered").should be_false
81
+ end
82
+
83
+ it 'should not be a parent of a constant two levels deeper than itself' do
84
+ @node.should_be_parent_of?("#{@node.constant_name}::Considered::Modules").should be_false
85
+ end
86
+
87
+ it 'doc_dir is delegated to underlying tree' do
88
+ @node.tree.doc_dir.should == @node.doc_dir
89
+ end
90
+
91
+ it 'constant_is_module is delegated to the underlying rdoc_inspector' do
92
+ @node.expects(:rdoc_inspector).returns(stub('RDocInspector', :doc_is_for_module? => true))
93
+ @node.constant_is_module?.should be_true
94
+ end
95
+
96
+ it 'methods_by_section is delegated to undelrying rdoc_inspector' do
97
+ @node.expects(:rdoc_inspector).returns(stub('RDocInspector', :methods_by_section => {}))
98
+ @node.methods_by_section.should == {}
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,91 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ #class Rumld::RDocInspectorTest < Test::Unit::TestCase
4
+ #
5
+ # def setup_rdoc
6
+ # `rdoc #{File.dirname(__FILE__).gsub(' ', '\\ ')}`
7
+ # end
8
+ #
9
+ # def teardown
10
+ # `rm -rf #{File.join(File.dirname(__FILE__), 'doc').gsub(' ', '\\ ')}`
11
+ # end
12
+ #
13
+ # def setup
14
+ # @node = stub('Node', :constant_name => 'Rumld::RDocInspector', :doc_dir => File.join(File.dirname(__FILE__), '..', 'doc'))
15
+ # @constant_name = 'Rumld::RdocInspectorTest'
16
+ # @rdoc_inspector = Rumld::RDocInspector.new(@node, @constant_name)
17
+ # end
18
+ #
19
+ # def test_doc_file_for
20
+ # assert_equal 'hello/world/classes/How/Are/You.html', Rumld::RDocInspector.doc_file_for('hello/world', 'How::Are::You')
21
+ # end
22
+ #
23
+ # def test_all_included_modules
24
+ # string = %(
25
+ # <html><body><div id="includes">
26
+ # <h3 class="section-bar">Included Modules</h3>
27
+ #
28
+ # <div id="includes-list">
29
+ # <span class="include-name">Two::Towers</span>
30
+ # <span class="include-name"><a href="AccountModel/AccountImport.html">AccountModel::AccountImport</a></span>
31
+ # </div>
32
+ # </div></body></html>
33
+ # )
34
+ # @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
35
+ # assert_equal ['Two::Towers', 'AccountModel::AccountImport'], @rdoc_inspector.all_included_modules
36
+ # end
37
+ #
38
+ # def test_all_included_modules_should_be_empty_when_no_matching_elements
39
+ # string = %(
40
+ # <html><body>
41
+ # </body></html>
42
+ # )
43
+ # @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
44
+ # assert_equal [], @rdoc_inspector.all_included_modules
45
+ # end
46
+ #
47
+ # def test_doc_is_for_module_when_given_a_module_that_has_been_rdoced
48
+ # string = '<html><body><div id="classHeader">
49
+ # <table class="header-table">
50
+ # <tr class="top-aligned-row">
51
+ # <td><strong>Module</strong></td>
52
+ # <td class="class-name-in-header">Rumld::Grapher</td>
53
+ # </tr>
54
+ # </table>
55
+ # </div></body></html>'
56
+ # @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
57
+ # assert @rdoc_inspector.doc_is_for_module?
58
+ # end
59
+ #
60
+ # def test_doc_is_for_module_when_given_a_class_that_has_been_rdoced
61
+ # string = '<html><body><div id="classHeader">
62
+ # <table class="header-table">
63
+ # <tr class="top-aligned-row">
64
+ # <td><strong>Class</strong></td>
65
+ # <td class="class-name-in-header">Rumld::Grapher</td>
66
+ # </tr>
67
+ # </table>
68
+ # </div></body></html>'
69
+ # @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
70
+ # assert ! @rdoc_inspector.doc_is_for_module?
71
+ # end
72
+ #
73
+ # def test_doc_should_open_the_doc_for_file_and_yield_to_hpricot
74
+ # setup_rdoc
75
+ # assert_kind_of Hpricot, @rdoc_inspector.doc
76
+ # end
77
+ #
78
+ # def test_doc_file_for_should_delegate_to_class_methods
79
+ # Rumld::RDocInspector.expects(:doc_file_for).returns('hello')
80
+ # assert_equal 'hello', @rdoc_inspector.doc_file_for
81
+ # end
82
+ #
83
+ # def test_methods_by_section_has_public_instance_methods
84
+ # setup_rdoc
85
+ # result = @rdoc_inspector.methods_by_section
86
+ # assert result.has_key?(:public_instance)
87
+ # assert result[:public_instance].include?('test_methods_by_section_has_public_instance_methods()')
88
+ # end
89
+ #
90
+ #end
91
+ #
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,78 @@
1
+ ## This file is copied to ~/spec when you run 'ruby script/generate rspec'
2
+ ## from the project root directory.
3
+ #ENV["RAILS_ENV"] = "test"
4
+ #require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
5
+ #require 'spec/rails'
6
+ #
7
+ #Spec::Runner.configure do |config|
8
+ # config.use_transactional_fixtures = true
9
+ # config.use_instantiated_fixtures = false
10
+ # config.fixture_path = RAILS_ROOT + '/spec/fixtures'
11
+ #
12
+ # # You can declare fixtures for each behaviour like this:
13
+ # # describe "...." do
14
+ # # fixtures :table_a, :table_b
15
+ # #
16
+ # # Alternatively, if you prefer to declare them only once, you can
17
+ # # do so here, like so ...
18
+ # #
19
+ # # config.global_fixtures = :table_a, :table_b
20
+ # #
21
+ # # If you declare global fixtures, be aware that they will be declared
22
+ # # for all of your examples, even those that don't use them.
23
+ #end
24
+ #
25
+ require 'stringio'
26
+ require 'rbconfig'
27
+
28
+ dir = File.dirname(__FILE__)
29
+ lib_path = File.expand_path("#{dir}/../lib")
30
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
31
+ $_spec_spec = true # Prevents Kernel.exit in various places
32
+
33
+ require 'rumld'
34
+ gem 'rspec'
35
+ require 'spec'
36
+
37
+ Spec::Runner.configure do |config|
38
+ config.mock_with :mocha
39
+ end
40
+
41
+ class << ActiveRecord::Base
42
+ def columns
43
+ [:id].collect{|i| ActiveRecord::ConnectionAdapters::Column.new(i, nil)}
44
+ end
45
+ end
46
+
47
+ module Abstract; end
48
+ class FirstAbstractUnit < ActiveRecord::Base
49
+ include Abstract
50
+ has_many :second_abstract_units
51
+ has_one :primary_abstract_unit, :class_name => 'SecondAbstractUnit'
52
+ end
53
+
54
+ class SecondAbstractUnit < ActiveRecord::Base
55
+ include Abstract
56
+
57
+ belongs_to :first_abstract_unit
58
+ end
59
+
60
+ class ThirdAbstractUnit < ActiveRecord::Base
61
+ belongs_to :stuff, :polymorphic => true
62
+ end
63
+
64
+ class FourthAbstractUnit < ActiveRecord::Base
65
+ has_many :third_abstract_units, :as => :stuff
66
+ end
67
+
68
+ class String
69
+ def no_whitespace
70
+ gsub(/(\ |\n|\r)/, '')
71
+ end
72
+ end
73
+
74
+ class Nil
75
+ def no_whitespace
76
+ self
77
+ end
78
+ end
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class Rumld::GraphTest < Test::Unit::TestCase
4
+
5
+ def test_to_dot_delegates_to_tree
6
+ obj = Rumld::Graph.new('', [],[])
7
+ obj.expects(:tree).returns(stub('Tree', :to_dot => :to_dot))
8
+ assert_equal :to_dot, obj.to_dot
9
+ end
10
+
11
+ def test_collect_possible_constant_names
12
+ assert_equal ["A", "A::B", "A::B::C", "A::B::C::D", "A::B::D", "A::C", "A::C::D", "A::D",
13
+ "B", "B::C", "B::C::D", "B::D",
14
+ "C", "C::D",
15
+ "D"], Rumld::Graph.new(nil, nil, nil).send(:collect_possible_constant_names, ['A', 'B', 'C', 'D'])
16
+ end
17
+
18
+ def test_constants_defined
19
+ file = <<-EOV
20
+ class One
21
+ class Two::Three < One
22
+ include Eight
23
+ extend Nine
24
+ def function(one)
25
+ end
26
+ end
27
+ module Four
28
+ end
29
+ class << self
30
+ end
31
+
32
+ class << Five
33
+ end
34
+ end
35
+ EOV
36
+ assert_equal( ['One', 'Two::Three', 'Four', 'Five'], Rumld::Graph.new(nil, nil, nil).send(:constants_defined, file.split("\n")))
37
+ end
38
+
39
+ def test_files_to_process_should_use_the_files
40
+ grapher = Rumld::Graph.new(nil, [File.dirname(__FILE__),File.dirname(__FILE__)], [File.basename(__FILE__)])
41
+ assert_equal [__FILE__], grapher.send(:files_to_process)
42
+ end
43
+
44
+ end
@@ -0,0 +1,121 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class Rumld::NodeTest < Test::Unit::TestCase
4
+ def setup
5
+ @node = Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Rumld::NodeTest')
6
+ end
7
+
8
+ def test_to_dot_for_belongs_to_should_blank
9
+ assoc = stub('Assoc', :options => {})
10
+ assert @node.send(:to_dot_for_belongs_to, assoc).empty?
11
+ end
12
+
13
+
14
+ def test_reflect_on_all_associations_without_an_active_record_object
15
+ @node = Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Rumld::Node')
16
+ assert_equal [], @node.send(:active_record_associations)
17
+ end
18
+
19
+ def test_reflect_on_all_associations_without_an_active_record_object
20
+ @node = Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Rumld::Node')
21
+ @node.send(:constant).expects(:reflect_on_all_associations).returns(['One'])
22
+ assert_equal ['One'], @node.send(:active_record_associations)
23
+ end
24
+
25
+ def test_constant
26
+ assert_equal Rumld::Node, Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Rumld::Node').send(:constant)
27
+ end
28
+
29
+ def test_active_record_associations
30
+ assert_equal Rumld::Node, Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Rumld::Node').send(:constant)
31
+ end
32
+
33
+ def test_included_modules_should_be_the_intersect_of_all_included_modules_and_rdocced_modules
34
+ @node.tree.expects(:constant_names).returns(['A', 'C', 'A::D'])
35
+ @node.stubs(:rdoc_inspector).returns(stub('RDocInspector', :all_included_modules => ['A', 'B'] ))
36
+ assert_equal ['A'], @node.included_modules
37
+ end
38
+
39
+ def test_included_modules_to_dot
40
+ @node.expects(:included_modules).returns(['NPR', 'Radio'])
41
+ assert_equal( ['"Rumld::NodeTest" -> "NPR" [style=dotted, arrowhead=empty]', '"Rumld::NodeTest" -> "Radio" [style=dotted, arrowhead=empty]'], @node.included_modules_to_dot)
42
+ end
43
+
44
+ def test_node_to_dot_without_children
45
+ @node.expects(:self_to_dot).returns('No Children')
46
+ @node.expects(:children?).returns(false)
47
+ assert_equal 'No Children', @node.node_to_dot
48
+ end
49
+
50
+ def test_node_to_dot_with_children
51
+ child = Rumld::Node.new(@node.tree, "#{@node.constant_name}::Considered")
52
+ @node.expects(:self_to_dot).returns('Children')
53
+ child.expects(:self_to_dot).returns('I am a child')
54
+ @node.children << child
55
+
56
+ assert_match( /#{Regexp.escape(%(subgraphclusterNodeTest{label="NodeTest))}/, @node.node_to_dot.no_whitespace)
57
+ end
58
+
59
+ def test_self_and_descendants
60
+ child = Rumld::Node.new(@node.tree, "#{@node.constant_name}::Considered")
61
+ child.expects(:self_and_descendants).returns([child]).at_least(1)
62
+ @node.children << child
63
+ assert_equal [@node, child], @node.self_and_descendants
64
+ end
65
+
66
+ def test_children_should_default_to_an_array
67
+ assert_equal [], @node.children
68
+ end
69
+
70
+ def test_children_empty_means_false_for_children?
71
+ assert ! @node.children?
72
+ end
73
+
74
+ def test_children_not_empty_means_true_for_children?
75
+ @node.children << 'Hello'
76
+ assert @node.children?
77
+ end
78
+
79
+ def test_constants_should_be_parent_of_regression_prevention_1
80
+ @node = Rumld::Node.new(stub('tree', :doc_dir => '/chicken/noodle'), 'Object')
81
+ assert ! @node.should_be_parent_of?('Rumld')
82
+ end
83
+
84
+ def test_constants_one_module_level_deeper_should_be_child_of_node
85
+ assert @node.should_be_parent_of?('Rumld::NodeTest::Considered')
86
+ end
87
+
88
+ def test_constants_should_not_be_parents_of_themselves
89
+ assert ! @node.should_be_parent_of?('Rumld::NodeTest')
90
+ end
91
+
92
+ def test_constants_in_wrong_module_space_should_not_be_child_of_node
93
+ assert ! @node.should_be_parent_of?('This::Is::Rumld::NodeTest')
94
+ end
95
+
96
+ def test_constants_one_module_level_deeper_in_wrong_module_space_should_not_be_child_of_node
97
+ assert ! @node.should_be_parent_of?('This::Is::Rumld::NodeTest::Considered')
98
+ end
99
+
100
+ def test_constants_two_module_level_deeper_should_be_child_of_node
101
+ assert ! @node.should_be_parent_of?('Rumld::NodeTest::Considered::On')
102
+ end
103
+
104
+ def test_doc_dir_is_delegated_to_nodes_tree
105
+ assert_equal @node.tree.doc_dir, @node.doc_dir
106
+ end
107
+
108
+ def test_constant_is_module_is_delegated_to_rdoc_inspector_doc_is_for_module
109
+ @node.expects(:rdoc_inspector).returns(stub('RDocInspector', :doc_is_for_module? => true))
110
+ assert_equal true, @node.constant_is_module?
111
+ end
112
+
113
+ def test_methods_by_section_is_delegated_to_rdoc_inspector
114
+ @node.expects(:rdoc_inspector).returns(stub('RDocInspector', :methods_by_section => {}))
115
+ assert_equal( {}, @node.methods_by_section )
116
+ end
117
+
118
+ def test_format_methods_should_replace_block_bracketes
119
+ assert_equal "function(self = \\{ :page =\\> 1\\}) \\{ \\|self\\| ... \\}\\l", @node.send(:format_methods, ["function(self = { :page => 1}) { |self| ... }"])
120
+ end
121
+ end
@@ -0,0 +1,90 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class Rumld::RDocInspectorTest < Test::Unit::TestCase
4
+
5
+ def setup_rdoc
6
+ `rdoc #{File.dirname(__FILE__).gsub(' ', '\\ ')}`
7
+ end
8
+
9
+ def teardown
10
+ `rm -rf #{File.join(File.dirname(__FILE__), 'doc').gsub(' ', '\\ ')}`
11
+ end
12
+
13
+ def setup
14
+ @node = stub('Node', :constant_name => 'Rumld::RDocInspector', :doc_dir => File.join(File.dirname(__FILE__), '..', 'doc'))
15
+ @constant_name = 'Rumld::RdocInspectorTest'
16
+ @rdoc_inspector = Rumld::RDocInspector.new(@node, @constant_name)
17
+ end
18
+
19
+ def test_doc_file_for
20
+ assert_equal 'hello/world/classes/How/Are/You.html', Rumld::RDocInspector.doc_file_for('hello/world', 'How::Are::You')
21
+ end
22
+
23
+ def test_all_included_modules
24
+ string = %(
25
+ <html><body><div id="includes">
26
+ <h3 class="section-bar">Included Modules</h3>
27
+
28
+ <div id="includes-list">
29
+ <span class="include-name">Two::Towers</span>
30
+ <span class="include-name"><a href="AccountModel/AccountImport.html">AccountModel::AccountImport</a></span>
31
+ </div>
32
+ </div></body></html>
33
+ )
34
+ @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
35
+ assert_equal ['Two::Towers', 'AccountModel::AccountImport'], @rdoc_inspector.all_included_modules
36
+ end
37
+
38
+ def test_all_included_modules_should_be_empty_when_no_matching_elements
39
+ string = %(
40
+ <html><body>
41
+ </body></html>
42
+ )
43
+ @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
44
+ assert_equal [], @rdoc_inspector.all_included_modules
45
+ end
46
+
47
+ def test_doc_is_for_module_when_given_a_module_that_has_been_rdoced
48
+ string = '<html><body><div id="classHeader">
49
+ <table class="header-table">
50
+ <tr class="top-aligned-row">
51
+ <td><strong>Module</strong></td>
52
+ <td class="class-name-in-header">Rumld::Grapher</td>
53
+ </tr>
54
+ </table>
55
+ </div></body></html>'
56
+ @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
57
+ assert @rdoc_inspector.doc_is_for_module?
58
+ end
59
+
60
+ def test_doc_is_for_module_when_given_a_class_that_has_been_rdoced
61
+ string = '<html><body><div id="classHeader">
62
+ <table class="header-table">
63
+ <tr class="top-aligned-row">
64
+ <td><strong>Class</strong></td>
65
+ <td class="class-name-in-header">Rumld::Grapher</td>
66
+ </tr>
67
+ </table>
68
+ </div></body></html>'
69
+ @rdoc_inspector.expects(:doc).returns(Hpricot( string ))
70
+ assert ! @rdoc_inspector.doc_is_for_module?
71
+ end
72
+
73
+ def test_doc_should_open_the_doc_for_file_and_yield_to_hpricot
74
+ setup_rdoc
75
+ assert_kind_of Hpricot, @rdoc_inspector.doc
76
+ end
77
+
78
+ def test_doc_file_for_should_delegate_to_class_methods
79
+ Rumld::RDocInspector.expects(:doc_file_for).returns('hello')
80
+ assert_equal 'hello', @rdoc_inspector.doc_file_for
81
+ end
82
+
83
+ def test_methods_by_section_has_public_instance_methods
84
+ setup_rdoc
85
+ result = @rdoc_inspector.methods_by_section
86
+ assert result.has_key?(:public_instance)
87
+ assert result[:public_instance].include?('test_methods_by_section_has_public_instance_methods()')
88
+ end
89
+
90
+ end
@@ -0,0 +1,59 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class Rumld::TreeTest < Test::Unit::TestCase
4
+ def setup
5
+ @tree = Rumld::Tree.new(nil, [])
6
+ end
7
+
8
+ def test_doc_dir_is_delegated_graph
9
+ @tree.expects(:graph).returns(stub('Graph', :doc_dir => :doc_dir))
10
+ assert_equal :doc_dir, @tree.doc_dir
11
+ end
12
+
13
+ def test_build_nodes_with_multi_level_constant_names
14
+ @tree = Rumld::Tree.new(nil, ['A', 'A::B', 'A::B::C'])
15
+ assert_equal ['A'], @tree.nodes.collect{|n| n.constant_name}
16
+ end
17
+
18
+ def test_build_nodes_with_single_level_constant_names
19
+ @tree = Rumld::Tree.new(nil, ['A', 'A::B'])
20
+ assert_equal ['A'], @tree.nodes.collect{|n| n.constant_name}
21
+ end
22
+
23
+ def test_all_nodes
24
+ @tree = Rumld::Tree.new(nil, ['A', 'A::B'])
25
+ assert_equal ['A', 'A::B'], @tree.all_nodes.collect{|n| n.constant_name}
26
+ end
27
+
28
+ def test_node_for_should_return_a_node_that_matches_the_given_constant
29
+ node = stub("Node", :constant => self.class)
30
+ @tree.expects(:all_nodes).returns([node])
31
+ assert_equal node, @tree.node_for(self.class)
32
+ end
33
+
34
+ def test_node_for_should_return_a_node_that_matches_the_given_constant_name
35
+ node = stub("Node", :constant => self.class, :constant_name => "Awesome")
36
+ @tree.expects(:all_nodes).returns([node])
37
+ assert_equal node, @tree.node_for('Awesome')
38
+ end
39
+
40
+ def test_inheritence_edge_to_dot
41
+ node = stub("Node", :inheritence_edge_to_dot => ['hello world'])
42
+ @tree.expects(:all_nodes).returns([node])
43
+ assert_equal 'hello world', @tree.send(:draw_inheritence_edges)
44
+ end
45
+
46
+ def test_to_dot_calls_draw_nodes_and_draw_included_modules
47
+ @tree.expects(:draw_nodes).returns('Draw Nodes')
48
+ @tree.expects(:draw_included_modules).returns('Draw Included Modules')
49
+ @tree.expects(:draw_associations).returns('Draw Associations')
50
+ @tree.expects(:draw_inheritence_edges).returns('Draw Inheritence Edges')
51
+ assert_equal( %(digraph uml_diagram {
52
+ graph[overlap=false, splines=true]
53
+ Draw Nodes
54
+ Draw Included Modules
55
+ Draw Associations
56
+ Draw Inheritence Edges
57
+ }).no_whitespace, @tree.to_dot.no_whitespace)
58
+ end
59
+ end
@@ -0,0 +1,15 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '../lib'))
2
+ require "test/unit"
3
+ require 'rumld'
4
+
5
+ class String
6
+ def no_whitespace
7
+ gsub(/(\ |\n|\r)/, '')
8
+ end
9
+ end
10
+
11
+ class Nil
12
+ def no_whitespace
13
+ self
14
+ end
15
+ end