Acme-Cow-Interpreter

 view release on metacpan or  search on metacpan

t/10-methods.t  view on Meta::CPAN

#!perl

use strict;
use warnings;

use Test::More tests => 18;
use Test::Output;

use Acme::Cow::Interpreter;

my $file = 'examples/hello.cow';

################################################################################

my $init_obj_data = {prog     => [ ],
                     prog_pos =>  0,
                     mem      => [0],
                     mem_pos  =>  0,
                     reg      => undef,
                    };

# These commands print the string "Hello, World!" followed by a newline.

my $cow_commands = <<'EOF';
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO
MoO MoO Moo Moo MoO MoO MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo Moo MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO Moo MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo Moo MOo MOo MOo
MOo MOo MOo MOo MOo Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo
EOF

# These are the numerical codes equivalent to the commands above.

my $cow_codes =
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6,
 6, 6, 4, 4, 6, 6, 6, 4, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4,
 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 4, 6, 6, 6, 4, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5,
 5, 5, 5, 5, 5, 4, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
 6, 6, 6, 6, 4, 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4,   ];

################################################################################
# new()
################################################################################


ok( my $obj = Acme::Cow::Interpreter -> new(),
    "new() can be invoked");

is_deeply($obj, $init_obj_data,
          "new() returns the expected data structure");

################################################################################
# parse_string() and execute()

t/10-methods.t  view on Meta::CPAN

   "parse_string('<Cow code>') can be invoked");

is_deeply($obj->{prog}, $cow_codes,
          "parse_string() creates the expected data structure in object");

output_is(
          sub { $obj -> execute(); },
          "Hello, World!\n",
          "",
          "execute() returns the expected STDOUT and STDERR",
        );

################################################################################
# init()
################################################################################

ok($obj -> init(), "init() can be invoked");

is_deeply($obj, $init_obj_data,
          "init() returns the expected object data structure");

################################################################################
# parse_file()
################################################################################

ok($obj -> parse_file($file),
   "parse_file('$file') can be invoked");

is_deeply($obj->{prog}, $cow_codes,
          "parse_file() creates the expected data structure in object");

output_is(
          sub { $obj -> execute(); },
          "Hello, World!\n",
          "",
          "execute() returns the expected STDOUT and STDERR",
        );

################################################################################

my $code = <<'EOF';
MoO             increment current memory block to 1
MMM moO MMM     copy the value 1 to next memory block
MoO             increment current memory block to 2
MMM moO MMM     copy the value 2 to next memory block
MoO             increment current memory block to 3
mOo             decrement memory position
EOF

$obj -> parse_string($code) -> execute();

################################################################################
# dump_obj()
################################################################################

my $expected = <<'EOF';
$obj -> {prog}     = [6, 9, 2, 9, 6, 9, 2, 9, 6, 1];
$obj -> {prog_pos} = 9;
$obj -> {mem}      = [1, 2, 3];
$obj -> {mem_pos}  = 1;
$obj -> {reg}      = <undef>;
EOF

ok(my $got = $obj -> dump_obj(),
   "dump_obj() can be invoked");

ok($got eq $expected, "dump_obj() returns the expected output");

################################################################################
# dump_mem()
################################################################################

$expected = <<'EOF';
Memory block      2:            3
Memory block      1:            2 <<<
Memory block      0:            1

Register block:           <undef>
EOF

ok($got = $obj -> dump_mem(),
   "dump_obj() can be invoked");

ok($got eq $expected, "dump_mem() returns the expected output");

################################################################################
# copy()
################################################################################

ok(my $copy = $obj -> copy(),
   "dump_obj() can be invoked");

isa_ok($copy, 'Acme::Cow::Interpreter');

is_deeply($copy, $obj,
          "copy() returns the expected data structure");

SKIP: {
    eval { require Scalar::Util };

    skip "Scalar::Util not installed", 1 if $@;

    #ok(overload::StrVal($copy) ne overload::StrVal($obj),
    #   "copy() returns an object which is not the invocand object");

    ok(Scalar::Util::refaddr($copy) ne Scalar::Util::refaddr($obj),
       "copy() returns an object which is not the invocand object");
}

################################################################################
# dump_obj()
################################################################################



( run in 1.299 second using v1.01-cache-2.11-cpan-d80b1682f3f )