To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / .svn / pristine / e1 / e13d4eff8ef6e4c2192ff1fb6a6cfbcfa8709f65.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (8.38 KB)

1
# encoding: utf-8
2
require 'test/unit'
3
require File.expand_path('../../lib/assert_warning', __FILE__)
4

    
5
$:.unshift File.expand_path('../../../lib', __FILE__)
6
require 'coderay'
7

    
8
class BasicTest < Test::Unit::TestCase
9
  
10
  def test_version
11
    assert_nothing_raised do
12
      assert_match(/\A\d\.\d\.\d?\z/, CodeRay::VERSION)
13
    end
14
  end
15
  
16
  RUBY_TEST_CODE = 'puts "Hello, World!"'
17
  
18
  RUBY_TEST_TOKENS = [
19
    ['puts', :ident],
20
    [' ', :space],
21
    [:begin_group, :string],
22
      ['"', :delimiter],
23
      ['Hello, World!', :content],
24
      ['"', :delimiter],
25
    [:end_group, :string]
26
  ].flatten
27
  def test_simple_scan
28
    assert_nothing_raised do
29
      assert_equal RUBY_TEST_TOKENS, CodeRay.scan(RUBY_TEST_CODE, :ruby).tokens
30
    end
31
  end
32
  
33
  RUBY_TEST_HTML = 'puts <span class="string"><span class="delimiter">&quot;</span>' + 
34
    '<span class="content">Hello, World!</span><span class="delimiter">&quot;</span></span>'
35
  def test_simple_highlight
36
    assert_nothing_raised do
37
      assert_equal RUBY_TEST_HTML, CodeRay.scan(RUBY_TEST_CODE, :ruby).html
38
    end
39
  end
40
  
41
  def test_scan_file
42
    CodeRay.scan_file __FILE__
43
  end
44
  
45
  def test_encode
46
    assert_equal 1, CodeRay.encode('test', :python, :count)
47
  end
48
  
49
  def test_encode_tokens
50
    assert_equal 1, CodeRay.encode_tokens(CodeRay::Tokens['test', :string], :count)
51
  end
52
  
53
  def test_encode_file
54
    assert_equal File.read(__FILE__), CodeRay.encode_file(__FILE__, :text)
55
  end
56
  
57
  def test_highlight
58
    assert_match '<pre>test</pre>', CodeRay.highlight('test', :python)
59
  end
60
  
61
  def test_highlight_file
62
    assert_match "require <span class=\"string\"><span class=\"delimiter\">'</span><span class=\"content\">test/unit</span><span class=\"delimiter\">'</span></span>\n", CodeRay.highlight_file(__FILE__)
63
  end
64
  
65
  def test_duo
66
    assert_equal(RUBY_TEST_CODE,
67
      CodeRay::Duo[:plain, :text].highlight(RUBY_TEST_CODE))
68
    assert_equal(RUBY_TEST_CODE,
69
      CodeRay::Duo[:plain => :text].highlight(RUBY_TEST_CODE))
70
  end
71
  
72
  def test_duo_stream
73
    assert_equal(RUBY_TEST_CODE,
74
      CodeRay::Duo[:plain, :text].highlight(RUBY_TEST_CODE, :stream => true))
75
  end
76
  
77
  def test_comment_filter
78
    assert_equal <<-EXPECTED, CodeRay.scan(<<-INPUT, :ruby).comment_filter.text
79
#!/usr/bin/env ruby
80

    
81
code
82

    
83
more code  
84
      EXPECTED
85
#!/usr/bin/env ruby
86
=begin
87
A multi-line comment.
88
=end
89
code
90
# A single-line comment.
91
more code  # and another comment, in-line.
92
      INPUT
93
  end
94
  
95
  def test_lines_of_code
96
    assert_equal 2, CodeRay.scan(<<-INPUT, :ruby).lines_of_code
97
#!/usr/bin/env ruby
98
=begin
99
A multi-line comment.
100
=end
101
code
102
# A single-line comment.
103
more code  # and another comment, in-line.
104
      INPUT
