1 package Test::Builder::Tester;
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 B<Test::Builder> to stdout and stderr.
35 You then can run the test(s) from your test suite that call
36 B<Test::Builder>. At this point the output of B<Test::Builder> is
37 safely captured by B<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 B<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
102 # remembering where the file handles were originally connected
103 my $original_output_handle;
104 my $original_failure_handle;
105 my $original_todo_handle;
107 my $original_test_number;
108 my $original_harness_state;
110 my $original_harness_env;
112 # function that starts testing and redirects the filehandles for now
114 # even if we're running under Test::Harness pretend we're not
115 # for now. This needed so Test::Builder doesn't add extra spaces
116 $original_harness_env = $ENV{HARNESS_ACTIVE} || 0;
117 $ENV{HARNESS_ACTIVE} = 0;
119 # remember what the handles were set to
120 $original_output_handle = $t->output();
121 $original_failure_handle = $t->failure_output();
122 $original_todo_handle = $t->todo_output();
124 # switch out to our own handles
125 $t->output($output_handle);
126 $t->failure_output($error_handle);
127 $t->todo_output($error_handle);
129 # clear the expected list
133 # remeber that we're testing
135 $testing_num = $t->current_test;
138 # look, we shouldn't do the ending stuff
144 These are the six methods that are exported as default.
152 Procedures for predeclaring the output that your test suite is
153 expected to produce until C<test_test> is called. These procedures
154 automatically assume that each line terminates with "\n". So
156 test_out("ok 1","ok 2");
160 test_out("ok 1\nok 2");
162 which is even the same as
167 Once C<test_out> or C<test_err> (or C<test_fail> or C<test_diag>) have
168 been called once all further output from B<Test::Builder> will be
169 captured by B<Test::Builder::Tester>. This means that your will not
170 be able perform further tests to the normal output in the normal way
171 until you call C<test_test> (well, unless you manually meddle with the
177 # do we need to do any setup?
178 _start_testing() unless $testing;
184 # do we need to do any setup?
185 _start_testing() unless $testing;
192 Because the standard failure message that B<Test::Builder> produces
193 whenever a test fails will be a common occurrence in your test error
194 output, and because has changed between Test::Builder versions, rather
195 than forcing you to call C<test_err> with the string all the time like
198 test_err("# Failed test ($0 at line ".line_num(+1).")");
200 C<test_fail> exists as a convenience function that can be called
201 instead. It takes one argument, the offset from the current line that
202 the line that causes the fail is on.
206 This means that the example in the synopsis could be rewritten
209 test_out("not ok 1 - foo");
212 test_test("fail works");
217 # do we need to do any setup?
218 _start_testing() unless $testing;
220 # work out what line we should be on
221 my( $package, $filename, $line ) = caller;
222 $line = $line + ( shift() || 0 ); # prevent warnings
224 # expect that on stderr
225 $err->expect("# Failed test ($0 at line $line)");
230 As most of the remaining expected output to the error stream will be
231 created by Test::Builder's C<diag> function, B<Test::Builder::Tester>
232 provides a convience function C<test_diag> that you can use instead of
235 The C<test_diag> function prepends comment hashes and spacing to the
236 start and newlines to the end of the expected output passed to it and
237 adds it to the list of expected error output. So, instead of writing
239 test_err("# Couldn't open file");
243 test_diag("Couldn't open file");
245 Remember that B<Test::Builder>'s diag function will not add newlines to
246 the end of output and test_diag will. So to check
248 Test::Builder->new->diag("foo\n","bar\n");
252 test_diag("foo","bar")
254 without the newlines.
259 # do we need to do any setup?
260 _start_testing() unless $testing;
262 # expect the same thing, but prepended with "# "
264 $err->expect( map { "# $_" } @_ );
269 Actually performs the output check testing the tests, comparing the
270 data (with C<eq>) that we have captured from B<Test::Builder> against
271 that that was declared with C<test_out> and C<test_err>.
273 This takes name/value pairs that effect how the test is run.
277 =item title (synonym 'name', 'label')
279 The name of the test that will be displayed after the C<ok> or C<not
284 Setting this to a true value will cause the test to ignore if the
285 output sent by the test to the output stream does not match that
286 declared with C<test_out>.
290 Setting this to a true value will cause the test to ignore if the
291 output sent by the test to the error stream does not match that
292 declared with C<test_err>.
296 As a convience, if only one argument is passed then this argument
297 is assumed to be the name of the test (as in the above examples.)
299 Once C<test_test> has been run test output will be redirected back to
300 the original filehandles that B<Test::Builder> was connected to
301 (probably STDOUT and STDERR,) meaning any further tests you run
302 will function normally and cause success/errors for B<Test::Harness>.
307 # decode the arguements as described in the pod
315 $mess = $args{name} if exists( $args{name} );
316 $mess = $args{title} if exists( $args{title} );
317 $mess = $args{label} if exists( $args{label} );
320 # er, are we testing?
321 croak "Not testing. You must declare output with a test function first."
324 # okay, reconnect the test suite back to the saved handles
325 $t->output($original_output_handle);
326 $t->failure_output($original_failure_handle);
327 $t->todo_output($original_todo_handle);
329 # restore the test no, etc, back to the original point
330 $t->current_test($testing_num);
333 # re-enable the original setting of the harness
334 $ENV{HARNESS_ACTIVE} = $original_harness_env;
336 # check the output we've stashed
337 unless( $t->ok( ( $args{skip_out} || $out->check ) &&
338 ( $args{skip_err} || $err->check ), $mess )
341 # print out the diagnostic information about why this
346 $t->diag( map { "$_\n" } $out->complaint )
347 unless $args{skip_out} || $out->check;
349 $t->diag( map { "$_\n" } $err->complaint )
350 unless $args{skip_err} || $err->check;
356 A utility function that returns the line number that the function was
357 called on. You can pass it an offset which will be added to the
358 result. This is very useful for working out the correct text of
359 diagnostic functions that contain line numbers.
361 Essentially this is the same as the C<__LINE__> macro, but the
362 C<line_num(+3)> idiom is arguably nicer.
367 my( $package, $filename, $line ) = caller;
368 return $line + ( shift() || 0 ); # prevent warnings
373 In addition to the six exported functions there there exists one
374 function that can only be accessed with a fully qualified function
381 When C<test_test> is called and the output that your tests generate
382 does not match that which you declared, C<test_test> will print out
383 debug information showing the two conflicting versions. As this
384 output itself is debug information it can be confusing which part of
385 the output is from C<test_test> and which was the original output from
386 your original tests. Also, it may be hard to spot things like
387 extraneous whitespace at the end of lines that may cause your test to
388 fail even though the output looks similar.
390 To assist you C<test_test> can colour the background of the debug
391 information to disambiguate the different types of output. The debug
392 output will have it's background coloured green and red. The green
393 part represents the text which is the same between the executed and
394 actual output, the red shows which part differs.
396 The C<color> function determines if colouring should occur or not.
397 Passing it a true or false value will enable or disable colouring
398 respectively, and the function called with no argument will return the
401 To enable colouring from the command line, you can use the
402 B<Text::Builder::Tester::Color> module like so:
404 perl -Mlib=Text::Builder::Tester::Color test.t
406 Or by including the B<Test::Builder::Tester::Color> module directly in
414 $color = shift if @_;
422 Calls C<<Test::Builder->no_ending>> turning off the ending tests.
423 This is needed as otherwise it will trip out because we've run more
424 tests than we strictly should have and it'll register any failures we
425 had that we were testing for as real failures.
427 The color function doesn't work unless B<Term::ANSIColor> is
428 compatible with your terminal.
430 Bugs (and requests for new features) can be reported to the author
431 though the CPAN RT system:
432 L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Test-Builder-Tester>
436 Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
438 Some code taken from B<Test::More> and B<Test::Catch>, written by by
439 Michael G Schwern E<lt>schwern@pobox.comE<gt>. Hence, those parts
440 Copyright Micheal G Schwern 2001. Used and distributed with
443 This program is free software; you can redistribute it
444 and/or modify it under the same terms as Perl itself.
448 Thanks to Richard Clamp E<lt>richardc@unixbeard.netE<gt> for letting
449 me use his testing system to try this module out on.
453 L<Test::Builder>, L<Test::Builder::Tester::Color>, L<Test::More>.
459 ####################################################################
460 # Helper class that is used to remember expected and received data
462 package Test::Builder::Tester::Tie;
465 # add line(s) to be expected
471 foreach my $check (@checks) {
472 $check = $self->_translate_Failed_check($check);
473 push @{ $self->{wanted} }, ref $check ? $check : "$check\n";
477 sub _translate_Failed_check {
478 my( $self, $check ) = @_;
480 if( $check =~ /\A(.*)# (Failed .*test) \((.*?) at line (\d+)\)\Z(?!\n)/ ) {
481 $check = "/\Q$1\E#\\s+\Q$2\E.*?\\n?.*?\Qat $3\E line \Q$4\E.*\\n?/";
488 # return true iff the expected data matches the got data
493 # turn off warnings as these might be undef
496 my @checks = @{ $self->{wanted} };
497 my $got = $self->{got};
498 foreach my $check (@checks) {
499 $check = "\Q$check\E" unless( $check =~ s,^/(.*)/$,$1, or ref $check );
500 return 0 unless $got =~ s/^$check//;
503 return length $got == 0;
507 # a complaint message about the inputs not matching (to be
508 # used for debugging messages)
512 my $type = $self->type;
513 my $got = $self->got;
514 my $wanted = join "\n", @{ $self->wanted };
516 # are we running in colour mode?
517 if(Test::Builder::Tester::color) {
519 eval { require Term::ANSIColor };
523 my $green = Term::ANSIColor::color("black") . Term::ANSIColor::color("on_green");
524 my $red = Term::ANSIColor::color("black") . Term::ANSIColor::color("on_red");
525 my $reset = Term::ANSIColor::color("reset");
527 # work out where the two strings start to differ
529 $char++ while substr( $got, $char, 1 ) eq substr( $wanted, $char, 1 );
531 # get the start string and the two end strings
532 my $start = $green . substr( $wanted, 0, $char );
533 my $gotend = $red . substr( $got, $char ) . $reset;
534 my $wantedend = $red . substr( $wanted, $char ) . $reset;
536 # make the start turn green on and off
537 $start =~ s/\n/$reset\n$green/g;
539 # make the ends turn red on and off
540 $gotend =~ s/\n/$reset\n$red/g;
541 $wantedend =~ s/\n/$reset\n$red/g;
543 # rebuild the strings
544 $got = $start . $gotend;
545 $wanted = $start . $wantedend;
549 return "$type is:\n" . "$got\nnot:\n$wanted\nas expected";
553 # forget all expected and got data
558 type => $self->{type},
571 return $self->{wanted};
576 return $self->{type};
585 $self->{got} .= join '', @_;
589 my( $class, $type ) = @_;
591 my $self = bless { type => $type }, $class;