Chris@909: require 'test/unit'
Chris@909:
Chris@909: $:.unshift File.expand_path('../../../lib', __FILE__)
Chris@909: require 'coderay'
Chris@909:
Chris@909: class ExamplesTest < Test::Unit::TestCase
Chris@909:
Chris@909: def test_examples
Chris@909: # output as HTML div (using inline CSS styles)
Chris@909: div = CodeRay.scan('puts "Hello, world!"', :ruby).div
Chris@909: assert_equal <<-DIV, div
Chris@909:
Chris@909: DIV
Chris@909:
Chris@909: # ...with line numbers
Chris@909: div = CodeRay.scan(<<-CODE.chomp, :ruby).div(:line_numbers => :table)
Chris@909: 5.times do
Chris@909: puts 'Hello, world!'
Chris@909: end
Chris@909: CODE
Chris@909: assert_equal <<-DIV, div
Chris@909:
Chris@909: 1
Chris@909: 2
Chris@909: 3
Chris@909: |
Chris@909: 5.times do
Chris@909: puts 'Hello, world!'
Chris@909: end |
Chris@909:
Chris@909: DIV
Chris@909:
Chris@909: # output as standalone HTML page (using CSS classes)
Chris@909: page = CodeRay.scan('puts "Hello, world!"', :ruby).page
Chris@909: assert page[<<-PAGE]
Chris@909:
Chris@909:
Chris@909:
Chris@909:
Chris@909: |
Chris@909: puts "Hello, world!" |
Chris@909:
Chris@909:
Chris@909:
Chris@909: PAGE
Chris@909:
Chris@909: # keep scanned tokens for later use
Chris@909: tokens = CodeRay.scan('{ "just": "an", "example": 42 }', :json)
Chris@909: assert_kind_of CodeRay::TokensProxy, tokens
Chris@909:
Chris@909: assert_equal ["{", :operator, " ", :space, :begin_group, :key,
Chris@909: "\"", :delimiter, "just", :content, "\"", :delimiter,
Chris@909: :end_group, :key, ":", :operator, " ", :space,
Chris@909: :begin_group, :string, "\"", :delimiter, "an", :content,
Chris@909: "\"", :delimiter, :end_group, :string, ",", :operator,
Chris@909: " ", :space, :begin_group, :key, "\"", :delimiter,
Chris@909: "example", :content, "\"", :delimiter, :end_group, :key,
Chris@909: ":", :operator, " ", :space, "42", :integer,
Chris@909: " ", :space, "}", :operator], tokens.tokens
Chris@909:
Chris@909: # produce a token statistic
Chris@909: assert_equal <<-STATISTIC, tokens.statistic
Chris@909:
Chris@909: Code Statistics
Chris@909:
Chris@909: Tokens 26
Chris@909: Non-Whitespace 15
Chris@909: Bytes Total 31
Chris@909:
Chris@909: Token Types (7):
Chris@909: type count ratio size (average)
Chris@909: -------------------------------------------------------------
Chris@909: TOTAL 26 100.00 % 1.2
Chris@909: delimiter 6 23.08 % 1.0
Chris@909: operator 5 19.23 % 1.0
Chris@909: space 5 19.23 % 1.0
Chris@909: key 4 15.38 % 0.0
Chris@909: :begin_group 3 11.54 % 0.0
Chris@909: :end_group 3 11.54 % 0.0
Chris@909: content 3 11.54 % 4.3
Chris@909: string 2 7.69 % 0.0
Chris@909: integer 1 3.85 % 2.0
Chris@909:
Chris@909: STATISTIC
Chris@909:
Chris@909: # count the tokens
Chris@909: assert_equal 26, tokens.count
Chris@909:
Chris@909: # produce a HTML div, but with CSS classes
Chris@909: div = tokens.div(:css => :class)
Chris@909: assert_equal <<-DIV, div
Chris@909:
Chris@909:
{ "just": "an", "example": 42 }
Chris@909:
Chris@909: DIV
Chris@909:
Chris@909: # highlight a file (HTML div); guess the file type base on the extension
Chris@909: require 'coderay/helpers/file_type'
Chris@909: assert_equal :ruby, CodeRay::FileType[__FILE__]
Chris@909:
Chris@909: # get a new scanner for Python
Chris@909: python_scanner = CodeRay.scanner :python
Chris@909: assert_kind_of CodeRay::Scanners::Python, python_scanner
Chris@909:
Chris@909: # get a new encoder for terminal
Chris@909: terminal_encoder = CodeRay.encoder :term
Chris@909: assert_kind_of CodeRay::Encoders::Terminal, terminal_encoder
Chris@909:
Chris@909: # scanning into tokens
Chris@909: tokens = python_scanner.tokenize 'import this; # The Zen of Python'
Chris@909: assert_equal ["import", :keyword, " ", :space, "this", :include,
Chris@909: ";", :operator, " ", :space, "# The Zen of Python", :comment], tokens
Chris@909:
Chris@909: # format the tokens
Chris@909: term = terminal_encoder.encode_tokens(tokens)
Chris@909: assert_equal "\e[1;31mimport\e[0m \e[33mthis\e[0m; \e[37m# The Zen of Python\e[0m", term
Chris@909:
Chris@909: # re-using scanner and encoder
Chris@909: ruby_highlighter = CodeRay::Duo[:ruby, :div]
Chris@909: div = ruby_highlighter.encode('puts "Hello, world!"')
Chris@909: assert_equal <<-DIV, div
Chris@909:
Chris@909: DIV
Chris@909: end
Chris@909:
Chris@909: end