#!/usr/bin/perl package Test::TAP::Model::Consolidated; use base qw/Test::TAP::Model/; use List::Util (); use strict; use warnings; use Test::TAP::Model::File::Consolidated; sub new { my $pkg = shift; bless { _submodels => [ @_ ] }, $pkg; } sub submodels { my $self = shift; @{$self->{_submodels}}; } sub submodels_ref { my $self = shift; [ $self->submodels ]; } sub submodel_count { my $self = shift; scalar $self->submodels; } sub submodel_count_plus_one { my $self = shift; $self->submodel_count + 1; } sub file_class { "Test::TAP::Model::File::Consolidated" } sub get_test_files { my $self = shift; my @files = map { [ $_->test_files ] } $self->submodels; map { $self->file_class->new(@$_) } _transpose_arrays(@files); } sub _transpose_arrays { # FIXME skip intelligently when there are holes # # good vs. broken # a c d e a c d e # a b c e a b c e # my @arrays = @_ or return (); my $max = List::Util::max(map { scalar @$_ } @arrays); my @result; for (my $i = 0; $i < $max; $i++) { push @result, []; foreach my $arr (@arrays) { push @{$result[-1]}, $arr->[$i]; } } @result; } __PACKAGE__; __END__ =pod =head1 NAME Test::TAP::Model::Consolidated - The unification of several L reports. =head1 SYNOPSIS use Test::TAP::Model::Consolidated; my $c = Test::TAP::Model::Consolidated->new(@models); # see Test::TAP::Model $c->ok; # all tests from all models are OK? =head1 DESCRIPTION L is the same interface to Test::TAP::Model except that it provides an aggregate interface to result processing. Using it with the L kind of methods will not work. =cut