ruby/test/rdoc/test_rdoc_ri_store.rb

310 строки
7.6 KiB
Ruby

require 'rubygems'
require 'minitest/autorun'
require 'rdoc/ri'
require 'rdoc/markup'
require 'tmpdir'
require 'fileutils'
class TestRDocRIStore < MiniTest::Unit::TestCase
def setup
RDoc::TopLevel.reset
@tmpdir = File.join Dir.tmpdir, "test_rdoc_ri_store_#{$$}"
@s = RDoc::RI::Store.new @tmpdir
@top_level = RDoc::TopLevel.new 'file.rb'
@klass = @top_level.add_class RDoc::NormalClass, 'Object'
@klass.comment = 'original'
@cmeth = RDoc::AnyMethod.new nil, 'cmethod'
@cmeth.singleton = true
@meth = RDoc::AnyMethod.new nil, 'method'
@meth_bang = RDoc::AnyMethod.new nil, 'method!'
@attr = RDoc::Attr.new nil, 'attr', 'RW', ''
@klass.add_method @cmeth
@klass.add_method @meth
@klass.add_method @meth_bang
@klass.add_attribute @attr
@nest_klass = @klass.add_class RDoc::NormalClass, 'SubClass'
@nest_meth = RDoc::AnyMethod.new nil, 'method'
@nest_incl = RDoc::Include.new 'Incl', ''
@nest_klass.add_method @nest_meth
@nest_klass.add_include @nest_incl
@RM = RDoc::Markup
end
def teardown
FileUtils.rm_rf @tmpdir
end
def assert_cache imethods, cmethods, attrs, modules, ancestors = {}
expected = {
:class_methods => cmethods,
:instance_methods => imethods,
:attributes => attrs,
:modules => modules,
:ancestors => ancestors
}
assert_equal expected, @s.cache
end
def assert_directory path
assert File.directory?(path), "#{path} is not a directory"
end
def assert_file path
assert File.file?(path), "#{path} is not a file"
end
def test_attributes
@s.cache[:attributes]['Object'] = %w[attr]
expected = { 'Object' => %w[attr] }
assert_equal expected, @s.attributes
end
def test_class_file
assert_equal File.join(@tmpdir, 'Object', 'cdesc-Object.ri'),
@s.class_file('Object')
assert_equal File.join(@tmpdir, 'Object', 'SubClass', 'cdesc-SubClass.ri'),
@s.class_file('Object::SubClass')
end
def test_class_methods
@s.cache[:class_methods]['Object'] = %w[method]
expected = { 'Object' => %w[method] }
assert_equal expected, @s.class_methods
end
def test_class_path
assert_equal File.join(@tmpdir, 'Object'), @s.class_path('Object')
assert_equal File.join(@tmpdir, 'Object', 'SubClass'),
@s.class_path('Object::SubClass')
end
def test_friendly_path
@s.path = @tmpdir
@s.type = nil
assert_equal @s.path, @s.friendly_path
@s.type = :extra
assert_equal @s.path, @s.friendly_path
@s.type = :system
assert_equal "ruby core", @s.friendly_path
@s.type = :site
assert_equal "ruby site", @s.friendly_path
@s.type = :home
assert_equal "~/.ri", @s.friendly_path
@s.type = :gem
@s.path = "#{@tmpdir}/gem_repository/doc/gem_name-1.0/ri"
assert_equal "gem gem_name-1.0", @s.friendly_path
end
def test_instance_methods
@s.cache[:instance_methods]['Object'] = %w[method]
expected = { 'Object' => %w[method] }
assert_equal expected, @s.instance_methods
end
def test_load_cache
cache = {
:methods => %w[Object#method],
:modules => %w[Object],
}
Dir.mkdir @tmpdir
open File.join(@tmpdir, 'cache.ri'), 'wb' do |io|
Marshal.dump cache, io
end
@s.load_cache
assert_equal cache, @s.cache
end
def test_load_cache_no_cache
cache = {
:ancestors => {},
:attributes => {},
:class_methods => {},
:instance_methods => {},
:modules => [],
}
@s.load_cache
assert_equal cache, @s.cache
end
def test_load_class
@s.save_class @klass
assert_equal @klass, @s.load_class('Object')
end
def test_load_method_bang
@s.save_method @klass, @meth_bang
meth = @s.load_method('Object', '#method!')
assert_equal @meth_bang, meth
end
def test_method_file
assert_equal File.join(@tmpdir, 'Object', 'method-i.ri'),
@s.method_file('Object', 'Object#method')
assert_equal File.join(@tmpdir, 'Object', 'method%21-i.ri'),
@s.method_file('Object', 'Object#method!')
assert_equal File.join(@tmpdir, 'Object', 'SubClass', 'method%21-i.ri'),
@s.method_file('Object::SubClass', 'Object::SubClass#method!')
assert_equal File.join(@tmpdir, 'Object', 'method-c.ri'),
@s.method_file('Object', 'Object::method')
end
def test_save_cache
@s.save_class @klass
@s.save_method @klass, @meth
@s.save_method @klass, @cmeth
@s.save_class @nest_klass
@s.save_cache
assert_file File.join(@tmpdir, 'cache.ri')
expected = {
:attributes => { 'Object' => ['attr_accessor attr'] },
:class_methods => { 'Object' => %w[cmethod] },
:instance_methods => { 'Object' => %w[method] },
:modules => %w[Object Object::SubClass],
:ancestors => {
'Object' => %w[Object],
'Object::SubClass' => %w[Incl Object],
},
}
open File.join(@tmpdir, 'cache.ri'), 'rb' do |io|
cache = Marshal.load io.read
assert_equal expected, cache
end
end
def test_save_cache_duplicate_methods
@s.save_method @klass, @meth
@s.save_method @klass, @meth
@s.save_cache
assert_cache({ 'Object' => %w[method] }, {}, {}, [])
end
def test_save_class
@s.save_class @klass
assert_directory File.join(@tmpdir, 'Object')
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
'Object' => %w[Object])
assert_equal @klass, @s.load_class('Object')
end
def test_save_class_basic_object
@klass.instance_variable_set :@superclass, nil
@s.save_class @klass
assert_directory File.join(@tmpdir, 'Object')
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
'Object' => %w[])
assert_equal @klass, @s.load_class('Object')
end
def test_save_class_merge
@s.save_class @klass
klass = RDoc::NormalClass.new 'Object'
klass.comment = 'new class'
s = RDoc::RI::Store.new @tmpdir
s.save_class klass
s = RDoc::RI::Store.new @tmpdir
document = @RM::Document.new(
@RM::Paragraph.new('original'),
@RM::Paragraph.new('new class'))
assert_equal document, s.load_class('Object').comment
end
def test_save_class_methods
@s.save_class @klass
assert_directory File.join(@tmpdir, 'Object')
assert_file File.join(@tmpdir, 'Object', 'cdesc-Object.ri')
assert_cache({}, {}, { 'Object' => ['attr_accessor attr'] }, %w[Object],
'Object' => %w[Object])
assert_equal @klass, @s.load_class('Object')
end
def test_save_class_nested
@s.save_class @nest_klass
assert_directory File.join(@tmpdir, 'Object', 'SubClass')
assert_file File.join(@tmpdir, 'Object', 'SubClass', 'cdesc-SubClass.ri')
assert_cache({}, {}, {}, %w[Object::SubClass],
'Object::SubClass' => %w[Incl Object])
end
def test_save_method
@s.save_method @klass, @meth
assert_directory File.join(@tmpdir, 'Object')
assert_file File.join(@tmpdir, 'Object', 'method-i.ri')
assert_cache({ 'Object' => %w[method] }, {}, {}, [])
assert_equal @meth, @s.load_method('Object', '#method')
end
def test_save_method_nested
@s.save_method @nest_klass, @nest_meth
assert_directory File.join(@tmpdir, 'Object', 'SubClass')
assert_file File.join(@tmpdir, 'Object', 'SubClass', 'method-i.ri')
assert_cache({ 'Object::SubClass' => %w[method] }, {}, {}, [])
end
end