The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Carp;
use Capture::Tiny 'capture';

sub no_err {
    err_like( $_[0], qr/^$/);
}

sub err_like {
    my ($stdout, $stderr);

    ($stdout, $stderr) = capture \&{$_[0]};

#  SKIP: {
#        skip "STDERR not available under Win32", 1 if $^O =~ /mswin32/i;
        like($stderr, $_[1]);
#    }
}

sub list_equal {
    my ($eq, $a, $b) = @_;

    croak "list_equal: \$a and \$b not lists"
      unless ref $a eq 'ARRAY' && ref $b eq 'ARRAY';

    return 0 unless @$a == @$b;          # compare lengths
    my @eq = map { &$eq ($a->[$_], $b->[$_]) } (0 .. $#$a);
    return 0 unless (grep ($_ == 1, @eq)) == @eq;
}

sub slist_equal {
    my ($a, $b) = @_;
    list_equal (sub {
                    my ($a, $b) = @_;
                    (defined $a && defined $b && $a eq $b) ||
                      (! defined $a && ! defined $b);
                }, $a, $b);
}

sub test_entry {
    my ($entry, $type, $key, $fields, $values, $test) = @_;
    my ($i, @vals);

    $test ||= "";

    croak "test_entry: num fields != num values"
      unless $#$fields == $#$values;
    ok($entry->parse_ok, "Parse ok for $test");
    is($entry->type, $type, "Type ok for $test");

    if (defined $key) {
        is($entry->key, $key, "Key ok for $test");
    } else {
        ok(!defined $entry->key, "Key ok for $test");
    }

    ok(slist_equal ([$entry->fieldlist], $fields));

    for $i (0 .. $#$fields) {   
        my $val = $entry->get ($fields->[$i]) || '';        
        ok($entry->exists ($fields->[$i]));
        is($val, $values->[$i]);
    }

    @vals = map ($_ || '', $entry->get (@$fields));
    ok (slist_equal (\@vals, $values));
}

1;