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