Test::TAP::Model::Subtest - An object for querying a test case


Test-TAP-Model documentation Contained in the Test-TAP-Model distribution.

Index


Code Index:

NAME

Top

Test::TAP::Model::Subtest - An object for querying a test case

SYNOPSIS

Top

	my @cases = $f->cases;
	$case[0]->ok; # or whatever

DESCRIPTION

Top

This object allows you to ask questions about a test case in a test file's output.

METHODS

Top

new

This constructor accepts the hash reference to the event logged for this subtest.

It doesn't bless the hash itself, but rather a reference to it, so that other objects' feet aren't stepped on.

ok
passed

Whether the test is logically OK - if it's TODO and not OK this returns true.

actual_ok

This is the real value from the output. not OK and todo is false here.

nok
failed

The opposite of ok

actual_nok

The opposite of actual_ok

skipped

Whether the test was skipped

todo

Whether the test was todo

normal

Whether the result is consistent, that is OK xor TODO. An abnormal result should be noted.

unexpected

The negation of normal

planned

Whether this test is within the plan declared by the file.

unplanned

Maybe it's in love with another fish.

num

The number of the test (useful for when the test came from a filtered query).

line

The raw line the data was parsed from.

diag

Diagnosis immediately following the test line.

reason

If there was a reason (for skip or todo), it's here.

pos
test_file
test_line
test_column

These methods extract the little <pos:file.t at line 5, column 3> comments as outputted by pugs' Test.pm.

Supposedly this is where the test case that fail was written.

str

A stringy representation much like Test::Harness prints in it's output:

	(?:not )?ok $num/$planned


Test-TAP-Model documentation Contained in the Test-TAP-Model distribution.

#!/usr/bin/perl

package Test::TAP::Model::Subtest;

use strict;
use warnings;

use overload '""' => "str", '==' => "equal";

use Carp qw/croak/;

sub new {
	my $pkg = shift;
	my $struct = shift;

	croak "eek! You can't bless non test events into $pkg" unless $struct->{type} eq "test";
	
	bless \$struct, $pkg; # don't bless the structure, it's not ours to mess with
}

sub str { ${ $_[0] }->{str} }

# predicates about the case
sub ok { ${ $_[0] }->{ok} }; *passed = \&ok;
sub nok { !$_[0]->ok }; *failed = \&nok;
sub skipped { ${ $_[0] }->{skip} }
sub todo { ${ $_[0] }->{todo} }
sub actual_ok { ${ $_[0] }->{actual_ok} }
sub actual_nok { !$_[0]->actual_ok }
sub normal { $_[0]->actual_ok xor $_[0]->todo }
sub unexpected { !$_[0]->normal };
sub unplanned { ${ $_[0] }->{unplanned} }
sub planned { !$_[0]->unplanned }

# member data extraction
sub num { ${ $_[0] }->{num} }
sub diag { ${ $_[0] }->{diag} || ""}
sub line { ${ $_[0] }->{line} || ""}
sub reason { ${ $_[0] }->{reason} } # for skip or todo

# pugs specific
sub pos { ${ $_[0] }->{pos} || ""}

# heuristical
sub test_file { $_[0]->pos =~ /(?:file\s+|^)?(\S+?)[\s[:punct:]]*(?:\s+|$)/ ? $1 : "" };
sub test_line { $_[0]->pos =~ /line\s+(\d+)/i ? $1 : ""}
sub test_column { $_[0]->pos =~ /column?\s+(\d+)/ ? $1 : ""}

sub equal {
	my $self = shift;
	my $other = shift;

	($self->actual_ok xor $other->actual_nok)
		and
	($self->skipped xor !$other->skipped)
		and
	($self->todo xor !$other->todo)
}

__PACKAGE__

__END__