updating copyright
[language-befunge.git] / t / 2-ops / stdio_in_num.t
blob80edbc6277867df12e84d113ec15fdb01f2dfb07
1 #!perl
3 # This file is part of Language::Befunge.
4 # Copyright (c) 2001-2009 Jerome Quelin, all rights reserved.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the same terms as Perl itself.
11 use Language::Befunge::Ops;
13 use strict;
14 use warnings;
16 use Language::Befunge::Interpreter;
17 use Language::Befunge::IP;
18 use Language::Befunge::Ops;
19 use Language::Befunge::Vector;
20 use Test::More tests => 8;
21 use IO::Pipe;
22 use IO::Select;
24 my ($lbi, $ip, $v);
27 $lbi = Language::Befunge::Interpreter->new;
28 $ip  = Language::Befunge::IP->new;
29 $v   = Language::Befunge::Vector->new(1,0);
30 $ip->set_delta( $v );
31 $lbi->set_curip( $ip );
32 my $pid = fork_input("321\n");
33 Language::Befunge::Ops::stdio_in_num( $lbi );
34 waitpid($pid, 0);
35 is( $ip->get_position, '(0,0)', 'stdio_in_num does not move ip' );
36 is( $ip->get_delta, '(1,0)', 'stdio_in_num does not reflect (yet)' );
37 is( $ip->spop, 321, 'stdio_in_num pushes value on ip' );
39 Language::Befunge::Ops::stdio_in_num( $lbi );
40 is( $ip->spop, 0, 'stdio_in_num read nothing' );
41 is( $ip->get_delta, '(-1,0)', 'stdio_in_num reflects on eof' );
43 # again (for coverage)
44 Language::Befunge::Ops::stdio_in_num( $lbi );
45 is( $ip->spop, 0, 'stdio_in_num read nothing' );
47 # overflow saturates
48 $pid = fork_input("99999999999\n");
49 Language::Befunge::Ops::stdio_in_num( $lbi );
50 waitpid($pid, 0);
51 is( $ip->spop, 2**31-1, 'stdio_in_num saturates on overflow' );
53 # underflow saturates
54 $pid = fork_input("-99999999999\n");
55 Language::Befunge::Ops::stdio_in_num( $lbi );
56 waitpid($pid, 0);
57 is( $ip->spop, -2**31, 'stdio_in_num saturates on underflow' );
61 sub fork_input {
62     my $data = shift;
63     my $pipe = IO::Pipe->new();
64     my $pid = fork();
65     if($pid) {
66         $pipe->reader();
67         *STDIN = *$pipe;
68         return $pid;
69     }
70     alarm(5); # timeout on failure
71     $pipe->writer();
72     $pipe->print($data);
73     exit(0);