1require 'rubygems'
2require 'rubygems/test_case'
3require 'rdoc/rubygems_hook'
4
5class TestRDocRubygemsHook < Gem::TestCase
6
7  def setup
8    super
9
10    skip 'requires RubyGems 1.9+' unless
11      Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.9')
12
13    @a = quick_spec 'a' do |s|
14      s.rdoc_options = %w[--main MyTitle]
15      s.extra_rdoc_files = %w[README]
16    end
17
18    write_file File.join(@tempdir, 'lib', 'a.rb')
19    write_file File.join(@tempdir, 'README')
20
21    install_gem @a
22
23    @hook = RDoc::RubygemsHook.new @a
24
25    begin
26      RDoc::RubygemsHook.load_rdoc
27    rescue Gem::DocumentError => e
28      skip e.message
29    end
30
31    Gem.configuration[:rdoc] = nil
32  end
33
34  def test_initialize
35    refute @hook.generate_rdoc
36    assert @hook.generate_ri
37
38    rdoc = RDoc::RubygemsHook.new @a, false, false
39
40    refute rdoc.generate_rdoc
41    refute rdoc.generate_ri
42  end
43
44  def test_delete_legacy_args
45    args = %w[
46      --inline-source
47      --one-file
48      --promiscuous
49      -p
50    ]
51
52    @hook.delete_legacy_args args
53
54    assert_empty args
55  end
56
57  def test_document
58    options = RDoc::Options.new
59    options.files = []
60
61    rdoc = @hook.new_rdoc
62    rdoc.store = RDoc::Store.new
63    @hook.instance_variable_set :@rdoc, rdoc
64    @hook.instance_variable_set :@file_info, []
65
66    @hook.document 'darkfish', options, @a.doc_dir('rdoc')
67
68    assert @hook.rdoc_installed?
69  end
70
71  def test_generate
72    FileUtils.mkdir_p @a.doc_dir
73    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
74
75    @hook.generate
76
77    refute @hook.rdoc_installed?
78    assert @hook.ri_installed?
79
80    rdoc = @hook.instance_variable_get :@rdoc
81
82    refute rdoc.options.hyperlink_all
83    assert_equal Pathname(@a.full_gem_path), rdoc.options.root
84    assert_equal %w[README lib], rdoc.options.files.sort
85
86    assert_equal 'MyTitle', rdoc.store.main
87  end
88
89  def test_generate_all
90    @hook.generate_rdoc = true
91    @hook.generate_ri   = true
92
93    FileUtils.mkdir_p @a.doc_dir
94    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
95
96    @hook.generate
97
98    assert @hook.rdoc_installed?
99    assert @hook.ri_installed?
100
101    rdoc = @hook.instance_variable_get :@rdoc
102
103    refute rdoc.options.hyperlink_all
104    assert_equal Pathname(@a.full_gem_path), rdoc.options.root
105    assert_equal %w[README lib], rdoc.options.files.sort
106
107    assert_equal 'MyTitle', rdoc.store.main
108  end
109
110  def test_generate_configuration_rdoc_array
111    Gem.configuration[:rdoc] = %w[-A]
112
113    FileUtils.mkdir_p @a.doc_dir
114    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
115
116    @hook.generate
117
118    rdoc = @hook.instance_variable_get :@rdoc
119
120    assert rdoc.options.hyperlink_all
121  end
122
123  def test_generate_configuration_rdoc_string
124    Gem.configuration[:rdoc] = '-A'
125
126    FileUtils.mkdir_p @a.doc_dir
127    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
128
129    @hook.generate
130
131    rdoc = @hook.instance_variable_get :@rdoc
132
133    assert rdoc.options.hyperlink_all
134  end
135
136  def test_generate_default_gem
137    skip 'RubyGems 2 required' unless @a.respond_to? :default_gem?
138    @a.loaded_from =
139      File.join Gem::Specification.default_specifications_dir, 'a.gemspec'
140
141    FileUtils.mkdir_p @a.doc_dir
142    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
143
144    @hook.generate
145
146    refute @hook.rdoc_installed?
147    refute @hook.ri_installed?
148  end
149
150  def test_generate_disabled
151    @hook.generate_rdoc = false
152    @hook.generate_ri   = false
153
154    @hook.generate
155
156    refute @hook.rdoc_installed?
157    refute @hook.ri_installed?
158  end
159
160  def test_generate_force
161    FileUtils.mkdir_p @a.doc_dir 'ri'
162    FileUtils.mkdir_p @a.doc_dir 'rdoc'
163    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
164
165    @hook.force = true
166
167    @hook.generate
168
169    refute_path_exists File.join(@a.doc_dir('rdoc'), 'index.html')
170    assert_path_exists File.join(@a.doc_dir('ri'),   'cache.ri')
171  end
172
173  def test_generate_no_overwrite
174    FileUtils.mkdir_p @a.doc_dir 'ri'
175    FileUtils.mkdir_p @a.doc_dir 'rdoc'
176    FileUtils.mkdir_p File.join(@a.gem_dir, 'lib')
177
178    @hook.generate
179
180    refute_path_exists File.join(@a.doc_dir('rdoc'), 'index.html')
181    refute_path_exists File.join(@a.doc_dir('ri'),   'cache.ri')
182  end
183
184  def test_new_rdoc
185    assert_kind_of RDoc::RDoc, @hook.new_rdoc
186  end
187
188  def test_rdoc_installed?
189    refute @hook.rdoc_installed?
190
191    FileUtils.mkdir_p @a.doc_dir 'rdoc'
192
193    assert @hook.rdoc_installed?
194  end
195
196  def test_remove
197    FileUtils.mkdir_p @a.doc_dir 'rdoc'
198    FileUtils.mkdir_p @a.doc_dir 'ri'
199
200    @hook.remove
201
202    refute @hook.rdoc_installed?
203    refute @hook.ri_installed?
204
205    assert_path_exists @a.doc_dir
206  end
207
208  def test_remove_unwritable
209    skip 'chmod not supported' if Gem.win_platform?
210    FileUtils.mkdir_p @a.base_dir
211    FileUtils.chmod 0, @a.base_dir
212
213    e = assert_raises Gem::FilePermissionError do
214      @hook.remove
215    end
216
217    assert_equal @a.base_dir, e.directory
218  ensure
219    FileUtils.chmod(0755, @a.base_dir) if File.directory?(@a.base_dir)
220  end
221
222  def test_ri_installed?
223    refute @hook.ri_installed?
224
225    FileUtils.mkdir_p @a.doc_dir 'ri'
226
227    assert @hook.ri_installed?
228  end
229
230  def test_setup
231    @hook.setup
232
233    assert_path_exists @a.doc_dir
234  end
235
236  def test_setup_unwritable
237    skip 'chmod not supported' if Gem.win_platform?
238    FileUtils.mkdir_p @a.doc_dir
239    FileUtils.chmod 0, @a.doc_dir
240
241    e = assert_raises Gem::FilePermissionError do
242      @hook.setup
243    end
244
245    assert_equal @a.doc_dir, e.directory
246  ensure
247    if File.exist? @a.doc_dir
248      FileUtils.chmod 0755, @a.doc_dir
249      FileUtils.rm_r @a.doc_dir
250    end
251  end
252
253end
254
255