3 # This file is part of Language::Befunge.
4 # Copyright (c) 2001-2008 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 #---------------------------------------#
12 # The math functions. #
13 #---------------------------------------#
16 use Language::Befunge;
17 use POSIX qw! tmpnam !;
25 my $bef = Language::Befunge->new;
28 # In order to see what happens...
31 open OUT, ">$file" or die $!;
37 open OUT, "<$file" or die $!;
49 sel; # regular multiplication.
50 $bef->store_code( <<'END_OF_CODE' );
57 $bef->store_code( <<'END_OF_CODE' );
63 sel; # program overflow.
64 $bef->store_code( <<'END_OF_CODE' );
65 aaa** aaa** * aaa** aaa** * * . q
67 eval { $bef->run_code; };
69 ok( $@, qr/program overflow while performing multiplication/ );
70 sel; # program underflow.
71 $bef->store_code( <<'END_OF_CODE' );
72 1- aaa*** aaa** * aaa** aaa** * * . q
74 eval { $bef->run_code; };
76 ok( $@, qr/program underflow while performing multiplication/ );
77 BEGIN { $tests += 4 };
81 sel; # regular addition.
82 $bef->store_code( <<'END_OF_CODE' );
89 $bef->store_code( <<'END_OF_CODE' );
95 sel; # program overflow.
96 $bef->store_code( <<'END_OF_CODE' );
97 2+a* 1+a* 4+a* 7+a* 4+a* 8+a* 3+a* 6+a* 4+a* 6+ f+ .q
99 eval { $bef->run_code; };
101 ok( $@, qr/program overflow while performing addition/ );
102 sel; # program underflow.
103 $bef->store_code( <<'END_OF_CODE' );
104 2+a* 1+a* 4+a* 7+a* 4+a* 8+a* 3+a* 6+a* 4+a* 6+ - 0f- + .q
106 eval { $bef->run_code; };
108 ok( $@, qr/program underflow while performing addition/ );
109 BEGIN { $tests += 4 };
113 sel; # regular substraction.
114 $bef->store_code( <<'END_OF_CODE' );
120 sel; # regular substraction (negative).
121 $bef->store_code( <<'END_OF_CODE' );
128 $bef->store_code( <<'END_OF_CODE' );
134 sel; # program overflow.
135 $bef->store_code( <<'END_OF_CODE' );
136 2+a* 1+a* 4+a* 7+a* 4+a* 8+a* 3+a* 6+a* 4+a* 6+ 0f- - .q
138 eval { $bef->run_code; };
140 ok( $@, qr/program overflow while performing substraction/ );
141 sel; # program underflow.
142 $bef->store_code( <<'END_OF_CODE' );
143 2+a* 1+a* 4+a* 7+a* 4+a* 8+a* 3+a* 6+a* 4+a* 6+ - f- .q
145 eval { $bef->run_code; };
147 ok( $@, qr/program underflow while performing substraction/ );
148 BEGIN { $tests += 5 };
152 sel; # regular division.
153 $bef->store_code( <<'END_OF_CODE' );
159 sel; # regular division (non-integer).
160 $bef->store_code( <<'END_OF_CODE' );
167 $bef->store_code( <<'END_OF_CODE' );
173 sel; # division by zero.
174 $bef->store_code( <<'END_OF_CODE' );
180 # Can't over/underflow integer division.
181 BEGIN { $tests += 4 };
184 sel; # regular remainder.
185 $bef->store_code( <<'END_OF_CODE' );
191 sel; # regular remainder (non-integer).
192 $bef->store_code( <<'END_OF_CODE' );
199 $bef->store_code( <<'END_OF_CODE' );
205 sel; # remainder by zero.
206 $bef->store_code( <<'END_OF_CODE' );
212 # Can't over/underflow integer remainder.
213 BEGIN { $tests += 4 };
216 BEGIN { plan tests => $tests };