The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 3;
use IO::Handle;

use IO::Select;
use Lirc::Client;

my $lirc = Lirc::Client->new( {
        prog   => "lirc-client-test",
        rcfile => "samples/lircrc.3",
        debug  => 0,
        fake   => 1,
} );
ok( $lirc, "created a lirc object" );

pipe my $read, my $write or die $!;
$write->autoflush(1);
$read->autoflush(1);
$lirc->{sock} = $read;
print $write "0 0 play test-remote\n";
$write->flush;
print $write "0 0 pause test-remote\n";
$write->flush;

#close $write;  # should not need to close

my @codes = qw/PLAY PAUSE/;
my $count = 0;

my $select = IO::Select->new();
$select->add( $lirc->sock );
while (1) {

    # do your own stuff, if you want
    if ( my @ready = $select->can_read(0) ) {

        # an IR event has been received
        # may not be a full line from lirc, but I have never seen one
        my @codes = $lirc->next_codes;    # should not block
        for my $code (@codes) {
            process($code);
        }
    }
}

sub process {
    my $code = shift;

    is( $code, shift @codes, "recognized command " . ++$count );
    exit if $count > 1;
}