The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;

use Test::More tests => 5;

use POE qw( Wheel::TermKey );

pipe( my ( $rd, $wr ) ) or die "Cannot pipe() - $!";

# Sanitise this just in case
$ENV{TERM} = "vt100";

my $key;
my $wheel;
my $timedout;

POE::Session->create(
   inline_states => {
      _start => sub {
         pipe( my ( $rd, $wr ) ) or die "Cannot pipe() - $!";

         $wheel = POE::Wheel::TermKey->new(
            Term       => $rd,
            InputEvent => 'got_key',
         );
         $wr->syswrite( "\e" );

         $_[KERNEL]->delay( halfwait => $wheel->get_waittime / 2000 );
         $_[KERNEL]->delay( abort    => $wheel->get_waittime /  500 );
      },
      halfwait => sub {
         ok( !defined $key, '$key still not defined after 1/2 waittime' );
         $timedout = 1;
      },
      got_key => sub {
         my $key = $_[ARG0];

         is( $timedout, 1, '$timedout already when recieved key' );

         ok( $key->type_is_keysym,                     '$key->type_is_keysym after Escape timeout' );
         is( $key->sym, $wheel->keyname2sym("Escape"), '$key->keysym after Escape timeout' );
         is( $key->modifiers, 0,                       '$key->modifiers after Escape timeout' );

         # And we're done
         $_[KERNEL]->alarm( abort => undef );
         undef $wheel;
      },

      abort => sub {
         die "Expected to receive a key by now but we didn't";
      },
   },
);

POE::Kernel->run;