105
    rHTML = <<-RHTML
106
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
107
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
108

    
109
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
110
<head>
111
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
112
  <title><%= controller.controller_name.titleize %>: <%= controller.action_name %></title>
113
  <%= stylesheet_link_tag 'scaffold' %>
114
</head>
115
<body>
116

    
117
<p style="color: green"><%= flash[:notice] %></p>
118

    
119
<div id="main">
120
  <%= yield %>
121
</div>
122

    
123
</body>
124
</html>
125
      RHTML
126
    assert_equal 0, CodeRay.scan(rHTML, :html).lines_of_code
127
    assert_equal 0, CodeRay.scan(rHTML, :php).lines_of_code
128
    assert_equal 0, CodeRay.scan(rHTML, :yaml).lines_of_code
129
    assert_equal 4, CodeRay.scan(rHTML, :erb).lines_of_code
130
  end
131
  
132
  def test_list_of_encoders
133
    assert_kind_of(Array, CodeRay::Encoders.list)
134
    assert CodeRay::Encoders.list.include?(:count)
135
  end
136
  
137
  def test_list_of_scanners
138
    assert_kind_of(Array, CodeRay::Scanners.list)
139
    assert CodeRay::Scanners.list.include?(:text)
140
  end
141
  
142
  def test_token_kinds
143
    assert_kind_of Hash, CodeRay::TokenKinds
144
    for kind, css_class in CodeRay::TokenKinds
145
      assert_kind_of Symbol, kind
146
      if css_class != false
147
        assert_kind_of String, css_class, "TokenKinds[%p] == %p" % [kind, css_class]
148
      end
149
    end
150
    assert_equal 'reserved', CodeRay::TokenKinds[:reserved]
151
    assert_warning 'Undefined Token kind: :shibboleet' do
152
      assert_equal false, CodeRay::TokenKinds[:shibboleet]
153
    end
154
  end
155
  
156
  class Milk < CodeRay::Encoders::Encoder
157
    FILE_EXTENSION = 'cocoa'
158
  end
159
  
160
  class HoneyBee < CodeRay::Encoders::Encoder
161
  end
162
  
163
  def test_encoder_file_extension
164
    assert_nothing_raised do
165
      assert_equal 'html', CodeRay::Encoders::Page::FILE_EXTENSION
166
      assert_equal 'cocoa', Milk::FILE_EXTENSION
167
      assert_equal 'cocoa', Milk.new.file_extension
168
      assert_equal 'honeybee', HoneyBee::FILE_EXTENSION
169
      assert_equal 'honeybee', HoneyBee.new.file_extension
170
    end
171
    assert_raise NameError do
172
      HoneyBee::MISSING_CONSTANT
173
    end
174
  end
175
  
176
  def test_encoder_tokens
177
    encoder = CodeRay::Encoders::Encoder.new
178
    encoder.send :setup, {}
179
    assert_raise(ArgumentError) { encoder.token :strange, '' }
180
    encoder.token 'test', :debug
181
  end
182
  
183
  def test_encoder_deprecated_interface
184
    encoder = CodeRay::Encoders::Encoder.new
185
    encoder.send :setup, {}
186
    assert_warning 'Using old Tokens#<< interface.' do
187
      encoder << ['test', :content]
188
    end
189
    assert_raise ArgumentError do
190
      encoder << [:strange, :input]
191
    end
192
    assert_raise ArgumentError do
193
      encoder.encode_tokens [['test', :token]]
194
    end
195
  end
196
  
197
  def encoder_token_interface_deprecation_warning_given
198
    CodeRay::Encoders::Encoder.send :class_variable_get, :@@CODERAY_TOKEN_INTERFACE_DEPRECATION_WARNING_GIVEN
199
  end
200
  
201
  def test_scanner_file_extension
202
    assert_equal 'rb', CodeRay::Scanners::Ruby.file_extension
203
    assert_equal 'rb', CodeRay::Scanners::Ruby.new.file_extension
