The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use strict;
use lib 't/lib';
use Std;
{
check_test(
sub {
cmp_deeply([], bag());
},
{
actual_ok => 1,
diag => "",
},
"empty eq"
);
check_test(
sub {
cmp_deeply(['a', 'b', 'b', ['c', 'd']], bag('b', 'a', ['c', 'd'], 'b'));
},
{
actual_ok => 1,
diag => "",
},
"elem eq"
);
check_test(
sub {
cmp_deeply(['a', [], 'b', 'b'], bag());
},
{
actual_ok => 0,
diag => <<EOM,
Comparing \$data as a Bag
Extra: 'a', 'b', 'b', 1 reference
EOM
},
"empty extra"
);
check_test(
sub {
cmp_deeply([], bag('a', [], 'a', 'b'));
},
{
actual_ok => 0,
diag => <<EOM,
Comparing \$data as a Bag
Missing: 'a', 'a', 'b', 1 reference
EOM
},
"empty missing"
);
check_test(
sub {
cmp_deeply(['a', 'a', 'b', [\"c"], "d", []], bag({}, 'a', [\"c"], 'd', 'd', "e"));
},
{
actual_ok => 0,
diag => <<EOM,
Comparing \$data as a Bag
Missing: 'd', 'e', 1 reference
Extra: 'a', 'b', 1 reference
EOM
},
"extra and missing"
);
check_test(
sub {
cmp_deeply("a", bag());
},
{
actual_ok => 0,
diag => <<EOM,
Comparing \$data as a Bag
got : 'a'
expect : An array to use as a Bag
EOM
},
"no array"
);
check_test(
sub {
cmp_deeply(['a', ['a', 'b', 'b'], ['c', 'd', 'c'], ['a', 'b', 'a']],
bag(bag('c', 'c', 'd'), bag('a', 'b', 'a'), bag('a', 'b', 'b'), 'a')
);
},
{
actual_ok => 1,
diag => '',
},
"bag of bags eq"
);
check_test(
sub {
cmp_deeply(['a', ['a', 'b', 'b'], ['c', 'd', 'c'], ['a', 'b', 'a']],
bag(bag('c', 'd', 'd'), bag('a', 'b', 'a'), bag('a', 'b', 'b'), 'a')
);
},
{
actual_ok => 0,
diag => <<EOM,
Comparing \$data as a Bag
Missing: 1 reference
Extra: 1 reference
EOM
},
"bag of bags not eq"
);
my $b1 = bag('a');
my $b2 = [bag('b')];
$b1->add($b2, $b1);
$b2->[0]->add($b1, $b2);
my $v1 = ['a'];
my $v2 = [['b']];
push(@$v1, $v2, $v1);
push(@{$v2->[0]}, $v1, $v2);
check_test(
sub {
cmp_deeply($v1, $b1);
},
{
actual_ok => 1,
diag => '',
},
"circular double bag eq"
);
$b1->add('b', 'b');
push(@$v1, 'c', 'c');
check_test(
sub {
cmp_deeply($v1, $b1);
},
{
actual_ok => 0,
diag => <<EOM,
Comparing \$data as a Bag
Missing: 'b', 'b'
Extra: 'c', 'c'
EOM
},
"circular double set not eq"
);
check_test(
sub {
cmp_bag([1, 2, 2], [2, 1, 2]);
},
{
actual_ok => 1,
},
"cmp_bag eq"
);
check_test(
sub {
cmp_bag([1, 2, 2], [1, 2, 1, 2]);
},
{
actual_ok => 0,
},
"cmp_bag not eq"
);
check_test(
sub {
cmp_bag([1], [1], 'name1');
},
{
actual_ok => 1,
name => 'name1',
},
"cmp_bag returns name"
);
check_test(
sub {
cmp_bag([1], [2], 'name2');
},
{
actual_ok => 0,
name => 'name2',
},
"cmp_bag returns name"
);
check_test(
sub {
cmp_deeply(['a', 'b', 'c', 'a', 'a', 'b'], superbagof('b', 'a', 'b'));
},
{
actual_ok => 1,
diag => "",
},
"superbagof yes"
);
check_test(
sub {
cmp_deeply(['a', 'b', 'c', 'a'], superbagof('d', 'b', 'd', 'b'));
},
{
actual_ok => 0,
diag => <<'EOM',
Comparing $data as a SuperBag
Missing: 'b', 'd', 'd'
EOM
},
"superbagof no"
);
check_test(
sub {
cmp_deeply(['b', 'a', 'b'], subbagof('a', 'b', 'c', 'a', 'a', 'b' ));
},
{
actual_ok => 1,
diag => "",
},
"subbagof yes"
);
check_test(
sub {
cmp_deeply(['d', 'b', 'd','b'], subbagof('a', 'b', 'c', 'a'));
},
{
actual_ok => 0,
diag => <<'EOM',
Comparing $data as a SubBag
Extra: 'b', 'd', 'd'
EOM
},
"subbagof no"
);
{
check_test(
sub {
cmp_deeply(['a', 'a', 'b', 'c', 'b'], noneof('d', 'e', 'f'));
},
{
actual_ok => 1,
diag => "",
},
"noneof yes"
);
check_test(
sub {
cmp_deeply(['a', 'a', 'b', 'c', 'b'], noneof('b', 'c', 'd', 'e'));
},
{
actual_ok => 0,
diag => <<'EOM',
Comparing $data as a NoneOf
Extra: 'b', 'c'
EOM
},
"noneof no"
);
}
eval {
my @res = run_tests(
sub { cmp_bag([], {}) }
)
};
like($@, qr/Argument 2 to cmp_bag is not an ARRAY ref \(HASH.*\)/,
"check arg 1")
}