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