v4.13
[language-befunge.git] / t / 5-befunge / e-flow.t
blob1170aa9a8265fcf1d44393cb3d7e8f7dcd0a89b3
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 # -- flow control
13 use strict;
14 use warnings;
16 use Test::More tests => 17;
17 use Test::Exception;
18 use Test::Output;
20 use Language::Befunge;
21 use Language::Befunge::IP;
22 use Language::Befunge::Vector;
23 my $bef = Language::Befunge->new;
26 # space is a no-op
27 $bef->store_code( 'f   f  +     7       +  ,   q' );
28 stdout_is { $bef->run_code } '%', 'space is a no-op';
31 # z is a true no-op
32 $bef->store_code( 'zzzfzzzfzz+zzzzz7zzzzzzz+zz,zzzq' );
33 stdout_is { $bef->run_code } '%', 'z is a true no-op';
36 # trampoline
37 $bef->store_code( '1#2.q' );
38 stdout_is { $bef->run_code } '1 ', 'trampoline';
41 # stop
42 $bef->store_code( '1.@' );
43 stdout_is { $bef->run_code } '1 ', 'stop';
46 # comments / jump over
47 $bef->store_code( '2;this is a comment;1+.@' );
48 stdout_is { $bef->run_code } '3 ', 'comments are jumped over';
51 # jump to
52 $bef->store_code( '2j123..q' );
53 stdout_is { $bef->run_code } '3 0 ', 'jump to, positive';
54 $bef->store_code( '0j1.q' );
55 stdout_is { $bef->run_code } '1 ', 'jump to, null';
56 $bef->store_code( <<'END_OF_CODE' );
57 v   q.1 <>06-j2.q
58 >        ^
59 END_OF_CODE
60 stdout_is { $bef->run_code } '1 ', 'jump to, negative';
63 # quit instruction
64 $bef->store_code( 'aq' );
65 my $rv = $bef->run_code;
66 is( $rv, 10, 'exit return value' );
69 # repeat instruction (glurps)
70 $bef->store_code( '3572k.q' );
71 stdout_is { $bef->run_code } '7 5 3 ', 'repeat, normal';
72 $bef->store_code( '0k.q' );
73 stdout_is { $bef->run_code } '', 'repeat, null';
74 $bef->store_code( <<'END_OF_CODE' );
75 5kv
76  > 1.q
77   >2.q
78 END_OF_CODE
79 stdout_is { $bef->run_code } '1 ', 'repeat, useless';
80 $bef->store_code( '5-k43.q' );
81 stdout_is { $bef->run_code } '3 ', 'repeat, negative';
82 $bef->store_code( '5k;q' );
83 stdout_is { $bef->run_code } '', 'repeat, forbidden char';
84 $bef->store_code( '5kkq' );
85 stdout_is { $bef->run_code } '', 'repeat, repeat instruction';
87 # short circuit
88 $bef->store_code( '' );
89 $bef->set_curip( Language::Befunge::IP->new );
90 $bef->get_curip->set_position( Language::Befunge::Vector->new_zeroes(2) );
91 throws_ok { $bef->move_ip( $bef->get_curip, qr/ / ) } qr/infinite loop/,
92     'move_ip() short circuit on a dead end';
93 $bef->store_code( ' ;' );
94 $bef->set_curip( Language::Befunge::IP->new );
95 $bef->get_curip->set_position( Language::Befunge::Vector->new_zeroes(2) );
96 throws_ok { $bef->move_ip( $bef->get_curip, qr/ / ) } qr/infinite loop/,
97     'move_ip() short circuit on non closed comment';