Skip to content

Commit

Permalink
Bug fixes, and, reasonable tests for core...
Browse files Browse the repository at this point in the history
  • Loading branch information
raggi committed Nov 17, 2009
1 parent 769e85e commit 0ee651f
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 4 deletions.
8 changes: 6 additions & 2 deletions lib/ir.rb
Expand Up @@ -3,8 +3,10 @@ class Ir
autoload :Readline, 'ir/readline'
autoload :Completion, 'ir/completion'
autoload :SocketReadline, 'ir/socket_readline'
autoload :Test, 'ir/test'

FROM = "\tfrom "
CR = "\r"

PROMPTS = {}
PROMPTS[:simple] = {
Expand Down Expand Up @@ -32,11 +34,13 @@ class Ir
:thread_local_var => :ir,
:clear_on_interrupt => false,
:puts_on_interrupt => true,
:prompt_carriage_return => true,
:prompts => PROMPTS[:complex],
:inspector => lambda { |ir, o| ir.results o.inspect }
}

attr_accessor :prompt
attr_reader :options

def initialize(options = {})
@options = DEFAULTS.merge(options)
Expand Down Expand Up @@ -84,7 +88,7 @@ def prompt(name = nil, lineno = nil)
else
prompt.to_s
end
"\r#{s}"
"#{CR if @options[:prompt_carriage_return]}#{s}"
end

def notify_exception(exception)
Expand Down Expand Up @@ -122,7 +126,7 @@ def print(*args)
end

def puts(*args)
@output.puts(*args)
print(args.join(@term), @term)
end

# Immediately load irbrc
Expand Down
2 changes: 0 additions & 2 deletions lib/ir/readline.rb
Expand Up @@ -60,8 +60,6 @@ def consume
exit_on_eof do
interruptable do
if line = ::Readline.readline(@ir.prompt, @history && !@history_uniq)
line.strip!
next if line.empty?
if @history_uniq
idx = history.find_index(line)
history.delete_at(idx) if idx
Expand Down
165 changes: 165 additions & 0 deletions test/test_ir.rb
@@ -0,0 +1,165 @@
require "test/unit"
require 'stringio'

require "ir"

class TestIr < Test::Unit::TestCase

attr_reader :output, :ir

def ir_options
{
:output => output,
:prompts => Ir::PROMPTS[:simple],
:prompt_carriage_return => false
}
end

def setup_ir
@output = StringIO.new
@ir = Ir.new(ir_options)
end

def setup
setup_ir
end

def test_print
ir.print('foo bar')
output.rewind
assert_equal 'foo bar', output.read
ir.print(*%w(1 2 3))
output.rewind
assert_equal "foo bar123", output.read
end

def test_puts
ir.puts('foo bar')
output.rewind
assert_equal "foo bar\n", output.read
ir.puts(*%w(1 2 3))
output.rewind
assert_equal "foo bar\n1\n2\n3\n", output.read
end

def test_prompt_simple
assert_equal ">> ", ir.prompt
assert_equal ">> ", ir.prompt(:normal)
assert_equal " > ", ir.prompt(:syntax)
assert_equal "#> ", ir.prompt(:notify)
assert_equal "=> ", ir.prompt(:result)
end

def test_notify_exception
l = nil
begin
l = __LINE__; raise 'boom'
rescue
$!.backtrace.slice!(1..-1)
ir.notify_exception($!)
end
output.rewind
assert_equal <<-PLAIN.lines.map{|l|l.lstrip}.join, output.read
#> RuntimeError: boom
#> \tfrom #{__FILE__}:#{l}:in `#{__method__}'
PLAIN
end

def test_results
ir.results(%w(1 2 3))
output.rewind
assert_equal "=> 1\n2\n3\n", output.read
end

def test_interrupt
ir.options[:puts_on_interrupt] = false
ir.interrupt
output.rewind
assert_equal "", output.read
ir.options[:puts_on_interrupt] = true
ir.interrupt
output.rewind
assert_equal "\n", output.read
ir.options[:clear_on_interrupt] = false
ir << 'class A; self; '
ir.interrupt
ir << 'end'
output.rewind
assert_equal "\n\n=> A\n", output.read
end

def test_valid_syntax
ir << 'class A; self; end'
output.rewind
assert_equal "=> A\n", output.read
end

def test_incomplete_syntax
ir << 'class A; self;'
output.rewind
assert output.read.empty?
ir << 'end'
output.rewind
assert_equal "=> A\n", output.read
end

def test_raise_boom
ir << 'raise "boom"'
output.rewind
assert_equal "#> RuntimeError: boom\n#> \tfrom (ir):1\n", output.read
end

def test_does_not_consume_system_exit
assert_raises(SystemExit) do
ir << 'exit'
end
end

def test_inspector
inspector = lambda { |ir, o| ir.puts o.reverse }
ir = Ir.new(ir_options.merge(:inspector => inspector))
ir << '"foo"'
output.rewind
assert_equal %(oof\n), output.read
end

def test_thread_local_var
assert_equal ir, Thread.current[:ir]
ir = Ir.new(ir_options.merge(:thread_local_var => :a))
assert_equal ir, Thread.current[:a]
end

def test_name
ir = Ir.new(ir_options.merge(:name => 'test_ir'))
ir << 'raise "boom"'
output.rewind
assert_equal "#> RuntimeError: boom\n#> \tfrom test_ir:1\n", output.read
end

def test_term
ir = Ir.new(ir_options.merge(:term => '\\'))
ir << '1'
output.rewind
assert_equal "=> 1\\", output.read
end

def test_user_home
temp, ENV['HOME'] = ENV['home'], nil
ENV['HOMEDRIVE'] ||= 'C:'
ENV['HOMEPATH'] ||= '\\Users\\raggi'
assert_equal ENV['HOMEDRIVE'] + ENV['HOMEPATH'], Ir.user_home
ENV['HOME'] = '/home/raggi'
assert_equal '/home/raggi', Ir.user_home
ensure
ENV['HOME'] = temp
end

def test_binding_factory
flunk 'TODO'
end

def test_irrc
flunk 'using irbrc atm'
end

end

0 comments on commit 0ee651f

Please sign in to comment.