syntax error fix in makefile.pl
[language-befunge.git] / t / 2-ops / flow_repeat.t
blobf38961e1d0d8791d409578175634725ccc77e5bd
1 #!perl
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 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::Exception;
21 use Test::More tests => 8;
23 my ($lbi, $ip, $v);
26 $lbi = Language::Befunge::Interpreter->new;
27 $ip  = Language::Befunge::IP->new;
28 $v   = Language::Befunge::Vector->new(1,0);
29 $ip->set_delta( $v );
30 $lbi->set_curip( $ip );
32 $ip->spush( 3, 0 );
33 $lbi->store_code( '789q' );
34 Language::Befunge::Ops::flow_repeat( $lbi );
35 is( $ip->get_position, '(1,0)', 'flow_repeat moves ip' );
36 is( $ip->spop, 3, 'flow_repeat pops only one value' );
38 # regular instruction.
39 $v   = Language::Befunge::Vector->new(0,0);
40 $ip->set_position( $v );
41 $lbi->store_code( '789q' );
42 $ip->spush( 3 );
43 Language::Befunge::Ops::flow_repeat( $lbi );
44 is( join('|', $ip->spop_mult(4)), '0|8|8|8', 'flow_repeat repeats the following instruction' );
46 # positive (>256) instruction.
47 $v   = Language::Befunge::Vector->new(0,0);
48 $ip->set_position( $v );
49 $v   = Language::Befunge::Vector->new(1,0);
50 $ip->set_delta( $v );
51 $lbi->store_code( '789q' );
52 $v   = Language::Befunge::Vector->new(1,0);
53 $lbi->storage->set_value( $v, 400 );
54 $ip->spush( 3 );
55 Language::Befunge::Ops::flow_repeat( $lbi );
56 is( $ip->get_delta, '(-1,0)', 'flow_repeat repeats also instructions >256' );
58 # negative instruction.
59 $v   = Language::Befunge::Vector->new(0,0);
60 $ip->set_position( $v );
61 $v   = Language::Befunge::Vector->new(1,0);
62 $ip->set_delta( $v );
63 $lbi->store_code( '789q' );
64 $v   = Language::Befunge::Vector->new(1,0);
65 $lbi->storage->set_value( $v, -4 );
66 $ip->spush( 3 );
67 Language::Befunge::Ops::flow_repeat( $lbi );
68 is( $ip->get_delta, '(-1,0)', 'flow_repeat repeats also negative instructions' );
71 # can't repeat negatively.
72 $v   = Language::Befunge::Vector->new(1,0);
73 $ip->set_delta( $v );
74 $v   = Language::Befunge::Vector->new(0,0);
75 $ip->set_position( $v );
76 $lbi->store_code( '789q' );
77 $ip->spush( -3 );
78 throws_ok( sub { Language::Befunge::Ops::flow_repeat( $lbi ); },
79     qr/negative number/, 'flow_repeat cannot repeat negatively' );
81 # can't repeat forbidden instruction.
82 $v   = Language::Befunge::Vector->new(1,0);
83 $ip->set_delta( $v );
84 $v   = Language::Befunge::Vector->new(0,0);
85 $ip->set_position( $v );
86 $lbi->store_code( '7;9q' );
87 $ip->spush( 3 );
88 throws_ok( sub { Language::Befunge::Ops::flow_repeat( $lbi ); },
89     qr/a forbidden instruction/,
90     'flow_repeat cannot repeat a forbidden instruction' );
92 # can't repeat a k instruction.
93 $v   = Language::Befunge::Vector->new(1,0);
94 $ip->set_delta( $v );
95 $v   = Language::Befunge::Vector->new(0,0);
96 $ip->set_position( $v );
97 $lbi->store_code( '7k9q' );
98 $ip->spush( 3 );
99 throws_ok( sub { Language::Befunge::Ops::flow_repeat( $lbi ); },
100     qr/a repeat instruction/,
101     'flow_repeat cannot repeat a repeat instruction' );