1require 'test/unit' 2require_relative 'ruby/envutil' 3 4begin 5 require 'curses' 6 require 'pty' 7rescue LoadError 8end 9 10class TestCurses < Test::Unit::TestCase 11 def test_version 12 assert_instance_of(String, Curses::VERSION) 13 end 14end if defined? Curses 15 16class TestCurses 17 def run_curses(src, input = nil, timeout: 1) 18 PTY.spawn({"TERM"=>ENV["TERM"]||"dumb"}, EnvUtil.rubybin, "-e", <<-"src") {|r, w, pid| 19require 'timeout' 20require 'curses' 21include Curses 22init_screen 23begin 24 result = Timeout.timeout(#{timeout}) do 25 #{src} 26 end 27rescue Exception => e 28ensure 29 close_screen 30 puts "", [Marshal.dump([result, e])].pack('m').delete("\n") 31 print "\\0" 32 $stdio.flush 33end 34src 35 if input 36 w.print(input) 37 w.flush 38 end 39 res = r.gets("\0") 40 return unless res 41 res.chomp!("\0") 42 res, error = Marshal.load(res[/(.*)\Z/, 1].unpack('m')[0]) 43 raise error if error 44 return res 45 } 46 end 47 48 def test_getch 49 assert_equal("a", run_curses("getch", "a")) 50 end 51 def test_getch_cbreak 52 assert_equal("a", run_curses("cbreak; getch", "a")) 53 end 54 def test_getch_nocbreak 55 assert_raise(Timeout::Error) {run_curses("nocbreak; getch", "a")} 56 end 57 def test_getch_crmode 58 assert_equal("a", run_curses("crmode; getch", "a")) 59 end 60 def test_getch_nocrmode 61 assert_raise(Timeout::Error) {run_curses("nocrmode; getch", "a")} 62 end 63end if defined? TestCurses and defined? PTY 64