say "1..13";
EXTERNAL::eval_perl5('$| = 1');
$OUT.unbuffered;

EXTERNAL::eval_perl5('print "ok 1\n"');
my $foo = EXTERNAL::eval_perl5('"ok 2";');
say $foo.Str;
my $closure = EXTERNAL::eval_perl5('print "ok 3\n";sub {print "ok 5 # from p5 sub\n"}');
say "ok 4 # smop lives after p5 sub is defined";
$closure();
say "ok 6 # smop lives";
my $closure2 = EXTERNAL::eval_perl5('
    sub {
        print "ok 7 # passing SV* values back and forth works\n" if $_[0] eq "abc" && $_[1] eq "123";
    }
');
$closure2(EXTERNAL::eval_perl5('"abc"'),EXTERNAL::eval_perl5('"123"'));
my $p5object = EXTERNAL::eval_perl5('
    package Foo;
    sub ok8 {
        my ($self,$arg) = @_;
        if ($self->{attr} == 175 && $arg eq "some StRiNg") {
            print "ok 8 # method call on SV* works\n";
        } else {
            print "not ok 8 #",$self->{attr},"|",$arg,"\n";
        }
    }
    bless {attr => 175},"Foo";
');
$p5object.ok8(EXTERNAL::eval_perl5('"some StRiNg"'));
say "ok ",EXTERNAL::eval_perl5('9').int," # int works";

knowhow Foo {
    method ok10 {
        say "ok 10";
    }
    method ok12 {
        say "ok 12";
    }
}
(EXTERNAL::eval_perl5('sub {$::smop_object = $_[0]}'))(Foo.FETCH);
EXTERNAL::eval_perl5('
    $::smop_object->ok10;
    print "ok 11\n";
    $::smop_object->ok12;
');
say "ok 13";