зеркало из https://github.com/github/ruby.git
310 строки
7.6 KiB
Ruby
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
|
|
|