xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test/Tester/Capture.pm (revision 3d61058aa5c692477b6d18acfbbdb653a9930ff9)
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