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