require 'rdoc/test_case' class TestRDocStats < RDoc::TestCase def setup super @s = RDoc::Stats.new @store, 0 @tl = @store.add_file 'file.rb' @tl.parser = RDoc::Parser::Ruby end def test_doc_stats c = RDoc::CodeObject.new assert_equal [1, 1], @s.doc_stats([c]) end def test_doc_stats_documented c = RDoc::CodeObject.new c.comment = comment 'x' assert_equal [1, 0], @s.doc_stats([c]) end def test_doc_stats_display_eh c = RDoc::CodeObject.new c.ignore assert_equal [0, 0], @s.doc_stats([c]) end def test_report_attr c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl a = RDoc::Attr.new nil, 'a', 'RW', nil a.record_location @tl c.add_attribute a @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, verb( "class C # is documented\n", "\n", " attr_accessor :a # in file file.rb\n", "\n", "end\n"), blank_line) assert_equal expected, report end def test_report_attr_documented c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl a = RDoc::Attr.new nil, 'a', 'RW', 'a' a.record_location @tl c.add_attribute a @store.complete :public report = @s.report assert_equal @s.great_job, report end def test_report_attr_line c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl a = RDoc::Attr.new nil, 'a', 'RW', nil a.record_location @tl a.line = 3 c.add_attribute a @store.complete :public assert_match '# in file file.rb:3', @s.report.accept(to_rdoc) end def test_report_constant m = @tl.add_module RDoc::NormalModule, 'M' m.record_location @tl m.add_comment 'M', @tl c = RDoc::Constant.new 'C', nil, nil c.record_location @tl m.add_constant c @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, verb( "module M # is documented\n", "\n", " # in file file.rb\n", " C = nil\n", "\n", "end\n"), blank_line) assert_equal expected, report end def test_report_constant_alias mod = @tl.add_module RDoc::NormalModule, 'M' c = @tl.add_class RDoc::NormalClass, 'C' mod.add_constant c ca = RDoc::Constant.new 'CA', nil, nil ca.is_alias_for = c @tl.add_constant ca @store.complete :public report = @s.report # TODO change this to refute match, aliases should be ignored as they are # programmer convenience constructs assert_match 'class Object', report.accept(to_rdoc) end def test_report_constant_documented m = @tl.add_module RDoc::NormalModule, 'M' m.record_location @tl m.add_comment 'M', @tl c = RDoc::Constant.new 'C', nil, 'C' c.record_location @tl m.add_constant c @store.complete :public report = @s.report assert_equal @s.great_job, report end def test_report_constant_line m = @tl.add_module RDoc::NormalModule, 'M' m.record_location @tl m.add_comment 'M', @tl c = RDoc::Constant.new 'C', nil, nil c.record_location @tl c.line = 5 m.add_constant c @store.complete :public assert_match '# in file file.rb:5', @s.report.accept(to_rdoc) end def test_report_class c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl c.add_method m m.comment = 'm' @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, para('In files:'), list(:BULLET, *[ item(nil, para('file.rb'))]), blank_line, verb("class C\n", "end\n"), blank_line) assert_equal expected, report end def test_report_skip_object c = @tl.add_class RDoc::NormalClass, 'Object' c.record_location @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl c.add_method m m.comment = 'm' @store.complete :public refute_match %r%^class Object$%, @s.report.accept(to_rdoc) end def test_report_class_documented c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl c.add_method m m.comment = 'm' @store.complete :public report = @s.report assert_equal @s.great_job, report end def test_report_class_documented_level_1 c1 = @tl.add_class RDoc::NormalClass, 'C1' c1.record_location @tl c1.add_comment 'C1', @tl m1 = RDoc::AnyMethod.new nil, 'm1' m1.record_location @tl c1.add_method m1 m1.comment = 'm1' c2 = @tl.add_class RDoc::NormalClass, 'C2' c2.record_location @tl m2 = RDoc::AnyMethod.new nil, 'm2' m2.record_location @tl c2.add_method m2 m2.comment = 'm2' @store.complete :public @s.coverage_level = 1 report = @s.report expected = doc( para('The following items are not documented:'), blank_line, para('In files:'), list(:BULLET, *[ item(nil, para('file.rb'))]), blank_line, verb("class C2\n", "end\n"), blank_line) assert_equal expected, report end def test_report_class_empty @tl.add_class RDoc::NormalClass, 'C' @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, para('class C is referenced but empty.'), para("It probably came from another project. I'm sorry I'm holding it against you."), blank_line) assert_equal expected, report end def test_report_class_empty_2 c1 = @tl.add_class RDoc::NormalClass, 'C1' c1.record_location @tl c2 = @tl.add_class RDoc::NormalClass, 'C2' c2.record_location @tl c2.add_comment 'C2', @tl @store.complete :public @s.coverage_level = 1 report = @s.report expected = doc( para('The following items are not documented:'), blank_line, para('In files:'), list(:BULLET, *[ item(nil, para('file.rb'))]), blank_line, verb("class C1\n", "end\n"), blank_line) assert_equal expected, report end def test_report_class_method_documented c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl c.add_method m m.comment = 'm' @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, para('In files:'), list(:BULLET, *[ item(nil, para('file.rb'))]), blank_line, verb("class C\n", "end\n"), blank_line) assert_equal expected, report end def test_report_class_module_ignore c = @tl.add_class RDoc::NormalClass, 'C' c.ignore @store.complete :public report = @s.report_class_module c assert_nil report end def test_report_empty @store.complete :public report = @s.report assert_equal @s.great_job, report end def test_report_method c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m1 = RDoc::AnyMethod.new nil, 'm1' m1.record_location @tl c.add_method m1 m2 = RDoc::AnyMethod.new nil, 'm2' m2.record_location @tl c.add_method m2 m2.comment = 'm2' @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, verb(*[ "class C # is documented\n", "\n", " # in file file.rb\n", " def m1; end\n", "\n", "end\n"]), blank_line) assert_equal expected, report end def test_report_method_class c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m1 = RDoc::AnyMethod.new nil, 'm1' m1.record_location @tl m1.singleton = true c.add_method m1 m2 = RDoc::AnyMethod.new nil, 'm2' m2.record_location @tl m2.singleton = true c.add_method m2 m2.comment = 'm2' @store.complete :public report = @s.report expected = doc( para('The following items are not documented:'), blank_line, verb(*[ "class C # is documented\n", "\n", " # in file file.rb\n", " def self.m1; end\n", "\n", "end\n"]), blank_line) assert_equal expected, report end def test_report_method_documented c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl c.add_method m m.comment = 'm' @store.complete :public report = @s.report assert_equal @s.great_job, report end def test_report_method_line c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m1 = RDoc::AnyMethod.new nil, 'm1' m1.record_location @tl m1.line = 4 c.add_method m1 @store.complete :public assert_match '# in file file.rb:4', @s.report.accept(to_rdoc) end def test_report_method_parameters c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m1 = RDoc::AnyMethod.new nil, 'm1' m1.record_location @tl m1.params = '(p1, p2)' m1.comment = 'Stuff with +p1+' c.add_method m1 m2 = RDoc::AnyMethod.new nil, 'm2' m2.record_location @tl c.add_method m2 m2.comment = 'm2' @store.complete :public @s.coverage_level = 1 report = @s.report expected = doc( para('The following items are not documented:'), blank_line, verb(*[ "class C # is documented\n", "\n", " # in file file.rb\n", " # +p2+ is not documented\n", " def m1(p1, p2); end\n", "\n", "end\n"]), blank_line) assert_equal expected, report end def test_report_method_parameters_documented @tl.parser = RDoc::Parser::Ruby c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl m.params = '(p1)' m.comment = 'Stuff with +p1+' c.add_method m @store.complete :public @s.coverage_level = 1 report = @s.report assert_equal @s.great_job, report end def test_report_method_parameters_yield c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl m.call_seq = <<-SEQ m(a) { |c| ... } m(a, b) { |c, d| ... } SEQ m.comment = 'Stuff with +a+, yields +c+ for you to do stuff with' c.add_method m @store.complete :public @s.coverage_level = 1 report = @s.report expected = doc( para('The following items are not documented:'), blank_line, verb( "class C # is documented\n", "\n", " # in file file.rb\n", " # +b+, +d+ is not documented\n", " def m; end\n", "\n", "end\n"), blank_line) assert_equal expected, report end def test_summary c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl m = @tl.add_module RDoc::NormalModule, 'M' m.record_location @tl a = RDoc::Attr.new nil, 'a', 'RW', nil a.record_location @tl c.add_attribute a c_c = RDoc::Constant.new 'C', nil, nil c_c.record_location @tl c.add_constant c_c m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl c.add_method m @store.complete :public summary = @s.summary.accept to_rdoc summary.sub!(/ Elapsed:.*/m, '') expected = <<-EXPECTED Files: 0 Classes: 1 (1 undocumented) Modules: 1 (1 undocumented) Constants: 1 (1 undocumented) Attributes: 1 (1 undocumented) Methods: 1 (1 undocumented) Total: 5 (5 undocumented) 0.00% documented EXPECTED assert_equal summary, expected end def test_summary_level_false c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl @store.complete :public @s.coverage_level = false summary = @s.summary.accept to_rdoc summary.sub!(/ Elapsed:.*/m, '') expected = <<-EXPECTED Files: 0 Classes: 1 (1 undocumented) Modules: 0 (0 undocumented) Constants: 0 (0 undocumented) Attributes: 0 (0 undocumented) Methods: 0 (0 undocumented) Total: 1 (1 undocumented) 0.00% documented EXPECTED assert_equal summary, expected end def test_summary_level_1 c = @tl.add_class RDoc::NormalClass, 'C' c.record_location @tl c.add_comment 'C', @tl m = RDoc::AnyMethod.new nil, 'm' m.record_location @tl m.params = '(p1, p2)' m.comment = 'Stuff with +p1+' c.add_method m @store.complete :public @s.coverage_level = 1 @s.report summary = @s.summary.accept to_rdoc summary.sub!(/ Elapsed:.*/m, '') expected = <<-EXPECTED Files: 0 Classes: 1 (0 undocumented) Modules: 0 (0 undocumented) Constants: 0 (0 undocumented) Attributes: 0 (0 undocumented) Methods: 1 (0 undocumented) Parameters: 2 (1 undocumented) Total: 4 (1 undocumented) 75.00% documented EXPECTED assert_equal summary, expected end def to_rdoc RDoc::Markup::ToRdoc.new end def test_undoc_params method = RDoc::AnyMethod.new [], 'm' method.params = '(a)' method.comment = comment 'comment' total, undoc = @s.undoc_params method assert_equal 1, total assert_equal %w[a], undoc end def test_undoc_params_block method = RDoc::AnyMethod.new [], 'm' method.params = '(&a)' method.comment = comment '+a+' total, undoc = @s.undoc_params method assert_equal 1, total assert_empty undoc end def test_undoc_params_documented method = RDoc::AnyMethod.new [], 'm' method.params = '(a)' method.comment = comment '+a+' total, undoc = @s.undoc_params method assert_equal 1, total assert_empty undoc end def test_undoc_params_keywords method = RDoc::AnyMethod.new [], 'm' method.params = '(**a)' method.comment = comment '+a+' total, undoc = @s.undoc_params method assert_equal 1, total assert_empty undoc end def test_undoc_params_splat method = RDoc::AnyMethod.new [], 'm' method.params = '(*a)' method.comment = comment '+a+' total, undoc = @s.undoc_params method assert_equal 1, total assert_empty undoc end end