#!/usr/bin/perl -w # vim: ts=2 sw=2 expandtab # Exercises Wheel::Curses use strict; use lib qw(./mylib ../mylib); sub POE::Kernel::ASSERT_DEFAULT () { 1 } sub POE::Kernel::TRACE_DEFAULT () { 0 } use Test::More; use Symbol qw(gensym); BEGIN { if ($^O eq "MSWin32" and not $ENV{POE_DANTIC}) { plan skip_all => "Can't multiplex consoles in $^O"; } eval "use IO::Pty"; plan skip_all => 'IO::Pty not available' if $@; eval { require Curses }; plan skip_all => 'Curses not available' if $@; } my ($saved_stdin, $saved_stdout, $pty_master, $pty_slave); BEGIN { # Redirect STDIN and STDOUT to temporary handles for the duration of # this test. $saved_stdin = gensym(); open($saved_stdin, "<&STDIN") or die "can't save stdin: $!"; $saved_stdout = gensym(); open($saved_stdout, ">&STDOUT") or die "can't save stdout: $!"; # Create a couple one-way pipes for our new stdin and stdout. $pty_master = IO::Pty->new() or die "pty: $!"; select $pty_master; $| = 1; $pty_slave = $pty_master->slave(); select $pty_slave; $| = 1; # Redirect our STDIN and STDOUT to the pipes. open(STDIN, "<&=" . fileno($pty_slave)) or die "stdin pipe redir: $!"; open(STDOUT, ">&=" . fileno($pty_slave)) or die "stdout pipe redir: $!"; select STDOUT; $| = 1; } BEGIN { plan skip_all => "Need help with Curses functions blocking under ptys"; plan tests => 5; use_ok('POE'); use_ok('POE::Wheel::Curses'); use_ok('POE::Filter::Stream'); use_ok('POE::Wheel::ReadWrite'); } # Restore the original stdio at the end of the run. END { if ($saved_stdin) { open(STDIN, "<&=" . fileno($saved_stdin)) or die "stdin restore: $!"; $saved_stdin = undef; } if ($saved_stdout) { open(STDOUT, ">&=" . fileno($saved_stdout)) or die "stdout restore: $!"; $saved_stdout = undef; } } ### Session to drive the tests. POE::Session->create( inline_states => { _start => \&test_start, got_keystroke => \&test_keystroke, got_readwrite_input => sub { }, _stop => sub { }, }, ); ### main loop POE::Kernel->run(); ### Event handlers from here on. sub test_start { my ($kernel, $heap) = @_[KERNEL, HEAP]; $heap->{child_input} = ""; $heap->{curses} = POE::Wheel::Curses->new( InputEvent => "got_keystroke" ); $heap->{readwrite} = POE::Wheel::ReadWrite->new( Handle => $pty_master, Filter => POE::Filter::Stream->new(), InputEvent => "got_readwrite_input", ); $heap->{readwrite}->put("this is a test!"); } sub test_keystroke { my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0]; $heap->{child_input} .= $input; if ($heap->{child_input} =~ /!/) { delete $heap->{curses}; delete $heap->{readwrite}; ok( $heap->{child_input} eq "this is a test!", "got keystrokes" ); } } 1;