Move Test::Simple from lib to ext.
[p5sagit/p5-mst-13.2.git] / ext / Test-Simple / t / lib / Test / Builder / NoOutput.pm
CommitLineData
3e887aae 1package Test::Builder::NoOutput;
2
3use strict;
4use warnings;
5
6use base qw(Test::Builder);
7
8
9=head1 NAME
10
11Test::Builder::NoOutput - A subclass of Test::Builder which prints nothing
12
13=head1 SYNOPSIS
14
15 use Test::Builder::NoOutput;
16
17 my $tb = Test::Builder::NoOutput->new;
18
19 ...test as normal...
20
21 my $output = $tb->read;
22
23=head1 DESCRIPTION
24
25This is a subclass of Test::Builder which traps all its output.
26It is mostly useful for testing Test::Builder.
27
28=head3 read
29
30 my $all_output = $tb->read;
31 my $output = $tb->read($stream);
32
33Returns all the output (including failure and todo output) collected
34so far. It is destructive, each call to read clears the output
35buffer.
36
37If $stream is given it will return just the output from that stream.
38$stream's are...
39
40 out output()
41 err failure_output()
42 todo todo_output()
43 all all outputs
44
45Defaults to 'all'.
46
47=cut
48
49my $Test = __PACKAGE__->new;
50
51sub create {
52 my $class = shift;
53 my $self = $class->SUPER::create(@_);
54
55 my %outputs = (
56 all => '',
57 out => '',
58 err => '',
59 todo => '',
60 );
61 $self->{_outputs} = \%outputs;
62
63 tie *OUT, "Test::Builder::NoOutput::Tee", \$outputs{all}, \$outputs{out};
64 tie *ERR, "Test::Builder::NoOutput::Tee", \$outputs{all}, \$outputs{err};
65 tie *TODO, "Test::Builder::NoOutput::Tee", \$outputs{all}, \$outputs{todo};
66
67 $self->output(*OUT);
68 $self->failure_output(*ERR);
69 $self->todo_output(*TODO);
70
71 return $self;
72}
73
74sub read {
75 my $self = shift;
76 my $stream = @_ ? shift : 'all';
77
78 my $out = $self->{_outputs}{$stream};
79
80 $self->{_outputs}{$stream} = '';
81
82 # Clear all the streams if 'all' is read.
83 if( $stream eq 'all' ) {
84 my @keys = keys %{$self->{_outputs}};
85 $self->{_outputs}{$_} = '' for @keys;
86 }
87
88 return $out;
89}
90
91
92package Test::Builder::NoOutput::Tee;
93
94# A cheap implementation of IO::Tee.
95
96sub TIEHANDLE {
97 my($class, @refs) = @_;
98
99 my @fhs;
100 for my $ref (@refs) {
101 my $fh = Test::Builder->_new_fh($ref);
102 push @fhs, $fh;
103 }
104
105 my $self = [@fhs];
106 return bless $self, $class;
107}
108
109sub PRINT {
110 my $self = shift;
111
112 print $_ @_ for @$self;
113}
114
115sub PRINTF {
116 my $self = shift;
117 my $format = shift;
118
119 printf $_ @_ for @$self;
120}
121
1221;