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

my $test_count = 0;
role Test {
}
role HACK {
method EXPORTALL($scope) {
$scope{'&ok'} := &ok;
$scope{'&plan'} := &plan;
$scope{'&is'} := &is;
$scope{'&isnt'} := &isnt;
$scope{'&pass'} := &pass;
$scope{'&flunk'} := &flunk;
$scope{'&cmp_ok'} := &cmp_ok;
$scope{'&done_testing'} := &done_testing;
$scope{'&lives_ok'} := &lives_ok;
$scope{'&skip'} := &skip;
}
}
MY::<Test::> := HACK.new;
multi plan($tests) is export {
say "1..$tests";
}
sub proclaim($cond,$desc,$todo) {
$test_count = $test_count + 1;
if $cond {
print "ok $test_count";
} else {
print "not ok $test_count";
}
if $desc {
print " - $desc";
}
if $todo {
print " # TODO";
}
print "\n";
}
multi ok($cond,$desc?,:$todo) is export {
proclaim($cond,$desc,$todo);
}
multi is($got,$expected,$desc?,:$todo) is export {
proclaim($got eq $expected,$desc,$todo);
}
multi isnt($got,$expected,$desc?,:$todo) is export {
proclaim($got ne $expected,$desc,$todo);
}
multi pass($desc?,:$todo) is export {
proclaim(1,$desc,$todo);
}
multi flunk($desc?,:$todo) is export {
proclaim(0,$desc,$todo);
}
multi cmp_ok($got,$op,$expected,$desc?,:$todo) is export {
proclaim($op($got,$expected),$desc,$todo);
}
multi done_testing() is export {
say "1..$test_count";
}
multi lives_ok($code,$desc?,:$todo) is export {
{
$code();
proclaim(1,$desc,$todo);
CATCH {
proclaim(0,$desc,$todo);
}
}
}
multi skip($count,$reason?) is export {
my $i = 0;
loop {
if $i == $count {
return;
} else {
$test_count = $test_count + 1;
print "ok $test_count - # SKIP";
if $reason {
print " $reason";
}
print "\n";
$i = $i + 1;
}
}
}