Chris@909: # encoding: utf-8
Chris@909: require 'test/unit'
Chris@909: require File.expand_path('../../lib/assert_warning', __FILE__)
Chris@909:
Chris@909: $:.unshift File.expand_path('../../../lib', __FILE__)
Chris@909: require 'coderay'
Chris@909:
Chris@909: class BasicTest < Test::Unit::TestCase
Chris@909:
Chris@909: def test_version
Chris@909: assert_nothing_raised do
Chris@909: assert_match(/\A\d\.\d\.\d?\z/, CodeRay::VERSION)
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: RUBY_TEST_CODE = 'puts "Hello, World!"'
Chris@909:
Chris@909: RUBY_TEST_TOKENS = [
Chris@909: ['puts', :ident],
Chris@909: [' ', :space],
Chris@909: [:begin_group, :string],
Chris@909: ['"', :delimiter],
Chris@909: ['Hello, World!', :content],
Chris@909: ['"', :delimiter],
Chris@909: [:end_group, :string]
Chris@909: ].flatten
Chris@909: def test_simple_scan
Chris@909: assert_nothing_raised do
Chris@909: assert_equal RUBY_TEST_TOKENS, CodeRay.scan(RUBY_TEST_CODE, :ruby).tokens
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: RUBY_TEST_HTML = 'puts "' +
Chris@909: 'Hello, World!"'
Chris@909: def test_simple_highlight
Chris@909: assert_nothing_raised do
Chris@909: assert_equal RUBY_TEST_HTML, CodeRay.scan(RUBY_TEST_CODE, :ruby).html
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: def test_scan_file
Chris@909: CodeRay.scan_file __FILE__
Chris@909: end
Chris@909:
Chris@909: def test_encode
Chris@909: assert_equal 1, CodeRay.encode('test', :python, :count)
Chris@909: end
Chris@909:
Chris@909: def test_encode_tokens
Chris@909: assert_equal 1, CodeRay.encode_tokens(CodeRay::Tokens['test', :string], :count)
Chris@909: end
Chris@909:
Chris@909: def test_encode_file
Chris@909: assert_equal File.read(__FILE__), CodeRay.encode_file(__FILE__, :text)
Chris@909: end
Chris@909:
Chris@909: def test_highlight
Chris@909: assert_match '
test
', CodeRay.highlight('test', :python)
Chris@909: end
Chris@909:
Chris@909: def test_highlight_file
Chris@909: assert_match "require 'test/unit'\n", CodeRay.highlight_file(__FILE__)
Chris@909: end
Chris@909:
Chris@909: def test_duo
Chris@909: assert_equal(RUBY_TEST_CODE,
Chris@909: CodeRay::Duo[:plain, :text].highlight(RUBY_TEST_CODE))
Chris@909: assert_equal(RUBY_TEST_CODE,
Chris@909: CodeRay::Duo[:plain => :text].highlight(RUBY_TEST_CODE))
Chris@909: end
Chris@909:
Chris@909: def test_duo_stream
Chris@909: assert_equal(RUBY_TEST_CODE,
Chris@909: CodeRay::Duo[:plain, :text].highlight(RUBY_TEST_CODE, :stream => true))
Chris@909: end
Chris@909:
Chris@909: def test_comment_filter
Chris@909: assert_equal <<-EXPECTED, CodeRay.scan(<<-INPUT, :ruby).comment_filter.text
Chris@909: #!/usr/bin/env ruby
Chris@909:
Chris@909: code
Chris@909:
Chris@909: more code
Chris@909: EXPECTED
Chris@909: #!/usr/bin/env ruby
Chris@909: =begin
Chris@909: A multi-line comment.
Chris@909: =end
Chris@909: code
Chris@909: # A single-line comment.
Chris@909: more code # and another comment, in-line.
Chris@909: INPUT
Chris@909: end
Chris@909:
Chris@909: def test_lines_of_code
Chris@909: assert_equal 2, CodeRay.scan(<<-INPUT, :ruby).lines_of_code
Chris@909: #!/usr/bin/env ruby
Chris@909: =begin
Chris@909: A multi-line comment.
Chris@909: =end
Chris@909: code
Chris@909: # A single-line comment.
Chris@909: more code # and another comment, in-line.
Chris@909: INPUT
Chris@909: rHTML = <<-RHTML
Chris@909:
Chris@909:
Chris@909:
Chris@909:
Chris@909:
Chris@909: <%= controller.controller_name.titleize %>: <%= controller.action_name %>
Chris@909: <%= stylesheet_link_tag 'scaffold' %>
Chris@909:
Chris@909:
Chris@909:
Chris@909: <%= flash[:notice] %>
Chris@909:
Chris@909:
Chris@909: <%= yield %>
Chris@909:
Chris@909:
Chris@909:
Chris@909:
Chris@909: RHTML
Chris@909: assert_equal 0, CodeRay.scan(rHTML, :html).lines_of_code
Chris@909: assert_equal 0, CodeRay.scan(rHTML, :php).lines_of_code
Chris@909: assert_equal 0, CodeRay.scan(rHTML, :yaml).lines_of_code
Chris@909: assert_equal 4, CodeRay.scan(rHTML, :erb).lines_of_code
Chris@909: end
Chris@909:
Chris@909: def test_list_of_encoders
Chris@909: assert_kind_of(Array, CodeRay::Encoders.list)
Chris@909: assert CodeRay::Encoders.list.include?(:count)
Chris@909: end
Chris@909:
Chris@909: def test_list_of_scanners
Chris@909: assert_kind_of(Array, CodeRay::Scanners.list)
Chris@909: assert CodeRay::Scanners.list.include?(:text)
Chris@909: end
Chris@909:
Chris@909: def test_token_kinds
Chris@909: assert_kind_of Hash, CodeRay::TokenKinds
Chris@909: for kind, css_class in CodeRay::TokenKinds
Chris@909: assert_kind_of Symbol, kind
Chris@909: if css_class != false
Chris@909: assert_kind_of String, css_class, "TokenKinds[%p] == %p" % [kind, css_class]
Chris@909: end
Chris@909: end
Chris@909: assert_equal 'reserved', CodeRay::TokenKinds[:reserved]
Chris@909: assert_warning 'Undefined Token kind: :shibboleet' do
Chris@909: assert_equal false, CodeRay::TokenKinds[:shibboleet]
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: class Milk < CodeRay::Encoders::Encoder
Chris@909: FILE_EXTENSION = 'cocoa'
Chris@909: end
Chris@909:
Chris@909: class HoneyBee < CodeRay::Encoders::Encoder
Chris@909: end
Chris@909:
Chris@909: def test_encoder_file_extension
Chris@909: assert_nothing_raised do
Chris@909: assert_equal 'html', CodeRay::Encoders::Page::FILE_EXTENSION
Chris@909: assert_equal 'cocoa', Milk::FILE_EXTENSION
Chris@909: assert_equal 'cocoa', Milk.new.file_extension
Chris@909: assert_equal 'honeybee', HoneyBee::FILE_EXTENSION
Chris@909: assert_equal 'honeybee', HoneyBee.new.file_extension
Chris@909: end
Chris@909: assert_raise NameError do
Chris@909: HoneyBee::MISSING_CONSTANT
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: def test_encoder_tokens
Chris@909: encoder = CodeRay::Encoders::Encoder.new
Chris@909: encoder.send :setup, {}
Chris@909: assert_raise(ArgumentError) { encoder.token :strange, '' }
Chris@909: encoder.token 'test', :debug
Chris@909: end
Chris@909:
Chris@909: def test_encoder_deprecated_interface
Chris@909: encoder = CodeRay::Encoders::Encoder.new
Chris@909: encoder.send :setup, {}
Chris@909: assert_warning 'Using old Tokens#<< interface.' do
Chris@909: encoder << ['test', :content]
Chris@909: end
Chris@909: assert_raise ArgumentError do
Chris@909: encoder << [:strange, :input]
Chris@909: end
Chris@909: assert_raise ArgumentError do
Chris@909: encoder.encode_tokens [['test', :token]]
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: def encoder_token_interface_deprecation_warning_given
Chris@909: CodeRay::Encoders::Encoder.send :class_variable_get, :@@CODERAY_TOKEN_INTERFACE_DEPRECATION_WARNING_GIVEN
Chris@909: end
Chris@909:
Chris@909: def test_scanner_file_extension
Chris@909: assert_equal 'rb', CodeRay::Scanners::Ruby.file_extension
Chris@909: assert_equal 'rb', CodeRay::Scanners::Ruby.new.file_extension
Chris@909: assert_equal 'java', CodeRay::Scanners::Java.file_extension
Chris@909: assert_equal 'java', CodeRay::Scanners::Java.new.file_extension
Chris@909: end
Chris@909:
Chris@909: def test_scanner_lang
Chris@909: assert_equal :ruby, CodeRay::Scanners::Ruby.lang
Chris@909: assert_equal :ruby, CodeRay::Scanners::Ruby.new.lang
Chris@909: assert_equal :java, CodeRay::Scanners::Java.lang
Chris@909: assert_equal :java, CodeRay::Scanners::Java.new.lang
Chris@909: end
Chris@909:
Chris@909: def test_scanner_tokenize
Chris@909: assert_equal ['foo', :plain], CodeRay::Scanners::Plain.new.tokenize('foo')
Chris@909: assert_equal [['foo', :plain], ['bar', :plain]], CodeRay::Scanners::Plain.new.tokenize(['foo', 'bar'])
Chris@909: CodeRay::Scanners::Plain.new.tokenize 42
Chris@909: end
Chris@909:
Chris@909: def test_scanner_tokens
Chris@909: scanner = CodeRay::Scanners::Plain.new
Chris@909: scanner.tokenize('foo')
Chris@909: assert_equal ['foo', :plain], scanner.tokens
Chris@909: scanner.string = ''
Chris@909: assert_equal ['', :plain], scanner.tokens
Chris@909: end
Chris@909:
Chris@909: def test_scanner_line_and_column
Chris@909: scanner = CodeRay::Scanners::Plain.new "foo\nbär+quux"
Chris@909: assert_equal 0, scanner.pos
Chris@909: assert_equal 1, scanner.line
Chris@909: assert_equal 1, scanner.column
Chris@909: scanner.scan(/foo/)
Chris@909: assert_equal 3, scanner.pos
Chris@909: assert_equal 1, scanner.line
Chris@909: assert_equal 4, scanner.column
Chris@909: scanner.scan(/\n/)
Chris@909: assert_equal 4, scanner.pos
Chris@909: assert_equal 2, scanner.line
Chris@909: assert_equal 1, scanner.column
Chris@909: scanner.scan(/b/)
Chris@909: assert_equal 5, scanner.pos
Chris@909: assert_equal 2, scanner.line
Chris@909: assert_equal 2, scanner.column
Chris@909: scanner.scan(/a/)
Chris@909: assert_equal 5, scanner.pos
Chris@909: assert_equal 2, scanner.line
Chris@909: assert_equal 2, scanner.column
Chris@909: scanner.scan(/ä/)
Chris@909: assert_equal 7, scanner.pos
Chris@909: assert_equal 2, scanner.line
Chris@909: assert_equal 4, scanner.column
Chris@909: scanner.scan(/r/)
Chris@909: assert_equal 8, scanner.pos
Chris@909: assert_equal 2, scanner.line
Chris@909: assert_equal 5, scanner.column
Chris@909: end
Chris@909:
Chris@909: def test_scanner_use_subclasses
Chris@909: assert_raise NotImplementedError do
Chris@909: CodeRay::Scanners::Scanner.new
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: class InvalidScanner < CodeRay::Scanners::Scanner
Chris@909: end
Chris@909:
Chris@909: def test_scanner_scan_tokens
Chris@909: assert_raise NotImplementedError do
Chris@909: InvalidScanner.new.tokenize ''
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: class RaisingScanner < CodeRay::Scanners::Scanner
Chris@909: def scan_tokens encoder, options
Chris@909: raise_inspect 'message', [], :initial
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: def test_scanner_raise_inspect
Chris@909: assert_raise CodeRay::Scanners::Scanner::ScanError do
Chris@909: RaisingScanner.new.tokenize ''
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: def test_scan_a_frozen_string
Chris@909: assert_nothing_raised do
Chris@909: CodeRay.scan RUBY_VERSION, :ruby
Chris@909: CodeRay.scan RUBY_VERSION, :plain
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: def test_scan_a_non_string
Chris@909: assert_nothing_raised do
Chris@909: CodeRay.scan 42, :ruby
Chris@909: CodeRay.scan nil, :ruby
Chris@909: CodeRay.scan self, :ruby
Chris@909: CodeRay.encode ENV.to_hash, :ruby, :page
Chris@909: CodeRay.highlight CodeRay, :plain
Chris@909: end
Chris@909: end
Chris@909:
Chris@909: end