require 'irb' begin require 'yamatanooroti' class IRB::TestRendering < Yamatanooroti::TestCase def setup @pwd = Dir.pwd suffix = '%010d' % Random.rand(0..65535) @tmpdir = File.join(File.expand_path(Dir.tmpdir), "test_irb_#{$$}_#{suffix}") begin Dir.mkdir(@tmpdir) rescue Errno::EEXIST FileUtils.rm_rf(@tmpdir) Dir.mkdir(@tmpdir) end @irbrc_backup = ENV['IRBRC'] @irbrc_file = ENV['IRBRC'] = File.join(@tmpdir, 'temporaty_irbrc') File.unlink(@irbrc_file) if File.exist?(@irbrc_file) @ruby_file = File.join(@tmpdir, 'ruby_file.rb') File.unlink(@ruby_file) if File.exist?(@ruby_file) end def teardown FileUtils.rm_rf(@tmpdir) ENV['IRBRC'] = @irbrc_backup ENV.delete('RELINE_TEST_PROMPT') if ENV['RELINE_TEST_PROMPT'] end def test_launch write_irbrc <<~'LINES' puts 'start IRB' LINES start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') write(<<~EOC) 'Hello, World!' EOC close assert_screen(<<~EOC) start IRB irb(main):001:0> 'Hello, World!' => "Hello, World!" irb(main):002:0> EOC end def test_multiline_paste write_irbrc <<~'LINES' puts 'start IRB' LINES start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') write(<<~EOC) class A def inspect; '#'; end def a; self; end def b; true; end end a = A.new a .a .b EOC close assert_screen(<<~EOC) start IRB irb(main):001:1* class A irb(main):002:1* def inspect; '#'; end irb(main):003:1* def a; self; end irb(main):004:1* def b; true; end irb(main):005:0> end => :b irb(main):006:0> irb(main):007:0> a = A.new => # irb(main):008:0> irb(main):009:0> a irb(main):010:0> .a irb(main):011:0> .b => true irb(main):012:0> EOC end def test_evaluate_each_toplevel_statement_by_multiline_paste write_irbrc <<~'LINES' puts 'start IRB' LINES start_terminal(40, 80, %W{ruby -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') write(<<~EOC) class A def inspect; '#'; end def b; self; end def c; true; end end a = A.new a .b # aaa .c (a) &.b() class A def b; self; end; def c; true; end; end; a = A.new a .b # aaa .c (a) &.b() EOC close assert_screen(<<~EOC) start IRB irb(main):001:1* class A irb(main):002:1* def inspect; '#'; end irb(main):003:1* def b; self; end irb(main):004:1* def c; true; end irb(main):005:0> end => :c irb(main):006:0> irb(main):007:0> a = A.new => # irb(main):008:0> irb(main):009:0> a irb(main):010:0> .b irb(main):011:0> # aaa irb(main):012:0> .c => true irb(main):013:0> irb(main):014:0> (a) irb(main):015:0> &.b() => # irb(main):016:0> irb(main):017:0> irb(main):018:0> class A def b; self; end; def c; true; end; end; => :c irb(main):019:0> a = A.new => # irb(main):020:0> a irb(main):021:0> .b irb(main):022:0> # aaa irb(main):023:0> .c => true irb(main):024:0> (a) irb(main):025:0> &.b() => # irb(main):026:0> EOC end def test_symbol_with_backtick write_irbrc <<~'LINES' puts 'start IRB' LINES start_terminal(40, 80, %W{ruby -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') write(<<~EOC) :` EOC close assert_screen(<<~EOC) start IRB irb(main):001:0> :` => :` irb(main):002:0> EOC end def test_autocomplete_with_showdoc_in_gaps_on_narrow_screen_right pend "Needs a dummy document to show doc" write_irbrc <<~'LINES' IRB.conf[:PROMPT][:MY_PROMPT] = { :PROMPT_I => "%03n> ", :PROMPT_N => "%03n> ", :PROMPT_S => "%03n> ", :PROMPT_C => "%03n> " } IRB.conf[:PROMPT_MODE] = :MY_PROMPT puts 'start IRB' LINES start_terminal(4, 19, %W{ruby -I/home/aycabta/ruby/reline/lib -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') write("Str\C-i") close assert_screen(<<~EOC) 001> String StringPress A StructString of byte EOC end def test_autocomplete_with_showdoc_in_gaps_on_narrow_screen_left pend "Needs a dummy document to show doc" write_irbrc <<~'LINES' IRB.conf[:PROMPT][:MY_PROMPT] = { :PROMPT_I => "%03n> ", :PROMPT_N => "%03n> ", :PROMPT_S => "%03n> ", :PROMPT_C => "%03n> " } IRB.conf[:PROMPT_MODE] = :MY_PROMPT puts 'start IRB' LINES start_terminal(4, 12, %W{ruby -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') write("Str\C-i") close assert_screen(<<~EOC) 001> String PressString StrinStruct of by EOC end def test_assignment_expression_truncate write_irbrc <<~'LINES' puts 'start IRB' LINES start_terminal(40, 80, %W{ruby -I#{@pwd}/lib #{@pwd}/exe/irb}, startup_message: 'start IRB') # Assignment expression code that turns into non-assignment expression after evaluation code = "a /'/i if false; a=1; x=1000.times.to_a#'.size" write(code + "\n") close assert_screen(<<~EOC) start IRB irb(main):001:0> #{code} => [0, ... irb(main):002:0> EOC end def test_debug write_ruby <<~'RUBY' puts "start IRB" binding.irb puts "Hello" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("debug\n") write("next\n") close assert_include_screen(<<~EOC) (rdbg) next # command [1, 3] in #{@ruby_file} 1| puts "start IRB" 2| binding.irb => 3| puts "Hello" EOC end def test_break write_ruby <<~'RUBY' puts "start IRB" binding.irb puts "Hello" puts "World" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("break 3\n") write("continue\n") close assert_include_screen(<<~EOC) (rdbg:irb) break 3 #0 BP - Line #{@ruby_file}:3 (line) EOC assert_include_screen(<<~EOC) (rdbg) continue # command [1, 4] in #{@ruby_file} 1| puts "start IRB" 2| binding.irb => 3| puts "Hello" 4| puts "World" =>#0
at #{@ruby_file}:3 Stop by #0 BP - Line #{@ruby_file}:3 (line) EOC end def test_delete write_ruby <<~'RUBY' puts "start IRB" binding.irb puts "Hello" binding.irb puts "World" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("break 5\n") write("continue\n") write("delete 0\n") close assert_include_screen(<<~EOC) (rdbg:irb) delete 0 deleted: #0 BP - Line #{@ruby_file}:5 (line) EOC end def test_next write_ruby <<~'RUBY' puts "start IRB" binding.irb puts "Hello" puts "World" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("next\n") close assert_include_screen(<<~EOC) (rdbg:irb) next [1, 4] in #{@ruby_file} 1| puts "start IRB" 2| binding.irb => 3| puts "Hello" 4| puts "World" =>#0
at #{@ruby_file}:3 EOC end def test_step write_ruby <<~'RUBY' puts "start IRB" def foo puts "Hello" end binding.irb foo puts "World" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("step\n") close assert_include_screen(<<~EOC) (rdbg:irb) step [1, 7] in #{@ruby_file} 1| puts "start IRB" 2| def foo => 3| puts "Hello" 4| end 5| binding.irb EOC end def test_continue write_ruby <<~'RUBY' puts "start IRB" binding.irb puts "Hello" binding.irb puts "World" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("continue\n") close assert_include_screen(<<~EOC) (rdbg:irb) continue Hello From: #{@ruby_file} @ line 4 : 1: puts "start IRB" 2: binding.irb 3: puts "Hello" => 4: binding.irb 5: puts "World" EOC end def test_finish write_ruby <<~'RUBY' puts "start IRB" def foo binding.irb puts "Hello" end foo puts "World" RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("finish\n") close assert_include_screen(<<~EOC) (rdbg:irb) finish Hello [1, 7] in #{@ruby_file} 1| puts "start IRB" 2| def foo 3| binding.irb 4| puts "Hello" => 5| end 6| foo EOC end def test_backtrace write_ruby <<~'RUBY' puts "start IRB" def foo binding.irb end foo RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("backtrace\n") close assert_include_screen(<<~EOC) (rdbg:irb) backtrace =>#0 Object#foo at #{@ruby_file}:3 #1
at #{@ruby_file}:5 EOC end def test_info write_ruby <<~'RUBY' puts "start IRB" a = 1 binding.irb RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("info\n") close assert_include_screen(<<~EOC) (rdbg:irb) info %self = main a = 1 EOC end def test_catch write_ruby <<~'RUBY' puts "start IRB" binding.irb raise NotImplementedError RUBY start_terminal(25, 80, %W{ruby -I#{@pwd}/lib #{@ruby_file}}, startup_message: 'start IRB') write("catch NotImplementedError\n") write("continue\n") close assert_include_screen(<<~EOC) Stop by #0 BP - Catch "NotImplementedError" EOC end private def assert_include_screen(expected) assert_include(result.join("\n"), expected) end def write_irbrc(content) File.open(@irbrc_file, 'w') do |f| f.write content end end def write_ruby(content) File.open(@ruby_file, 'w') do |f| f.write content end end end rescue LoadError, NameError # On Ruby repository, this test suit doesn't run because Ruby repo doesn't # have the yamatanooroti gem. end