The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 11;

use Data::Dumper;
require Inline::denter;
use Inline Ruby;
# TEST
ok(1);

# Depending on whether FLATTEN_CALLBACK_ARGS is defined or not, array refs may
# be flattened on their way to the Perl iterators. To enable passing the tests
# anyway, we'll just make sure to check for that here:
my %results = (
    0	=> [1, "2", [3], {4 => 5}],
    1	=> [1, "2", 3, {4 => 5}],
);
my $obj = new Iterator(1, "2", [3], {4 => 5});

my $n;
sub my_iter {
    my $element = shift;
    print "It looks like Ruby passed me this: ", Dumper($element);

    my $got = Inline::denter->new->indent($element);
    my $exp = Inline::denter->new->indent(
	$results{Inline::Ruby::config_var("FLATTEN_CALLBACK_ARGS")}[$n++]
    );
    print Dumper $got, $exp;
    # TEST*(4+4)
    is($got, $exp);
}

$n = 0;
$obj->iter(\&my_iter)->each;
$n = 0;
$obj->iter(\&my_iter)->each_proc;

# We WANT this to fail:
eval {
    $obj->each();
};
my $Err = $@;
# TEST
is ($Err->type, 'LocalJumpError', "Error type");
# TEST
like (
    $Err->message,
    qr/\Ano block given(?: \(yield\))?\z/,
    "Message is correct.",
);
print "NOTE: $@\n";

__END__
__Ruby__

class Iterator
  def initialize(*elements)
    @elements = elements
  end
  def each
    @elements.each { |x| yield x }
  end
  def each_proc(&pr)
    @elements.each { |x| pr.call(x) }
  end
end