The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#line 1
package TestML::Runtime::TAP;
use TestML::Mo;
extends 'TestML::Runtime';

use Test::Builder;

if ($TestML::Test::Differences) {
    no warnings 'redefine';
    require Test::Differences;
    *Test::Builder::is_eq = sub {
        my $self = shift;
        \&Test::Differences::eq_or_diff(@_);
    };
}

has test_builder => default => sub { Test::Builder->new };

sub title {
    my $self = shift;
    if (my $title = $self->function->getvar('Title')) {
        $title = $title->value;
        $title = "=== $title ===\n";
        if ($self->test_builder->can('note')) {
            $self->test_builder->note($title);
        }
        else {
            $self->test_builder->diag($title);
        }
    }
}

sub plan_begin {
    my $self = shift;
    if (defined (my $tests = $self->function->getvar('Plan'))) {
        $self->test_builder->plan(tests => $tests->value);
    }
    else {
        $self->test_builder->no_plan();
    }
}

sub assert_EQ {
    my $self = shift;
    $self->test_builder->is_eq(
        shift->str->value,
        shift->str->value,
        $self->get_label,
    );
}

sub assert_HAS {
    my $self = shift;
    my $text = shift->value;
    my $part = shift->value;
    my $assertion = (index($text, $part) >= 0);
    if (not $assertion) {
        my $msg = <<"...";
Failed TestML HAS (~~) assertion. This text:
'$text'
does not contain this string:
'$part'
...
        $self->test_builder->diag($msg);
    }
    $self->test_builder->ok($assertion, $self->get_label);
}

sub assert_OK {
    my $self = shift;
    my $context = shift;
    $self->test_builder->ok(
        $context->bool->value,
        $self->get_label,
    );
}