204
    assert_equal 'java', CodeRay::Scanners::Java.file_extension
205
    assert_equal 'java', CodeRay::Scanners::Java.new.file_extension
206
  end
207
  
208
  def test_scanner_lang
209
    assert_equal :ruby, CodeRay::Scanners::Ruby.lang
210
    assert_equal :ruby, CodeRay::Scanners::Ruby.new.lang
211
    assert_equal :java, CodeRay::Scanners::Java.lang
212
    assert_equal :java, CodeRay::Scanners::Java.new.lang
213
  end
214
  
215
  def test_scanner_tokenize
216
    assert_equal ['foo', :plain], CodeRay::Scanners::Plain.new.tokenize('foo')
217
    assert_equal [['foo', :plain], ['bar', :plain]], CodeRay::Scanners::Plain.new.tokenize(['foo', 'bar'])
218
    CodeRay::Scanners::Plain.new.tokenize 42
219
  end
220
  
221
  def test_scanner_tokens
222
    scanner = CodeRay::Scanners::Plain.new
223
    scanner.tokenize('foo')
224
    assert_equal ['foo', :plain], scanner.tokens
225
    scanner.string = ''
226
    assert_equal ['', :plain], scanner.tokens
227
  end
228
  
229
  def test_scanner_line_and_column
230
    scanner = CodeRay::Scanners::Plain.new "foo\nbär+quux"
231
    assert_equal 0, scanner.pos
232
    assert_equal 1, scanner.line
233
    assert_equal 1, scanner.column
234
    scanner.scan(/foo/)
235
    assert_equal 3, scanner.pos
236
    assert_equal 1, scanner.line
237
    assert_equal 4, scanner.column
238
    scanner.scan(/\n/)
239
    assert_equal 4, scanner.pos
240
    assert_equal 2, scanner.line
241
    assert_equal 1, scanner.column
242
    scanner.scan(/b/)
243
    assert_equal 5, scanner.pos
244
    assert_equal 2, scanner.line
245
    assert_equal 2, scanner.column
246
    scanner.scan(/a/)
247
    assert_equal 5, scanner.pos
248
    assert_equal 2, scanner.line
249
    assert_equal 2, scanner.column
250
    scanner.scan(/ä/)
251
    assert_equal 7, scanner.pos
252
    assert_equal 2, scanner.line
253
    assert_equal 4, scanner.column
254
    scanner.scan(/r/)
255
    assert_equal 8, scanner.pos
256
    assert_equal 2, scanner.line
257
    assert_equal 5, scanner.column
258
  end
259
  
260
  def test_scanner_use_subclasses
261
    assert_raise NotImplementedError do
262
      CodeRay::Scanners::Scanner.new
263
    end
264
  end
265
  
266
  class InvalidScanner < CodeRay::Scanners::Scanner
267
  end
268
  
269
  def test_scanner_scan_tokens
270
    assert_raise NotImplementedError do
271
      InvalidScanner.new.tokenize ''
272
    end
273
  end
274
  
275
  class RaisingScanner < CodeRay::Scanners::Scanner
276
    def scan_tokens encoder, options
277
      raise_inspect 'message', [], :initial
278
    end
279
  end
280
  
281
  def test_scanner_raise_inspect
282
    assert_raise CodeRay::Scanners::Scanner::ScanError do
283
      RaisingScanner.new.tokenize ''
284
    end
285
  end
286
  
287
  def test_scan_a_frozen_string
288
    assert_nothing_raised do
289
      CodeRay.scan RUBY_VERSION, :ruby
290
      CodeRay.scan RUBY_VERSION, :plain
291
    end
292
  end
293
  
294
  def test_scan_a_non_string
295
    assert_nothing_raised do
296
      CodeRay.scan 42, :ruby
297
      CodeRay.scan nil, :ruby
298
      CodeRay.scan self, :ruby
299
      CodeRay.encode ENV.to_hash, :ruby, :page
300
      CodeRay.highlight CodeRay, :plain
301
    end
302
  end
303
  
304
end