Index: t/080-aggregator.t
===================================================================
--- t/080-aggregator.t	(revision 200)
+++ t/080-aggregator.t	(working copy)
@@ -7,7 +7,7 @@
 use TAP::Parser::Iterator;
 use TAP::Parser::Aggregator;
 
-use Test::More tests => 34;
+use Test::More tests => 65;
 
 my $tap = <<'END_TAP';
 1..5
@@ -102,3 +102,173 @@
 
 can_ok $agg, 'has_problems';
 ok $agg->has_problems, '... and it should report true if there are problems';
+
+# coverage testing
+
+# _get_parsers
+# bad descriptions
+# currently the $agg object has descriptions tap1 and tap2
+# call _get_parsers with another description.
+# $agg will call  its _croak method
+my @die;
+
+eval {
+  local $SIG{__DIE__} = sub {push @die, @_};
+
+  $agg->_get_parsers('no_such_parser_for');
+};
+
+is @die, 1,
+  'coverage tests for missing parsers... and we caught just one death message';
+like pop(@die), qr/^A parser for \(no_such_parser_for\) could not be found at /,
+  '... and it was the expected death message';
+
+# _get_parsers in scalar context
+
+my $gp = $agg->_get_parsers(qw(tap1 tap2)); # should return ref to array containing parsers for tap1 and tap2
+
+is @$gp, 2,
+  'coverage tests for _get_parser in scalar context... and we got the right number of parsers';
+isa_ok($_, 'TAP::Parser') foreach (@$gp);
+
+# _get_parsers
+# todo_failed - this is a depricated method, so it  (and these tests) can be removed eventually
+# however it is showing up in the coverage as never tested.
+my @warn;
+
+eval {
+  local $SIG{__WARN__} = sub {push @warn, @_};
+
+  $agg->todo_failed();
+};
+
+# check the warning, making sure to capture the fullstops correctly (not as "any char" matches)
+is @warn, 1,
+  'overage tests for depricated todo_failed... and just one warning caught';
+like pop(@warn), qr/^"todo_failed" is deprecated[.]  Please use "todo_passed"[.]  See the docs[.] at/,
+  '... and it was the expected warning';
+
+# has_problems
+# this has a large number of conditions 'OR'd together, so the tests get a little complicated here
+
+# currently, we have covered the cases of failed() being true and none of the summary methods failing
+# we need to set up test cases for
+# 1. !failed && todo_passed
+# 2. !failed && !todo_passed && parse_errors
+# 3. !failed && !todo_passed && !parse_errors && exit
+# 4. !failed && !todo_passed && !parse_errors && !exit && wait
+
+# note there is nothing wrong per se with the has_problems logic, these are simply coverage tests
+
+# 1. !failed && todo_passed
+
+$agg = TAP::Parser::Aggregator->new();
+
+$tap = <<'END_TAP';
+1..1
+ok 1 - you shall not pass! # TODO should have failed
+END_TAP
+
+my $parser3 = TAP::Parser->new( { tap => $tap } );
+$parser3->run;
+
+$agg->add( 'tap3', $parser3 );
+
+is $agg->passed, 1,
+  'coverage tests for !failed && todo_passed... and we should have the correct number of passed tests';
+is $agg->failed, 0,
+  '... and we should have the correct number of failed tests';
+is $agg->todo_passed, 1,
+  '... and the correct number of unexpectedly succeeded tests';
+ok $agg->has_problems, '... and it should report true that there are problems';
+
+# 2. !failed && !todo_passed && parse_errors
+
+$agg = TAP::Parser::Aggregator->new();
+
+$tap = <<'END_TAP';
+1..-1
+END_TAP
+
+my $parser4 = TAP::Parser->new( { tap => $tap } );
+$parser4->run;
+
+$agg->add( 'tap4', $parser4 );
+
+is $agg->passed, 0,
+  'coverage tests for !failed && !todo_passed && parse_errors... and we should have the correct number of passed tests';
+is $agg->failed, 0,
+  '... and we should have the correct number of failed tests';
+is $agg->todo_passed, 0,
+  '... and the correct number of unexpectedly succeeded tests';
+is $agg->parse_errors, 1,
+  '... and the correct number of parse errors';
+ok $agg->has_problems, '... and it should report true that there are problems';
+
+# 3. !failed && !todo_passed && !parse_errors && exit
+# now this is a little harder to emulate cleanly through creating tap
+# fragments and parsing, as exit and wait collect OS-status codes.
+# so we'll get a little funky with $agg and push exit and wait descriptions
+# in it - not very friendly to internal rep changes.
+
+$agg = TAP::Parser::Aggregator->new();
+
+$tap = <<'END_TAP';
+1..1
+ok 1 - you shall not pass!
+END_TAP
+
+my $parser5 = TAP::Parser->new( { tap => $tap } );
+$parser5->run;
+
+$agg->add( 'tap', $parser5 );
+
+push @{$agg->{descriptions_for_exit}}, 'one possible reason';
+$agg->{exit}++;
+
+is $agg->passed, 1,
+  'coverage tests for !failed && !todo_passed && !parse_errors... and we should have the correct number of passed tests';
+is $agg->failed, 0,
+  '... and we should have the correct number of failed tests';
+is $agg->todo_passed, 0,
+  '... and the correct number of unexpectedly succeeded tests';
+is $agg->parse_errors, 0,
+  '... and the correct number of parse errors';
+
+my @exits = $agg->exit;
+
+is @exits, 1,
+  '... and the correct number of exits';
+is pop(@exits), 'one possible reason',
+  '... and we collected the right exit reason';
+
+ok $agg->has_problems, '... and it should report true that there are problems';
+
+# 4. !failed && !todo_passed && !parse_errors && !exit && wait
+
+$agg = TAP::Parser::Aggregator->new();
+
+$agg->add( 'tap', $parser5 );
+
+push @{$agg->{descriptions_for_wait}}, 'another possible reason';
+$agg->{wait}++;
+
+is $agg->passed, 1,
+  'coverage tests for !failed && !todo_passed && !parse_errors && !exit... and we should have the correct number of passed tests';
+is $agg->failed, 0,
+  '... and we should have the correct number of failed tests';
+is $agg->todo_passed, 0,
+  '... and the correct number of unexpectedly succeeded tests';
+is $agg->parse_errors, 0,
+  '... and the correct number of parse errors';
+is $agg->exit, 0,
+  '... and the correct number of exits';
+
+my @waits = $agg->wait;
+
+is @waits, 1,
+  '... and the correct number of waits';
+is pop(@waits), 'another possible reason',
+  '... and we collected the right wait reason';
+
+ok $agg->has_problems, '... and it should report true that there are problems';

