ported to test::output
[language-befunge.git] / t / 4-interpreter / trefunge.t
blobc677bcf0d60215a6201dd0d5349722f8c96a60ff
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 strict;
12 use warnings;
14 use Language::Befunge;
15 use aliased 'Language::Befunge::Vector' => 'LBV';
17 use Test::More tests => 11;
18 use Test::Output;
20 my $tref;
23 # basic constructor.
24 $tref = Language::Befunge->new( {file=>'t/_resources/q.bf', syntax=>'trefunge98'} );
25 stdout_is { $tref->run_code } '', 'constructor worked';
28 # custom constructor.
29 $tref = Language::Befunge->new({
30     syntax  => 'trefunge98',
31     storage => 'Language::Befunge::Storage::Generic::Vec' });
32 is(ref($tref->get_storage), 'Language::Befunge::Storage::Generic::Vec', 'storage specified');
33 $tref = Language::Befunge->new({
34     syntax   => 'trefunge98',
35     wrapping => 'Language::Befunge::Wrapping::LaheySpace' });
36 is(ref($tref->get_wrapping), 'Language::Befunge::Wrapping::LaheySpace', 'wrapping specified');
37 $tref = Language::Befunge->new({
38     syntax => 'trefunge98',
39     ops    => 'Language::Befunge::Ops::GenericFunge98' });
40 ok(exists($$tref{ops}{m}), 'ops specified');
41 $tref = Language::Befunge->new({
42     syntax => 'trefunge98',
43     dims   => 4 });
44 is($$tref{dimensions}, 4, 'dims specified');
47 # basic reading.
48 $tref = Language::Befunge->new( {syntax=>'trefunge98'} );
49 $tref->read_file( "t/_resources/q.bf" );
50 stdout_is { $tref->run_code } '', 'read_file';
53 # basic storing.
54 $tref->store_code( <<'END_OF_CODE' );
56 END_OF_CODE
57 stdout_is { $tref->run_code } '', 'store_code';
60 # interpreter must treat non-characters as if they were an 'r' instruction.
61 $tref->store_code( <<'END_OF_CODE' );
62 01-c00p#q1.2 q
63 END_OF_CODE
64 stdout_is { $tref->run_code } '1 2 ', 'treats non-characters like "r"';
67 # interpreter must treat non-commands as if they were an 'r' instruction.
68 $tref->store_code( <<'END_OF_CODE' );
69 01+c00p#q1.2 q
70 END_OF_CODE
71 stdout_is { $tref->run_code } '1 2 ', 'treats non-commands like "r"';
74 # interpreter reads trefunge code properly, and operates in 3 dimensions, and
75 # knows that vectors are 3 integers.
76 my $code = <<"END_OF_CODE";
77 #v401-11x
78  >..q    
79 \f h>      
80   ^3   < 
81 END_OF_CODE
82 $tref->store_code( $code );
83 stdout_is { $tref->run_code } '3 4 ', 'full operation';
86 # rectangle() returns the original box again
87 chomp $code;
88 is( $tref->get_storage->rectangle( LBV->new(0,0,0), LBV->new(9,2,2) ),
89     $code, 'rectangle works' );