The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

package Test::TAP::Model::File::Visual;
use base qw/Test::TAP::Model::File/;

use strict;
use warnings;

use Test::TAP::Model::Colorful;
use Test::TAP::Model::Subtest::Visual;
use URI::file;

sub subtest_class { "Test::TAP::Model::Subtest::Visual" }

sub desc_string {
	my $self = shift;
	$self->{_desc_string} = shift if @_;
	$self->{_desc_string} ||= "";
}

sub cases {
	my $self = shift;
	return $self->SUPER::cases(@_) unless wantarray;

	my @ret = $self->SUPER::cases(@_);
	return @ret if @ret;

	# if there are no tests, return a stub that represents the whole file
	return $self->subtest_class->new({
		type => "test",
		ok => $self->ok,
		skip => $self->skipped,
		line => "stub"
	});
}

sub str_status {
	my $self = shift;
	return "SKIPPED" if $self->skipped;
	return "BAILED OUT" if $self->bailed_out;

	return "OK"
		if $self->ok
		and $self->actual_cases == $self->planned
		and $self->actual_cases > 0;

	return "FAILED";
}

sub link { URI::file->new($_[0]->name) }

sub case_rows {
	my $self = shift;
	my @cases = $self->cases;
	my @ret;
	
	my $rows = int(.9 + @cases / 50) || 1;
	my $per_row = int(.9 + @cases / $rows);

	push @ret, { cases => [ splice(@cases, 0, $per_row) ] } while @cases;
	
	\@ret;
}

__PACKAGE__

__END__

=pod

=head1 NAME

Test::TAP::Model::File::Visual - A test file with additional display oriented
methods.

=head1 SYNOPSIS

	See the template.

=head1 DESCRIPTION

This module is a subclass of L<Test::TAP::Model::File> that provides some
methods that ease display.

It also inherits from L<Test::TAP::Model::Colorful>, which
provides additional methods.

=head1 METHODS

=over 4

=item cases

An overridden version of L<Test::TAP::Model::File/cases> which will return a single stub case if the case list is actually empty.

=item str_status

A string, "OK" or "FAILED"

=item link

Just the name of the test. Should be overridden to contain a proper path.

=item case_rows

The test's test cases, split into rows close to 50 elements in size.

The structure returned is:


	[ { cases => [ case, case, ... ] }, { cases => [ ... ] }, ... ];

=item subtest_class

This method overrides L<Test::TAP::Model::File/subtest_class> to return
L<Test::TAP::Model::Subtest::Visual>.

=item desc_string ?$new_value

A short descriptive string used to distinguish this file from others in the
various report views.

=back

=cut