1 package Test::Builder::Tester;
4 our $VERSION = '1.302049';
12 Test::Builder::Tester - test testsuites that have been built with
17 use Test::Builder::Tester tests => 1;
20 test_out("not ok 1 - foo");
23 test_test("fail works");
27 A module that helps you test testing modules that are built with
30 The testing system is designed to be used by performing a three step
31 process for each test you wish to test. This process starts with using
32 C<test_out> and C<test_err> in advance to declare what the testsuite you
33 are testing will output with L<Test::Builder> to stdout and stderr.
35 You then can run the test(s) from your test suite that call
36 L<Test::Builder>. At this point the output of L<Test::Builder> is
37 safely captured by L<Test::Builder::Tester> rather than being
38 interpreted as real test output.
40 The final stage is to call C<test_test> that will simply compare what you
41 predeclared to what L<Test::Builder> actually outputted, and report the
42 results back with a "ok" or "not ok" (with debugging) to the normal
51 my $t = Test::Builder->new;
58 our @ISA = qw(Exporter);
60 our @EXPORT = qw(test_out test_err test_fail test_diag test_test line_num);
68 $t->exported_to($caller);
72 foreach my $idx ( 0 .. $#plan ) {
73 if( $plan[$idx] eq 'import' ) {
74 @imports = @{ $plan[ $idx + 1 ] };
79 __PACKAGE__->export_to_level( 1, __PACKAGE__, @imports );
86 # create some private file handles
87 my $output_handle = gensym;
88 my $error_handle = gensym;
90 # and tie them to this package
91 my $out = tie *$output_handle, "Test::Builder::Tester::Tie", "STDOUT";
92 my $err = tie *$error_handle, "Test::Builder::Tester::Tie", "STDERR";
98 # for remembering that we're testing and where we're testing at
101 my $original_is_passing;
103 # remembering where the file handles were originally connected
104 my $original_output_handle;
105 my $original_failure_handle;
106 my $original_todo_handle;
107 my $original_formatter;
109 my $original_harness_env;
111 # function that starts testing and redirects the filehandles for now
113 # Hack for things that conditioned on Test-Stream being loaded
114 $INC{'Test/Stream.pm'} ||= 'fake' if $INC{'Test/Moose/More.pm'};
115 # even if we're running under Test::Harness pretend we're not
116 # for now. This needed so Test::Builder doesn't add extra spaces
117 $original_harness_env = $ENV{HARNESS_ACTIVE} || 0;
118 $ENV{HARNESS_ACTIVE} = 0;
120 my $hub = $t->{Hub} || Test2::API::test2_stack->top;
121 $original_formatter = $hub->format;
122 unless ($original_formatter && $original_formatter->isa('Test::Builder::Formatter')) {
123 my $fmt = Test::Builder::Formatter->new;
127 # remember what the handles were set to
128 $original_output_handle = $t->output();
129 $original_failure_handle = $t->failure_output();
130 $original_todo_handle = $t->todo_output();
132 # switch out to our own handles
133 $t->output($output_handle);
134 $t->failure_output($error_handle);
135 $t->todo_output($output_handle);
137 # clear the expected list
141 # remember that we're testing
143 $testing_num = $t->current_test;
145 $original_is_passing = $t->is_passing;
148 # look, we shouldn't do the ending stuff
154 These are the six methods that are exported as default.
162 Procedures for predeclaring the output that your test suite is
163 expected to produce until C<test_test> is called. These procedures
164 automatically assume that each line terminates with "\n". So
166 test_out("ok 1","ok 2");
170 test_out("ok 1\nok 2");
172 which is even the same as
177 Once C<test_out> or C<test_err> (or C<test_fail> or C<test_diag>) have
178 been called, all further output from L<Test::Builder> will be
179 captured by L<Test::Builder::Tester>. This means that you will not
180 be able perform further tests to the normal output in the normal way
181 until you call C<test_test> (well, unless you manually meddle with the
187 # do we need to do any setup?
188 _start_testing() unless $testing;
194 # do we need to do any setup?
195 _start_testing() unless $testing;
202 Because the standard failure message that L<Test::Builder> produces
203 whenever a test fails will be a common occurrence in your test error
204 output, and because it has changed between Test::Builder versions, rather
205 than forcing you to call C<test_err> with the string all the time like
208 test_err("# Failed test ($0 at line ".line_num(+1).")");
210 C<test_fail> exists as a convenience function that can be called
211 instead. It takes one argument, the offset from the current line that
212 the line that causes the fail is on.
216 This means that the example in the synopsis could be rewritten
219 test_out("not ok 1 - foo");
222 test_test("fail works");
227 # do we need to do any setup?
228 _start_testing() unless $testing;
230 # work out what line we should be on
231 my( $package, $filename, $line ) = caller;
232 $line = $line + ( shift() || 0 ); # prevent warnings
234 # expect that on stderr
235 $err->expect("# Failed test ($filename at line $line)");
240 As most of the remaining expected output to the error stream will be
241 created by L<Test::Builder>'s C<diag> function, L<Test::Builder::Tester>
242 provides a convenience function C<test_diag> that you can use instead of
245 The C<test_diag> function prepends comment hashes and spacing to the
246 start and newlines to the end of the expected output passed to it and
247 adds it to the list of expected error output. So, instead of writing
249 test_err("# Couldn't open file");
253 test_diag("Couldn't open file");
255 Remember that L<Test::Builder>'s diag function will not add newlines to
256 the end of output and test_diag will. So to check
258 Test::Builder->new->diag("foo\n","bar\n");
262 test_diag("foo","bar")
264 without the newlines.
269 # do we need to do any setup?
270 _start_testing() unless $testing;
272 # expect the same thing, but prepended with "# "
274 $err->expect( map { "# $_" } @_ );
279 Actually performs the output check testing the tests, comparing the
280 data (with C<eq>) that we have captured from L<Test::Builder> against
281 what was declared with C<test_out> and C<test_err>.
283 This takes name/value pairs that effect how the test is run.
287 =item title (synonym 'name', 'label')
289 The name of the test that will be displayed after the C<ok> or C<not
294 Setting this to a true value will cause the test to ignore if the
295 output sent by the test to the output stream does not match that
296 declared with C<test_out>.
300 Setting this to a true value will cause the test to ignore if the
301 output sent by the test to the error stream does not match that
302 declared with C<test_err>.
306 As a convenience, if only one argument is passed then this argument
307 is assumed to be the name of the test (as in the above examples.)
309 Once C<test_test> has been run test output will be redirected back to
310 the original filehandles that L<Test::Builder> was connected to
311 (probably STDOUT and STDERR,) meaning any further tests you run
312 will function normally and cause success/errors for L<Test::Harness>.
318 delete $INC{'Test/Stream.pm'} if $INC{'Test/Stream.pm'} && $INC{'Test/Stream.pm'} eq 'fake';
319 # decode the arguments as described in the pod
327 $mess = $args{name} if exists( $args{name} );
328 $mess = $args{title} if exists( $args{title} );
329 $mess = $args{label} if exists( $args{label} );
332 # er, are we testing?
333 croak "Not testing. You must declare output with a test function first."
337 my $hub = $t->{Hub} || Test2::API::test2_stack->top;
338 $hub->format($original_formatter);
340 # okay, reconnect the test suite back to the saved handles
341 $t->output($original_output_handle);
342 $t->failure_output($original_failure_handle);
343 $t->todo_output($original_todo_handle);
345 # restore the test no, etc, back to the original point
346 $t->current_test($testing_num);
348 $t->is_passing($original_is_passing);
350 # re-enable the original setting of the harness
351 $ENV{HARNESS_ACTIVE} = $original_harness_env;
353 # check the output we've stashed
354 unless( $t->ok( ( $args{skip_out} || $out->check ) &&
355 ( $args{skip_err} || $err->check ), $mess )
358 # print out the diagnostic information about why this
363 $t->diag( map { "$_\n" } $out->complaint )
364 unless $args{skip_out} || $out->check;
366 $t->diag( map { "$_\n" } $err->complaint )
367 unless $args{skip_err} || $err->check;
373 A utility function that returns the line number that the function was
374 called on. You can pass it an offset which will be added to the
375 result. This is very useful for working out the correct text of
376 diagnostic functions that contain line numbers.
378 Essentially this is the same as the C<__LINE__> macro, but the
379 C<line_num(+3)> idiom is arguably nicer.
384 my( $package, $filename, $line ) = caller;
385 return $line + ( shift() || 0 ); # prevent warnings
390 In addition to the six exported functions there exists one
391 function that can only be accessed with a fully qualified function
398 When C<test_test> is called and the output that your tests generate
399 does not match that which you declared, C<test_test> will print out
400 debug information showing the two conflicting versions. As this
401 output itself is debug information it can be confusing which part of
402 the output is from C<test_test> and which was the original output from
403 your original tests. Also, it may be hard to spot things like
404 extraneous whitespace at the end of lines that may cause your test to
405 fail even though the output looks similar.
407 To assist you C<test_test> can colour the background of the debug
408 information to disambiguate the different types of output. The debug
409 output will have its background coloured green and red. The green
410 part represents the text which is the same between the executed and
411 actual output, the red shows which part differs.
413 The C<color> function determines if colouring should occur or not.
414 Passing it a true or false value will enable or disable colouring
415 respectively, and the function called with no argument will return the
418 To enable colouring from the command line, you can use the
419 L<Text::Builder::Tester::Color> module like so:
421 perl -Mlib=Text::Builder::Tester::Color test.t
423 Or by including the L<Test::Builder::Tester::Color> module directly in
431 $color = shift if @_;
439 Calls C<< Test::Builder->no_ending >> turning off the ending tests.
440 This is needed as otherwise it will trip out because we've run more
441 tests than we strictly should have and it'll register any failures we
442 had that we were testing for as real failures.
444 The color function doesn't work unless L<Term::ANSIColor> is
445 compatible with your terminal.
447 Bugs (and requests for new features) can be reported to the author
448 though the CPAN RT system:
449 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Builder-Tester>
453 Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
455 Some code taken from L<Test::More> and L<Test::Catch>, written by
456 Michael G Schwern E<lt>schwern@pobox.comE<gt>. Hence, those parts
457 Copyright Micheal G Schwern 2001. Used and distributed with
460 This program is free software; you can redistribute it
461 and/or modify it under the same terms as Perl itself.
467 =item Chad Granum E<lt>exodist@cpan.orgE<gt>
473 Thanks to Richard Clamp E<lt>richardc@unixbeard.netE<gt> for letting
474 me use his testing system to try this module out on.
478 L<Test::Builder>, L<Test::Builder::Tester::Color>, L<Test::More>.
484 ####################################################################
485 # Helper class that is used to remember expected and received data
487 package Test::Builder::Tester::Tie;
490 # add line(s) to be expected
496 foreach my $check (@checks) {
497 $check = $self->_account_for_subtest($check);
498 $check = $self->_translate_Failed_check($check);
499 push @{ $self->{wanted} }, ref $check ? $check : "$check\n";
503 sub _account_for_subtest {
504 my( $self, $check ) = @_;
506 my $hub = $t->{Stack}->top;
507 my $nesting = $hub->isa('Test2::Hub::Subtest') ? $hub->nested : 0;
508 return ref($check) ? $check : (' ' x $nesting) . $check;
511 sub _translate_Failed_check {
512 my( $self, $check ) = @_;
514 if( $check =~ /\A(.*)# (Failed .*test) \((.*?) at line (\d+)\)\Z(?!\n)/ ) {
515 $check = "/\Q$1\E#\\s+\Q$2\E.*?\\n?.*?\Qat $3\E line \Q$4\E.*\\n?/";
522 # return true iff the expected data matches the got data
527 # turn off warnings as these might be undef
530 my @checks = @{ $self->{wanted} };
531 my $got = $self->{got};
532 foreach my $check (@checks) {
533 $check = "\Q$check\E" unless( $check =~ s,^/(.*)/$,$1, or ref $check );
534 return 0 unless $got =~ s/^$check//;
537 return length $got == 0;
541 # a complaint message about the inputs not matching (to be
542 # used for debugging messages)
546 my $type = $self->type;
547 my $got = $self->got;
548 my $wanted = join '', @{ $self->wanted };
550 # are we running in colour mode?
551 if(Test::Builder::Tester::color) {
553 eval { require Term::ANSIColor };
557 my $green = Term::ANSIColor::color("black") . Term::ANSIColor::color("on_green");
558 my $red = Term::ANSIColor::color("black") . Term::ANSIColor::color("on_red");
559 my $reset = Term::ANSIColor::color("reset");
561 # work out where the two strings start to differ
563 $char++ while substr( $got, $char, 1 ) eq substr( $wanted, $char, 1 );
565 # get the start string and the two end strings
566 my $start = $green . substr( $wanted, 0, $char );
567 my $gotend = $red . substr( $got, $char ) . $reset;
568 my $wantedend = $red . substr( $wanted, $char ) . $reset;
570 # make the start turn green on and off
571 $start =~ s/\n/$reset\n$green/g;
573 # make the ends turn red on and off
574 $gotend =~ s/\n/$reset\n$red/g;
575 $wantedend =~ s/\n/$reset\n$red/g;
577 # rebuild the strings
578 $got = $start . $gotend;
579 $wanted = $start . $wantedend;
583 my @got = split "\n", $got;
584 my @wanted = split "\n", $wanted;
589 while (@got || @wanted) {
590 my $g = shift @got || "";
591 my $w = shift @wanted || "";
593 if($g =~ s/(\s+)$/ |> /g) {
594 $g .= ($_ eq ' ' ? '_' : '\t') for split '', $1;
596 if($w =~ s/(\s+)$/ |> /g) {
597 $w .= ($_ eq ' ' ? '_' : '\t') for split '', $1;
606 $got = $got ? "$got\n$g" : $g;
607 $wanted = $wanted ? "$wanted\n$w" : $w;
610 return "$type is:\n" . "$got\nnot:\n$wanted\nas expected";
614 # forget all expected and got data
619 type => $self->{type},
632 return $self->{wanted};
637 return $self->{type};
646 $self->{got} .= join '', @_;
650 my( $class, $type ) = @_;
652 my $self = bless { type => $type }, $class;