#!perl
# Copyright (C) 2001-2006, The Perl Foundation.
# $Id: interp.t 22477 2007-10-25 15:31:52Z paultcochrane $

use strict;
use warnings;
use lib qw( . lib ../lib ../../lib );

use Test::More;
use Parrot::Test tests => 8;

=head1 NAME

t/op/interp.t - Running the Interpreter

=head1 SYNOPSIS

    % prove t/op/interp.t

=head1 DESCRIPTION

Tests the old and new styles of running the Parrot interpreter and the
C<interpinfo> opcode.

=cut

SKIP: {
    skip( "we really shouldn't run just a label - use a sub", 1 );

    pasm_output_is( <<'CODE', <<'OUTPUT', "runinterp - new style" );
    new P0, 'ParrotInterpreter'
    print "calling\n"
    # set_addr/invoke ?
    runinterp P0, foo
    print "ending\n"
    end
    print "bad things!\n"
  foo:
    print "In 2\n"
    end
CODE
calling
In 2
ending
OUTPUT
}

pir_output_is( <<'CODE', <<'OUTPUT', 'runinterp - works without printing' );
.sub 'test' :main
    .local string actual
    .local pmc test_interp
               test_interp = new 'ParrotInterpreter'
    .local pmc stdout
               stdout = getstdout
    push stdout, 'string'

    print "uno\n"
    runinterp test_interp, pasm
    print "dos\n"

  get_stdout:
    $S0 = readline stdout
    actual .= $S0
    if $S0 goto get_stdout
    $S0 = pop stdout

    print actual
    goto pasm_end

  pasm:
    noop
    end
  pasm_end:
.end
CODE
uno
dos
OUTPUT

pir_output_is(
    <<'CODE', <<'OUTPUT', 'runinterp - works with printing', todo => 'something funky here' );
.sub 'test' :main
    .local string actual
    .local pmc test_interp
               test_interp = new 'ParrotInterpreter'
    .local pmc stdout
               stdout = getstdout
    push stdout, 'string'

    print "uno\n"
    runinterp test_interp, pasm
    print "dos\n"

  get_stdout:
    $S0 = readline stdout
    actual .= $S0
    if $S0 goto get_stdout
    $S0 = pop stdout

    print actual
    goto pasm_end

  pasm:
    print "y uno es igual a\n"
    end
  pasm_end:
.end
CODE
uno
y uno es igual a
dos
OUTPUT

# Need to disable DOD while trace is on, as there's a non-zero chance that a
# DOD sweep would occur, causing a bonus "DOD" line in the output, which makes
# the test fail.
pasm_output_like(
    <<'CODE', <<'OUTPUT', "restart trace", todo => "lines are out of order due to buffering" );
    printerr "ok 1\n"
    sweepoff
    set I0, 1
    trace I0
    printerr "ok 2\n"
    dec I0
    trace I0
    sweepon
    printerr "ok 3\n"
    end
CODE
/^ok\s1\n
(?:\s+8.*)?\n
ok\s2\n
(?:\s+10.*)?\n
(?:\s+12.*)?\n
ok\s3\n$/x
OUTPUT

# This is the behavior as of Parrot 0.4.3
# RT#46819 Should there be a warning?
pasm_output_is( <<'CODE', 'nada:', 'interp - warnings' );
    new P0, 'Undef'
    set I0, P0
    printerr "nada:"
    warningson 1
    new P1, 'Undef'
    set I0, P1
    end
CODE

pasm_output_is( <<'CODE', <<'OUTPUT', "getinterp" );
    .include "interpinfo.pasm"
    getinterp P0
    print "ok 1\n"
    set I0, P0[.INTERPINFO_ACTIVE_PMCS]
    interpinfo I1, .INTERPINFO_ACTIVE_PMCS
    eq I0, I1, ok2
    print "not "
  ok2:
    print "ok 2\n"
    end
CODE
ok 1
ok 2
OUTPUT

pasm_output_is( <<'CODE', <<'OUTPUT', "access argv" );
    get_params "0", P5
    .include "iglobals.pasm"
    getinterp P1
    set P2, P1[.IGLOBALS_ARGV_LIST]
    set I0, P5
    set I1, P2
    eq I0, I1, ok1
    print "not "
  ok1:
    print "ok 1\n"
    set S0, P5[0]
    set S1, P2[0]
    eq S0, S1, ok2
    print "not "
  ok2:
    print "ok 2\n"
    end
CODE
ok 1
ok 2
OUTPUT

pasm_output_is( <<'CODE', <<'OUTPUT', "check_events" );
    print "before\n"
    check_events
    print "after\n"
    end
CODE
before
after
OUTPUT

# Local Variables:
#   mode: cperl
#   cperl-indent-level: 4
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4:


syntax highlighted by Code2HTML, v. 0.9.1