1# -*- coding: us-ascii -*-
2
3require 'rdoc/test_case'
4
5class TestRDocParser < RDoc::TestCase
6
7  def setup
8    super
9
10    @RP = RDoc::Parser
11    @binary_dat = File.expand_path '../binary.dat', __FILE__
12
13    @fn = 'file.rb'
14    @top_level = RDoc::TopLevel.new @fn
15    @options = RDoc::Options.new
16  end
17
18  def test_class_binary_eh_marshal
19    marshal = File.join Dir.tmpdir, "test_rdoc_parser_#{$$}.marshal"
20    open marshal, 'wb' do |io|
21      io.write Marshal.dump('')
22      io.write 'lots of text ' * 500
23    end
24
25    assert @RP.binary?(marshal)
26  ensure
27    File.unlink marshal
28  end
29
30  def test_class_binary_japanese_text
31    file_name = File.expand_path '../test.ja.txt', __FILE__
32    refute @RP.binary?(file_name)
33  end
34
35  def test_class_binary_large_japanese_rdoc
36    skip "Encoding not implemented" unless Object.const_defined? :Encoding
37
38    capture_io do
39      begin
40        extenc, Encoding.default_external =
41          Encoding.default_external, Encoding::US_ASCII
42        file_name = File.expand_path '../test.ja.largedoc', __FILE__
43        assert !@RP.binary?(file_name)
44      ensure
45        Encoding.default_external = extenc
46      end
47    end
48  end
49
50  def test_class_binary_japanese_rdoc
51    skip "Encoding not implemented" unless Object.const_defined? :Encoding
52
53    file_name = File.expand_path '../test.ja.rdoc', __FILE__
54    refute @RP.binary?(file_name)
55  end
56
57  def test_class_can_parse
58    assert_equal @RP.can_parse(__FILE__), @RP::Ruby
59
60    readme_file_name = File.expand_path '../test.txt', __FILE__
61
62    assert_equal @RP::Simple, @RP.can_parse(readme_file_name)
63
64    assert_equal @RP::Simple, @RP.can_parse(@binary_dat)
65
66    jtest_file_name = File.expand_path '../test.ja.txt', __FILE__
67    assert_equal @RP::Simple, @RP.can_parse(jtest_file_name)
68
69    jtest_rdoc_file_name = File.expand_path '../test.ja.rdoc', __FILE__
70    assert_equal @RP::Simple, @RP.can_parse(jtest_rdoc_file_name)
71
72    readme_file_name = File.expand_path '../README', __FILE__
73    assert_equal @RP::Simple, @RP.can_parse(readme_file_name)
74
75    jtest_largerdoc_file_name = File.expand_path '../test.ja.largedoc', __FILE__
76    assert_equal @RP::Simple, @RP.can_parse(jtest_largerdoc_file_name)
77
78    @RP.alias_extension 'rdoc', 'largedoc'
79    assert_equal @RP::Simple, @RP.can_parse(jtest_largerdoc_file_name)
80  end
81
82  def test_class_for_executable
83    temp_dir do
84      content = "#!/usr/bin/env ruby -w\n"
85      open 'app', 'w' do |io| io.write content end
86      app = @store.add_file 'app'
87
88      parser = @RP.for app, 'app', content, @options, :stats
89
90      assert_kind_of RDoc::Parser::Ruby, parser
91
92      assert_equal 'app', parser.file_name
93    end
94  end
95
96  def test_class_for_forbidden
97    skip 'chmod not supported' if Gem.win_platform?
98
99    Tempfile.open 'forbidden' do |io|
100      begin
101        File.chmod 0000, io.path
102        forbidden = @store.add_file io.path
103
104        parser = @RP.for forbidden, 'forbidden', '', @options, :stats
105
106        assert_nil parser
107      ensure
108        File.chmod 0400, io.path
109      end
110    end
111  end
112
113  def test_can_parse_modeline
114    readme_ext = File.join Dir.tmpdir, "README.EXT.#{$$}"
115
116    open readme_ext, 'w' do |io|
117      io.puts "# README.EXT -  -*- rdoc -*- created at: Mon Aug 7 16:45:54 JST 1995"
118      io.puts
119      io.puts "This document explains how to make extension libraries for Ruby."
120    end
121
122    assert_equal RDoc::Parser::Simple, @RP.can_parse(readme_ext)
123  ensure
124    File.unlink readme_ext
125  end
126
127  ##
128  # Selenium hides a .jar file using a .txt extension.
129
130  def test_class_can_parse_zip
131    hidden_zip = File.expand_path '../hidden.zip.txt', __FILE__
132    assert_nil @RP.can_parse(hidden_zip)
133  end
134
135  def test_check_modeline
136    readme_ext = File.join Dir.tmpdir, "README.EXT.#{$$}"
137
138    open readme_ext, 'w' do |io|
139      io.puts "# README.EXT -  -*- RDoc -*- created at: Mon Aug 7 16:45:54 JST 1995"
140      io.puts
141      io.puts "This document explains how to make extension libraries for Ruby."
142    end
143
144    assert_equal 'rdoc', @RP.check_modeline(readme_ext)
145  ensure
146    File.unlink readme_ext
147  end
148
149  def test_check_modeline_coding
150    readme_ext = File.join Dir.tmpdir, "README.EXT.#{$$}"
151
152    open readme_ext, 'w' do |io|
153      io.puts "# -*- coding: utf-8 -*-"
154    end
155
156    assert_nil @RP.check_modeline readme_ext
157  ensure
158    File.unlink readme_ext
159  end
160
161  def test_check_modeline_with_other
162    readme_ext = File.join Dir.tmpdir, "README.EXT.#{$$}"
163
164    open readme_ext, 'w' do |io|
165      io.puts "# README.EXT -  -*- mode: RDoc; indent-tabs-mode: nil -*-"
166      io.puts
167      io.puts "This document explains how to make extension libraries for Ruby."
168    end
169
170    assert_equal 'rdoc', @RP.check_modeline(readme_ext)
171  ensure
172    File.unlink readme_ext
173  end
174
175  def test_check_modeline_no_modeline
176    readme_ext = File.join Dir.tmpdir, "README.EXT.#{$$}"
177
178    open readme_ext, 'w' do |io|
179      io.puts "This document explains how to make extension libraries for Ruby."
180    end
181
182    assert_nil @RP.check_modeline(readme_ext)
183  ensure
184    File.unlink readme_ext
185  end
186
187  def test_class_for_binary
188    rp = @RP.dup
189
190    class << rp
191      alias old_can_parse can_parse
192    end
193
194    def rp.can_parse(*args) nil end
195
196    assert_nil @RP.for(nil, @binary_dat, nil, nil, nil)
197  end
198
199  def test_class_for_markup
200    content = <<-CONTENT
201# coding: utf-8 markup: rd
202    CONTENT
203
204    parser = @RP.for @top_level, __FILE__, content, @options, nil
205
206    assert_kind_of @RP::RD, parser
207  end
208
209  def test_class_use_markup
210    content = <<-CONTENT
211# coding: utf-8 markup: rd
212    CONTENT
213
214    parser = @RP.use_markup content
215
216    assert_equal @RP::RD, parser
217  end
218
219  def test_class_use_markup_markdown
220    content = <<-CONTENT
221# coding: utf-8 markup: markdown
222    CONTENT
223
224    parser = @RP.use_markup content
225
226    assert_equal @RP::Ruby, parser
227  end
228
229  def test_class_use_markup_modeline
230    content = <<-CONTENT
231# -*- coding: utf-8 -*-
232# markup: rd
233    CONTENT
234
235    parser = @RP.use_markup content
236
237    assert_equal @RP::RD, parser
238  end
239
240  def test_class_use_markup_modeline_shebang
241    content = <<-CONTENT
242#!/bin/sh
243/* -*- coding: utf-8 -*-
244 * markup: rd
245 */
246    CONTENT
247
248    parser = @RP.use_markup content
249
250    assert_equal @RP::RD, parser
251  end
252
253  def test_class_use_markup_shebang
254    content = <<-CONTENT
255#!/usr/bin/env ruby
256# coding: utf-8 markup: rd
257    CONTENT
258
259    parser = @RP.use_markup content
260
261    assert_equal @RP::RD, parser
262  end
263
264  def test_class_use_markup_tomdoc
265    content = <<-CONTENT
266# coding: utf-8 markup: tomdoc
267    CONTENT
268
269    parser = @RP.use_markup content
270
271    assert_equal @RP::Ruby, parser
272  end
273
274  def test_class_use_markup_none
275    parser = @RP.use_markup ''
276
277    assert_nil parser
278  end
279
280  def test_initialize
281    @RP.new @top_level, @fn, '', @options, nil
282
283    assert_equal @RP, @top_level.parser
284  end
285
286end
287
288