1b8851fccSafresh1use strict; 2b8851fccSafresh1 3b8851fccSafresh1package Test::Tester::Capture; 4b8851fccSafresh1 5*3d61058aSafresh1our $VERSION = '1.302199'; 65759b3d2Safresh1 75759b3d2Safresh1 8b8851fccSafresh1use Test::Builder; 9b8851fccSafresh1 10b8851fccSafresh1use vars qw( @ISA ); 11b8851fccSafresh1@ISA = qw( Test::Builder ); 12b8851fccSafresh1 13b8851fccSafresh1# Make Test::Tester::Capture thread-safe for ithreads. 14b8851fccSafresh1BEGIN { 15b8851fccSafresh1 use Config; 16b8851fccSafresh1 *share = sub { 0 }; 17b8851fccSafresh1 *lock = sub { 0 }; 18b8851fccSafresh1} 19b8851fccSafresh1 20b8851fccSafresh1my $Curr_Test = 0; share($Curr_Test); 21b8851fccSafresh1my @Test_Results = (); share(@Test_Results); 22b8851fccSafresh1my $Prem_Diag = {diag => ""}; share($Curr_Test); 23b8851fccSafresh1 24b8851fccSafresh1sub new 25b8851fccSafresh1{ 26b8851fccSafresh1 # Test::Tester::Capgture::new used to just return __PACKAGE__ 2756d68f1eSafresh1 # because Test::Builder::new enforced its singleton nature by 28b8851fccSafresh1 # return __PACKAGE__. That has since changed, Test::Builder::new now 29b8851fccSafresh1 # returns a blessed has and around version 0.78, Test::Builder::todo 30b8851fccSafresh1 # started wanting to modify $self. To cope with this, we now return 31b8851fccSafresh1 # a blessed hash. This is a short-term hack, the correct thing to do 32b8851fccSafresh1 # is to detect which style of Test::Builder we're dealing with and 33b8851fccSafresh1 # act appropriately. 34b8851fccSafresh1 35b8851fccSafresh1 my $class = shift; 36b8851fccSafresh1 return bless {}, $class; 37b8851fccSafresh1} 38b8851fccSafresh1 39b8851fccSafresh1sub ok { 40b8851fccSafresh1 my($self, $test, $name) = @_; 41b8851fccSafresh1 425759b3d2Safresh1 my $ctx = $self->ctx; 435759b3d2Safresh1 44b8851fccSafresh1 # $test might contain an object which we don't want to accidentally 45b8851fccSafresh1 # store, so we turn it into a boolean. 46b8851fccSafresh1 $test = $test ? 1 : 0; 47b8851fccSafresh1 48b8851fccSafresh1 lock $Curr_Test; 49b8851fccSafresh1 $Curr_Test++; 50b8851fccSafresh1 51b8851fccSafresh1 my($pack, $file, $line) = $self->caller; 52b8851fccSafresh1 535759b3d2Safresh1 my $todo = $self->todo(); 54b8851fccSafresh1 55b8851fccSafresh1 my $result = {}; 56b8851fccSafresh1 share($result); 57b8851fccSafresh1 58b8851fccSafresh1 unless( $test ) { 59b8851fccSafresh1 @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 ); 60b8851fccSafresh1 } 61b8851fccSafresh1 else { 62b8851fccSafresh1 @$result{ 'ok', 'actual_ok' } = ( 1, $test ); 63b8851fccSafresh1 } 64b8851fccSafresh1 65b8851fccSafresh1 if( defined $name ) { 66b8851fccSafresh1 $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. 67b8851fccSafresh1 $result->{name} = $name; 68b8851fccSafresh1 } 69b8851fccSafresh1 else { 70b8851fccSafresh1 $result->{name} = ''; 71b8851fccSafresh1 } 72b8851fccSafresh1 73b8851fccSafresh1 if( $todo ) { 74b8851fccSafresh1 my $what_todo = $todo; 75b8851fccSafresh1 $result->{reason} = $what_todo; 76b8851fccSafresh1 $result->{type} = 'todo'; 77b8851fccSafresh1 } 78b8851fccSafresh1 else { 79b8851fccSafresh1 $result->{reason} = ''; 80b8851fccSafresh1 $result->{type} = ''; 81b8851fccSafresh1 } 82b8851fccSafresh1 83b8851fccSafresh1 $Test_Results[$Curr_Test-1] = $result; 84b8851fccSafresh1 85b8851fccSafresh1 unless( $test ) { 86b8851fccSafresh1 my $msg = $todo ? "Failed (TODO)" : "Failed"; 87b8851fccSafresh1 $result->{fail_diag} = (" $msg test ($file at line $line)\n"); 88b8851fccSafresh1 } 89b8851fccSafresh1 90b8851fccSafresh1 $result->{diag} = ""; 91b8851fccSafresh1 $result->{_level} = $Test::Builder::Level; 92b8851fccSafresh1 $result->{_depth} = Test::Tester::find_run_tests(); 93b8851fccSafresh1 945759b3d2Safresh1 $ctx->release; 955759b3d2Safresh1 96b8851fccSafresh1 return $test ? 1 : 0; 97b8851fccSafresh1} 98b8851fccSafresh1 99b8851fccSafresh1sub skip { 100b8851fccSafresh1 my($self, $why) = @_; 101b8851fccSafresh1 $why ||= ''; 102b8851fccSafresh1 1035759b3d2Safresh1 my $ctx = $self->ctx; 1045759b3d2Safresh1 105b8851fccSafresh1 lock($Curr_Test); 106b8851fccSafresh1 $Curr_Test++; 107b8851fccSafresh1 108b8851fccSafresh1 my %result; 109b8851fccSafresh1 share(%result); 110b8851fccSafresh1 %result = ( 111b8851fccSafresh1 'ok' => 1, 112b8851fccSafresh1 actual_ok => 1, 113b8851fccSafresh1 name => '', 114b8851fccSafresh1 type => 'skip', 115b8851fccSafresh1 reason => $why, 116b8851fccSafresh1 diag => "", 117b8851fccSafresh1 _level => $Test::Builder::Level, 118b8851fccSafresh1 _depth => Test::Tester::find_run_tests(), 119b8851fccSafresh1 ); 120b8851fccSafresh1 $Test_Results[$Curr_Test-1] = \%result; 121b8851fccSafresh1 1225759b3d2Safresh1 $ctx->release; 123b8851fccSafresh1 return 1; 124b8851fccSafresh1} 125b8851fccSafresh1 126b8851fccSafresh1sub todo_skip { 127b8851fccSafresh1 my($self, $why) = @_; 128b8851fccSafresh1 $why ||= ''; 129b8851fccSafresh1 1305759b3d2Safresh1 my $ctx = $self->ctx; 1315759b3d2Safresh1 132b8851fccSafresh1 lock($Curr_Test); 133b8851fccSafresh1 $Curr_Test++; 134b8851fccSafresh1 135b8851fccSafresh1 my %result; 136b8851fccSafresh1 share(%result); 137b8851fccSafresh1 %result = ( 138b8851fccSafresh1 'ok' => 1, 139b8851fccSafresh1 actual_ok => 0, 140b8851fccSafresh1 name => '', 141b8851fccSafresh1 type => 'todo_skip', 142b8851fccSafresh1 reason => $why, 143b8851fccSafresh1 diag => "", 144b8851fccSafresh1 _level => $Test::Builder::Level, 145b8851fccSafresh1 _depth => Test::Tester::find_run_tests(), 146b8851fccSafresh1 ); 147b8851fccSafresh1 148b8851fccSafresh1 $Test_Results[$Curr_Test-1] = \%result; 149b8851fccSafresh1 1505759b3d2Safresh1 $ctx->release; 151b8851fccSafresh1 return 1; 152b8851fccSafresh1} 153b8851fccSafresh1 154b8851fccSafresh1sub diag { 155b8851fccSafresh1 my($self, @msgs) = @_; 156b8851fccSafresh1 return unless @msgs; 157b8851fccSafresh1 158b8851fccSafresh1 # Prevent printing headers when compiling (i.e. -c) 159b8851fccSafresh1 return if $^C; 160b8851fccSafresh1 1615759b3d2Safresh1 my $ctx = $self->ctx; 1625759b3d2Safresh1 163b8851fccSafresh1 # Escape each line with a #. 164b8851fccSafresh1 foreach (@msgs) { 165b8851fccSafresh1 $_ = 'undef' unless defined; 166b8851fccSafresh1 } 167b8851fccSafresh1 168b8851fccSafresh1 push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/; 169b8851fccSafresh1 170b8851fccSafresh1 my $result = $Curr_Test ? $Test_Results[$Curr_Test - 1] : $Prem_Diag; 171b8851fccSafresh1 172b8851fccSafresh1 $result->{diag} .= join("", @msgs); 173b8851fccSafresh1 1745759b3d2Safresh1 $ctx->release; 175b8851fccSafresh1 return 0; 176b8851fccSafresh1} 177b8851fccSafresh1 178b8851fccSafresh1sub details { 179b8851fccSafresh1 return @Test_Results; 180b8851fccSafresh1} 181b8851fccSafresh1 182b8851fccSafresh1 183b8851fccSafresh1# Stub. Feel free to send me a patch to implement this. 184b8851fccSafresh1sub note { 185b8851fccSafresh1} 186b8851fccSafresh1 187b8851fccSafresh1sub explain { 188b8851fccSafresh1 return Test::Builder::explain(@_); 189b8851fccSafresh1} 190b8851fccSafresh1 191b8851fccSafresh1sub premature 192b8851fccSafresh1{ 193b8851fccSafresh1 return $Prem_Diag->{diag}; 194b8851fccSafresh1} 195b8851fccSafresh1 196b8851fccSafresh1sub current_test 197b8851fccSafresh1{ 198b8851fccSafresh1 if (@_ > 1) 199b8851fccSafresh1 { 200b8851fccSafresh1 die "Don't try to change the test number!"; 201b8851fccSafresh1 } 202b8851fccSafresh1 else 203b8851fccSafresh1 { 204b8851fccSafresh1 return $Curr_Test; 205b8851fccSafresh1 } 206b8851fccSafresh1} 207b8851fccSafresh1 208b8851fccSafresh1sub reset 209b8851fccSafresh1{ 210b8851fccSafresh1 $Curr_Test = 0; 211b8851fccSafresh1 @Test_Results = (); 212b8851fccSafresh1 $Prem_Diag = {diag => ""}; 213b8851fccSafresh1} 214b8851fccSafresh1 215b8851fccSafresh11; 216b8851fccSafresh1 217b8851fccSafresh1__END__ 218b8851fccSafresh1 219b8851fccSafresh1=head1 NAME 220b8851fccSafresh1 221b8851fccSafresh1Test::Tester::Capture - Help testing test modules built with Test::Builder 222b8851fccSafresh1 223b8851fccSafresh1=head1 DESCRIPTION 224b8851fccSafresh1 225b8851fccSafresh1This is a subclass of Test::Builder that overrides many of the methods so 22656d68f1eSafresh1that they don't output anything. It also keeps track of its own set of test 227b8851fccSafresh1results so that you can use Test::Builder based modules to perform tests on 228b8851fccSafresh1other Test::Builder based modules. 229b8851fccSafresh1 230b8851fccSafresh1=head1 AUTHOR 231b8851fccSafresh1 232b8851fccSafresh1Most of the code here was lifted straight from Test::Builder and then had 233b8851fccSafresh1chunks removed by Fergal Daly <fergal@esatclear.ie>. 234b8851fccSafresh1 235b8851fccSafresh1=head1 LICENSE 236b8851fccSafresh1 237b8851fccSafresh1Under the same license as Perl itself 238b8851fccSafresh1 239*3d61058aSafresh1See L<https://dev.perl.org/licenses/> 240b8851fccSafresh1 241b8851fccSafresh1=cut 242