1# coding: US-ASCII
2
3require 'rdoc/test_case'
4
5class TestRDocEncoding < RDoc::TestCase
6
7  def setup
8    super
9
10    @tempfile = Tempfile.new 'test_rdoc_encoding'
11  end
12
13  def test_class_read_file
14    @tempfile.write "hi everybody"
15    @tempfile.flush
16
17    assert_equal "hi everybody", RDoc::Encoding.read_file(@tempfile.path, nil)
18  end
19
20  def test_class_read_file_encoding
21    skip "Encoding not implemented" unless Object.const_defined? :Encoding
22
23    expected = "# coding: utf-8\nhi everybody"
24
25    @tempfile.write expected
26    @tempfile.flush
27
28    contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8
29    assert_equal "hi everybody", contents
30    assert_equal Encoding::UTF_8, contents.encoding
31  end
32
33  def test_class_read_file_encoding_convert
34    skip "Encoding not implemented" unless Object.const_defined? :Encoding
35
36    content = ""
37    content.encode! 'ISO-8859-1'
38    content << "# coding: ISO-8859-1\nhi \xE9verybody"
39
40    @tempfile.write content
41    @tempfile.flush
42
43    contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8
44    assert_equal Encoding::UTF_8, contents.encoding
45    assert_equal "hi \u00e9verybody", contents.sub("\r", '')
46  end
47
48  def test_class_read_file_encoding_fail
49    skip "Encoding not implemented" unless Object.const_defined? :Encoding
50
51    @tempfile.write "# coding: utf-8\n\317\200" # pi
52    @tempfile.flush
53
54    contents = :junk
55
56    _, err = verbose_capture_io do
57      contents = RDoc::Encoding.read_file @tempfile.path, Encoding::US_ASCII
58    end
59
60    assert_nil contents
61
62    assert_match %r%^unable to convert%, err
63  end
64
65  def test_class_read_file_encoding_fancy
66    skip "Encoding not implemented" unless Object.const_defined? :Encoding
67
68    expected = "# -*- coding: utf-8; fill-column: 74 -*-\nhi everybody"
69    expected.encode! Encoding::UTF_8
70
71    @tempfile.write expected
72    @tempfile.flush
73
74    contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8
75    assert_equal "hi everybody", contents
76    assert_equal Encoding::UTF_8, contents.encoding
77  end
78
79  def test_class_read_file_encoding_force_transcode
80    skip "Encoding not implemented" unless Object.const_defined? :Encoding
81
82    @tempfile.write "# coding: utf-8\n\317\200" # pi
83    @tempfile.flush
84
85    contents = RDoc::Encoding.read_file @tempfile.path, Encoding::US_ASCII, true
86
87    assert_equal '?', contents
88    assert_equal Encoding::US_ASCII, contents.encoding
89  end
90
91  def test_class_read_file_encoding_guess
92    skip "Encoding not implemented" unless Object.const_defined? :Encoding
93
94    path = File.expand_path '../test.ja.txt', __FILE__
95    content = RDoc::Encoding.read_file path, Encoding::UTF_8
96
97    assert_equal Encoding::UTF_8, content.encoding
98  end
99
100  def test_class_read_file_encoding_invalid
101    skip "Encoding not implemented" unless Object.const_defined? :Encoding
102
103    @tempfile.write "# coding: ascii\nM\xE4r"
104    @tempfile.flush
105
106    contents = :junk
107    _, err = verbose_capture_io do
108      contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8
109    end
110
111    assert_equal "unable to convert \"\\xE4\" on US-ASCII for #{@tempfile.path}, skipping\n", err
112
113    assert_nil contents
114  end
115
116  def test_class_read_file_encoding_with_signature
117    skip "Encoding not implemented" unless defined? ::Encoding
118
119    @tempfile.write "\xEF\xBB\xBFhi everybody"
120    @tempfile.flush
121
122    bug3360 = '[ruby-dev:41452]'
123    content = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8
124    assert_equal Encoding::UTF_8, content.encoding, bug3360
125    assert_equal "hi everybody", content, bug3360
126  end
127
128  def test_class_set_encoding
129    s = "# coding: UTF-8\n"
130    RDoc::Encoding.set_encoding s
131
132    # sanity check for 1.8
133
134    skip "Encoding not implemented" unless Object.const_defined? :Encoding
135
136    assert_equal Encoding::UTF_8, s.encoding
137
138    s = "#!/bin/ruby\n# coding: UTF-8\n"
139    RDoc::Encoding.set_encoding s
140
141    assert_equal Encoding::UTF_8, s.encoding
142
143    s = "<?xml version='1.0' encoding='UTF-8'?>\n"
144    expected = s.encoding
145    RDoc::Encoding.set_encoding s
146
147    assert_equal Encoding::UTF_8, s.encoding
148
149    s = "<?xml version='1.0' encoding=\"UTF-8\"?>\n"
150    expected = s.encoding
151    RDoc::Encoding.set_encoding s
152
153    assert_equal Encoding::UTF_8, s.encoding
154  end
155
156  def test_class_set_encoding_strip
157    s = "# coding: UTF-8\n# more comments"
158
159    RDoc::Encoding.set_encoding s
160
161    assert_equal "# more comments", s
162
163    s = "#!/bin/ruby\n# coding: UTF-8\n# more comments"
164
165    RDoc::Encoding.set_encoding s
166
167    assert_equal "#!/bin/ruby\n# more comments", s
168  end
169
170  def test_class_set_encoding_bad
171    skip "Encoding not implemented" unless Object.const_defined? :Encoding
172
173    s = ""
174    expected = s.encoding
175    RDoc::Encoding.set_encoding s
176
177    assert_equal expected, s.encoding
178
179    s = "# vim:set fileencoding=utf-8:\n"
180    expected = s.encoding
181    RDoc::Encoding.set_encoding s
182
183    assert_equal expected, s.encoding
184
185    s = "# vim:set fileencoding=utf-8:\n"
186    expected = s.encoding
187    RDoc::Encoding.set_encoding s
188
189    assert_equal expected, s.encoding
190
191    assert_raises ArgumentError do
192      RDoc::Encoding.set_encoding "# -*- encoding: undecided -*-\n"
193    end
194  end
195
196  def test_sanity
197    skip "Encoding not implemented" unless Object.const_defined? :Encoding
198
199    assert_equal Encoding::US_ASCII, ''.encoding,
200                 'If this file is not ASCII tests may incorrectly pass'
201  end
202
203end
204
205