test/test_shell.rb in rib-1.5.1 vs test/test_shell.rb in rib-1.5.2

- old
+ new

@@ -3,118 +3,167 @@ require 'rib/shell' describe Rib::Shell do paste :rib - before do - Rib.disable_plugins - @shell = nil - end - - def shell - @shell ||= Rib::Shell.new - end - describe '#loop' do def input str mock(shell).get_input{str} shell.loop - true.should.eq true + ok end - would 'exit' do input('exit' ) end - would 'also exit' do input(' exit') end + + would 'exit' do input('exit' ) end + would 'also exit' do input(' exit') end would 'ctrl+d' do mock(shell).puts{} ; input(nil) end would ':q' do shell.config[:exit] << ':q'; input(':q') end would '\q' do shell.config[:exit] << '\q'; input('\q') end + + would 'not puts anything if it is not running' do + mock(shell).puts.times(0) + + shell.eval_binding.eval('self').instance_variable_set(:@shell, shell) + + input('@shell.stop; throw :rib_exit') + end end describe '#loop_once' do def input str=nil if block_given? mock(shell).get_input{ yield } else mock(shell).get_input{ str } end + shell.loop_once - true.should.eq true + + ok end would 'handles ctrl+c' do mock(shell).handle_interrupt{} + input{ raise Interrupt } end would 'prints result' do mock(shell).puts('=> "mm"'){} + input('"m" * 2') end would 'error in print_result' do mock(Rib).warn(matching(/Error while printing result.*BOOM/m)){} + input('obj = Object.new; def obj.inspect; raise "BOOM"; end; obj') end would 'not crash if user input is a blackhole' do mock(Rib).warn(matching(/Error while printing result/)){} + input('Rib::Blackhole') end would 'print error from eval' do mock(shell).puts(matching(/RuntimeError/)){} + input('raise "blah"') end end describe '#prompt' do would 'be changeable' do shell.config[:prompt] = '> ' - shell.prompt.should.eq '> ' + + expect(shell.prompt).eq '> ' end end describe '#eval_input' do before do @line = shell.config[:line] end would 'line' do shell.eval_input('10 ** 2') - shell.config[:line].should.eq @line + 1 + + expect(shell.config[:line]).eq @line + 1 end would 'print error and increments line' do result, err = shell.eval_input('{') - result.should.eq nil - err.should.kind_of?(SyntaxError) - shell.config[:line].should.eq @line + 1 + + expect(result).eq nil + expect(err).kind_of?(SyntaxError) + expect(shell.config[:line]).eq @line + 1 end end + describe '#running?' do + would 'have complete flow' do + expect(shell).not.running? + + mock(shell).get_input do + expect(shell).running? + + mock(shell).puts{} + + nil + end + + shell.loop + + expect(shell).not.running? + end + end + + describe '#stop' do + would 'stop the loop if it is stopped' do + mock(shell).get_input do + expect(shell).running? + + shell.stop + + expect(shell).not.running? + + 'Rib::Skip' + end + + shell.loop + end + end + would 'call after_loop even if in_loop raises' do mock(shell).loop_once{ raise 'boom' } mock(Rib).warn(is_a(String)){} mock(shell).after_loop{} - lambda{shell.loop}.should.raise(RuntimeError) + + expect.raise(RuntimeError) do + shell.loop + end end would 'have empty binding' do - shell.eval_input('local_variables').first.should.empty? + expect(shell.eval_input('local_variables').first).empty? end would 'not pollute main' do - shell.eval_input('main').first.should.eq 'rib' + expect(shell.eval_input('main').first).eq 'rib' end would 'warn on removing main' do TOPLEVEL_BINDING.eval <<-RUBY singleton_class.module_eval do def main; end end RUBY + mock(Rib).warn(is_a(String)){} - shell.eval_input('main').first.should.eq 'rib' + + expect(shell.eval_input('main').first).eq 'rib' end would 'be main' do - shell.eval_input('self.inspect').first.should.eq 'main' + expect(shell.eval_input('self.inspect').first).eq 'main' end end