7 our $VERSION = '1.301001_089';
8 $VERSION = eval $VERSION; ## no critic (BuiltinFunctions::ProhibitStringyEval)
11 use Test::Stream 1.301001 qw/ -internal STATE_LEGACY STATE_PLAN STATE_COUNT /;
12 use Test::Stream::Toolset;
13 use Test::Stream::Context;
14 use Test::Stream::Carp qw/confess/;
15 use Test::Stream::Meta qw/MODERN/;
17 use Test::Stream::Util qw/try protect unoverload_str is_regex/;
18 use Scalar::Util qw/blessed reftype/;
20 use Test::More::Tools;
23 my $meta = Test::Stream::Meta->is_tester('main');
24 Test::Stream->shared->set_use_legacy(1)
25 unless $meta && $meta->[MODERN];
28 # The mostly-singleton, and other package vars.
29 our $Test = Test::Builder->new;
30 our $_ORIG_Test = $Test;
34 my $self = shift || die "No self in context";
36 my $ctx = Test::Stream::Context::context(2 + ($add || 0), $self->{stream});
37 if (defined $self->{Todo}) {
39 $ctx->set_todo($self->{Todo});
40 $ctx->set_diag_todo(1);
47 return $self->{stream} || Test::Stream->shared;
50 sub depth { $_[0]->{depth} || 0 }
52 # This is only for unit tests at this point.
56 require Test::Stream::ExitMagic;
57 $self->{stream}->set_no_ending(0);
58 Test::Stream::ExitMagic->new->do_magic($self->{stream}, $ctx);
68 done_testing => \&done_testing,
71 sub WARN_OF_OVERRIDE {
74 return unless $ctx->modern;
75 my $old = $ORIG{$sub};
76 # Use package instead of self, we want replaced subs, not subclass overrides.
77 my $new = __PACKAGE__->can($sub);
79 return if $new == $old;
82 my $o = B::svref_2object($new);
86 my $pkg = $gv->STASH->NAME;
90 warn <<" EOT" unless $WARNED{"$pkg $name $file $line"}++;
92 *******************************************************************************
93 Something monkeypatched Test::Builder::$sub()!
94 The new sub is '$pkg\::$name' defined in $file around line $line.
95 In the near future monkeypatching Test::Builder::ok() will no longer work
97 *******************************************************************************
109 $Test ||= $class->create(shared_stream => 1);
118 my $self = bless {}, $class;
119 $self->reset(%params);
124 # Copy an object, currently a shallow.
125 # This does *not* bless the destination. This keeps the destructor from
126 # firing when we're just storing a copy of the object to restore later.
128 my ($src, $dest) = @_;
137 #############################
138 # {{{ Children and subtests #
139 #############################
143 my $ctx = $self->ctx();
144 require Test::Stream::Subtest;
145 return Test::Stream::Subtest::subtest(@_);
149 my( $self, $name ) = @_;
151 my $ctx = $self->ctx;
153 if ($self->{child}) {
154 my $cname = $self->{child}->{Name};
155 $ctx->throw("You already have a child named ($cname) running");
158 $name ||= "Child of " . $self->{Name};
159 $ctx->child('push', $name, 1);
161 my $stream = $self->{stream} || Test::Stream->shared;
170 $child->{Name} = $name;
171 $self->{child} = $child;
172 Scalar::Util::weaken($self->{child});
180 return unless $self->{parent};
182 my $ctx = $self->ctx;
184 if ($self->{child}) {
185 my $cname = $self->{child}->{Name};
186 $ctx->throw("Can't call finalize() with child ($cname) active");
189 $self->_ending($ctx);
190 my $passing = $ctx->stream->is_passing;
191 my $count = $ctx->stream->count;
192 my $name = $self->{Name};
195 my $stream = $self->{stream} || Test::Stream->shared;
197 my $parent = $self->parent;
198 $self->{parent}->{child} = undef;
199 $self->{parent} = undef;
204 $ctx->child('pop', $self->{Name});
209 my $ctx = $self->ctx;
210 return scalar @{$ctx->stream->subtests};
213 sub parent { $_[0]->{parent} }
214 sub name { $_[0]->{Name} }
218 return unless $self->{parent};
219 return if $self->{Skip_All};
220 $self->{parent}->is_passing(0);
221 my $name = $self->{Name};
222 die "Child ($name) exited without calling finalize()";
225 #############################
226 # }}} Children and subtests #
227 #############################
229 #####################################
230 # {{{ stuff for TODO status #
231 #####################################
234 my ($self, $pack, $set, $new_value) = @_;
237 if (my $ctx = Test::Stream::Context->peek) {
238 $pack = $ctx->package;
239 my $old = $ctx->todo;
240 $ctx->set_todo($new_value) if $set;
244 $pack = $self->exported_to || return;
247 no strict 'refs'; ## no critic
249 my $old_value = ${$pack . '::TODO'};
250 $set and ${$pack . '::TODO'} = $new_value;
255 my ($self, $pack) = @_;
257 return $self->{Todo} if defined $self->{Todo};
259 my $ctx = $self->ctx;
261 my $todo = $self->find_TODO($pack);
262 return $todo if defined $todo;
270 my $ctx = $self->ctx;
271 return 1 if $ctx->in_todo;
273 return (defined $self->{Todo} || $self->find_TODO) ? 1 : 0;
278 my $message = @_ ? shift : '';
280 $self->{Start_Todo}++;
281 if ($self->in_todo) {
282 push @{$self->{Todo_Stack}} => $self->todo;
284 $self->{Todo} = $message;
292 if (!$self->{Start_Todo}) {
293 $self->ctx(-1)->throw('todo_end() called without todo_start()');
296 $self->{Start_Todo}--;
298 if ($self->{Start_Todo} && @{$self->{Todo_Stack}}) {
299 $self->{Todo} = pop @{$self->{Todo_Stack}};
302 delete $self->{Todo};
308 #####################################
309 # }}} Finding Testers and Providers #
310 #####################################
317 no_plan => 'no_plan',
318 skip_all => 'skip_all',
319 tests => '_plan_tests',
323 my ($self, $cmd, @args) = @_;
325 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
326 WARN_OF_OVERRIDE(plan => $ctx);
330 if (my $method = $PLAN_CMDS{$cmd}) {
331 $self->$method(@args);
334 my @in = grep { defined } ($cmd, @args);
335 $self->ctx->throw("plan() doesn't understand @in");
342 my ($self, $reason) = @_;
344 $self->{Skip_All} = 1;
346 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
348 $ctx->_plan(0, 'SKIP', $reason);
352 my ($self, @args) = @_;
354 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
356 $ctx->alert("no_plan takes no arguments") if @args;
357 $ctx->_plan(0, 'NO PLAN');
363 my ($self, $arg) = @_;
365 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
368 $ctx->throw("Number of tests must be a positive integer. You gave it '$arg'")
369 unless $arg =~ /^\+?\d+$/;
373 elsif (!defined $arg) {
374 $ctx->throw("Got an undefined number of tests");
377 $ctx->throw("You said to run 0 tests");
384 my ($self, $num_tests) = @_;
386 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
387 WARN_OF_OVERRIDE(done_testing => $ctx);
389 my $out = $ctx->stream->done_testing($ctx, $num_tests);
397 #############################
398 # {{{ Base Event Producers #
399 #############################
403 my($test, $name) = @_;
405 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
406 WARN_OF_OVERRIDE(ok => $ctx);
408 if ($self->{child}) {
409 $self->is_passing(0);
410 $ctx->throw("Cannot run test ($name) with active children");
413 $ctx->_unwind_ok($test, $name);
414 return $test ? 1 : 0;
418 my( $self, $reason ) = @_;
419 $self->ctx()->bail($reason);
423 my( $self, $why ) = @_;
425 unoverload_str( \$why );
427 my $ctx = $self->ctx();
428 $ctx->set_skip($why);
430 $ctx->set_skip(undef);
434 my( $self, $why ) = @_;
436 unoverload_str( \$why );
438 my $ctx = $self->ctx();
439 $ctx->set_skip($why);
440 $ctx->set_todo($why);
442 $ctx->set_skip(undef);
443 $ctx->set_todo(undef);
448 my $msg = join '', map { defined($_) ? $_ : 'undef' } @_;
450 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
451 WARN_OF_OVERRIDE(diag => $ctx);
459 my $msg = join '', map { defined($_) ? $_ : 'undef' } @_;
461 my $ctx = $CTX || Test::Stream::Context->peek || $self->ctx();
462 WARN_OF_OVERRIDE(note => $ctx);
467 #############################
468 # }}} Base Event Producers #
469 #############################
471 #######################
472 # {{{ Public helpers #
473 #######################
481 protect { require Data::Dumper };
482 my $dumper = Data::Dumper->new( [$_] );
483 $dumper->Indent(1)->Terse(1);
484 $dumper->Sortkeys(1) if $dumper->can("Sortkeys");
493 $self->ctx->alert(join '' => @_);
498 $self->ctx->throw(join '' => @_);
504 my $plan = $self->ctx->stream->plan || return undef;
505 return 'no_plan' if $plan->directive && $plan->directive eq 'NO PLAN';
513 $self->{use_shared} = 1 if $params{shared_stream};
515 if ($self->{use_shared}) {
516 Test::Stream->shared->_reset;
517 Test::Stream->shared->state->[-1]->[STATE_LEGACY] = [];
520 $self->{stream} = Test::Stream->new();
521 $self->{stream}->set_use_legacy(1);
522 $self->{stream}->state->[-1]->[STATE_LEGACY] = [];
525 # We leave this a global because it has to be localized and localizing
526 # hash keys is just asking for pain. Also, it was documented.
531 $self->{Original_Pid} = $$;
532 $self->{Child_Name} = undef;
534 $self->{Exported_To} = undef;
536 $self->{Todo} = undef;
537 $self->{Todo_Stack} = [];
538 $self->{Start_Todo} = 0;
539 $self->{Opened_Testhandles} = 0;
544 #######################
545 # }}} Public helpers #
546 #######################
548 #################################
549 # {{{ Advanced Event Producers #
550 #################################
553 my( $self, $got, $type, $expect, $name ) = @_;
554 my $ctx = $self->ctx;
555 my ($ok, @diag) = tmt->cmp_check($got, $type, $expect);
556 $ctx->ok($ok, $name, \@diag);
561 my( $self, $got, $expect, $name ) = @_;
562 my $ctx = $self->ctx;
563 my ($ok, @diag) = tmt->is_eq($got, $expect);
564 $ctx->ok($ok, $name, \@diag);
569 my( $self, $got, $expect, $name ) = @_;
570 my $ctx = $self->ctx;
571 my ($ok, @diag) = tmt->is_num($got, $expect);
572 $ctx->ok($ok, $name, \@diag);
577 my( $self, $got, $dont_expect, $name ) = @_;
578 my $ctx = $self->ctx;
579 my ($ok, @diag) = tmt->isnt_eq($got, $dont_expect);
580 $ctx->ok($ok, $name, \@diag);
585 my( $self, $got, $dont_expect, $name ) = @_;
586 my $ctx = $self->ctx;
587 my ($ok, @diag) = tmt->isnt_num($got, $dont_expect);
588 $ctx->ok($ok, $name, \@diag);
593 my( $self, $thing, $regex, $name ) = @_;
594 my $ctx = $self->ctx;
595 my ($ok, @diag) = tmt->regex_check($thing, $regex, '=~');
596 $ctx->ok($ok, $name, \@diag);
601 my( $self, $thing, $regex, $name ) = @_;
602 my $ctx = $self->ctx;
603 my ($ok, @diag) = tmt->regex_check($thing, $regex, '!~');
604 $ctx->ok($ok, $name, \@diag);
608 #################################
609 # }}} Advanced Event Producers #
610 #################################
612 ################################################
614 ################################################
618 my($file_or_fh) = shift;
620 return $file_or_fh if $self->is_fh($file_or_fh);
623 if( ref $file_or_fh eq 'SCALAR' ) {
624 open $fh, ">>", $file_or_fh
625 or croak("Can't open scalar ref $file_or_fh: $!");
628 open $fh, ">", $file_or_fh
629 or croak("Can't open test output log $file_or_fh: $!");
630 Test::Stream::IOSets->_autoflush($fh);
638 my $handles = $self->ctx->stream->io_sets->init_encoding('legacy');
639 $handles->[0] = $self->_new_fh(@_) if @_;
640 return $handles->[0];
645 my $handles = $self->ctx->stream->io_sets->init_encoding('legacy');
646 $handles->[1] = $self->_new_fh(@_) if @_;
647 return $handles->[1];
652 my $handles = $self->ctx->stream->io_sets->init_encoding('legacy');
653 $handles->[2] = $self->_new_fh(@_) if @_;
654 return $handles->[2] || $handles->[0];
659 my $ctx = $self->ctx;
660 $ctx->stream->io_sets->reset_legacy;
665 my $ctx = $self->ctx;
666 $ctx->stream->set_use_numbers(@_) if @_;
667 $ctx->stream->use_numbers;
672 my $ctx = $self->ctx;
673 $ctx->stream->set_no_ending(@_) if @_;
674 $ctx->stream->no_ending || 0;
679 my $ctx = $self->ctx;
680 $ctx->stream->set_no_header(@_) if @_;
681 $ctx->stream->no_header || 0;
686 my $ctx = $self->ctx;
687 $ctx->stream->set_no_diag(@_) if @_;
688 $ctx->stream->no_diag || 0;
692 my($self, $pack) = @_;
693 $self->{Exported_To} = $pack if defined $pack;
694 return $self->{Exported_To};
699 my $maybe_fh = shift;
700 return 0 unless defined $maybe_fh;
702 return 1 if ref $maybe_fh eq 'GLOB'; # its a glob ref
703 return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob
707 $out = eval { $maybe_fh->isa("IO::Handle") }
708 || eval { tied($maybe_fh)->can('TIEHANDLE') };
714 sub BAILOUT { goto &BAIL_OUT }
719 my $ctx = $self->ctx;
720 $ctx->plan(@_) if @_;
722 my $plan = $ctx->stream->state->[-1]->[STATE_PLAN] || return 0;
723 return $plan->max || 0;
726 sub caller { ## no critic (Subroutines::ProhibitBuiltinHomonyms)
729 my $ctx = $self->ctx;
731 return wantarray ? $ctx->call : $ctx->package;
735 my( $self, $level ) = @_;
736 $Level = $level if defined $level;
741 my ($self, $regex) = @_;
742 return is_regex($regex);
747 my $ctx = $self->ctx;
748 $ctx->stream->is_passing(@_);
751 # Yeah, this is not efficient, but it is only legacy support, barely anything
752 # uses it, and they really should not.
756 my $ctx = $self->ctx;
760 my $state = $ctx->stream->state->[-1];
761 $state->[STATE_COUNT] = $num;
763 my $old = $state->[STATE_LEGACY] || [];
766 my $nctx = $ctx->snapshot;
767 $nctx->set_todo('incrementing test number');
768 $nctx->set_in_todo(1);
772 $i = shift @$old while @$old && (!$i || !$i->isa('Test::Stream::Event::Ok'));
773 $i ||= Test::Stream::Event::Ok->new(
786 $state->[STATE_LEGACY] = $new;
794 my $ctx = $self->ctx;
795 my $state = $ctx->stream->state->[-1];
797 return @out unless $state->[STATE_LEGACY];
799 for my $e (@{$state->[STATE_LEGACY]}) {
800 next unless $e && $e->isa('Test::Stream::Event::Ok');
801 push @out => $e->to_legacy;
809 my $ctx = $self->ctx;
810 my $state = $ctx->stream->state->[-1];
811 return @{[]} unless $state->[STATE_LEGACY];
812 return map { $_->isa('Test::Stream::Event::Ok') ? ($_->bool ? 1 : 0) : ()} @{$state->[STATE_LEGACY]};
815 ###################################
817 ###################################
823 # This is just a list of method Test::Builder current does not have that Test::Builder 1.5 does.
824 my %TB15_METHODS = map { $_ => 1 } qw{
825 _file_and_line _join_message _make_default _my_exit _reset_todo_state
826 _result_to_hash _results _todo_state formatter history in_test
827 no_change_exit_code post_event post_result set_formatter set_plan test_end
828 test_exit_code test_start test_state
834 $AUTOLOAD =~ m/^(.*)::([^:]+)$/;
835 my ($package, $sub) = ($1, $2);
837 my @caller = CORE::caller();
838 my $msg = qq{Can't locate object method "$sub" via package "$package" at $caller[1] line $caller[2].\n};
840 $msg .= <<" EOT" if $TB15_METHODS{$sub};
842 *************************************************************************
843 '$sub' is a Test::Builder 1.5 method. Test::Builder 1.5 is a dead branch.
844 You need to update your code so that it no longer treats Test::Builders
845 over a specific version number as anything special.
847 See: http://blogs.perl.org/users/chad_exodist_granum/2014/03/testmore---new-maintainer-also-stop-version-checking.html
848 *************************************************************************
858 ##################################
859 # {{{ Legacy support, do not use #
860 ##################################
862 # These are here to support old versions of Test::More which may be bundled
863 # with some dists. See https://github.com/Test-More/test-more/issues/479
866 my( $self, $code, %opts ) = @_;
871 $return = eval { $code->() };
875 die $error if $error and $opts{die_on_fail};
877 return wantarray ? ( $return, $error ) : $return;
884 $self->_try(sub { require overload; }, die_on_fail => 1);
886 foreach my $thing (@_) {
887 if( $self->_is_object($$thing) ) {
888 if( my $string_meth = overload::Method( $$thing, $type ) ) {
889 $$thing = $$thing->$string_meth();
898 my( $self, $thing ) = @_;
900 return $self->_try( sub { ref $thing && $thing->isa('UNIVERSAL') } ) ? 1 : 0;
903 sub _unoverload_str {
906 return $self->_unoverload( q[""], @_ );
909 sub _unoverload_num {
912 $self->_unoverload( '0+', @_ );
915 next unless $self->_is_dualvar($$val);
922 # This is a hack to detect a dualvar such as $!
924 my( $self, $val ) = @_;
926 # Objects are not dualvars.
927 return 0 if ref $val;
929 no warnings 'numeric';
930 my $numval = $val + 0;
931 return ($numval != 0 and $numval ne $val ? 1 : 0);
934 ##################################
935 # }}} Legacy support, do not use #
936 ##################################
946 Test::Builder - *DEPRECATED* Module for building testing libraries.
950 This module was previously the base module for almost any testing library. This
951 module is now little more than a compatability wrapper around L<Test::Stream>.
952 If you are looking to write or update a testing library you should look at
953 L<Test::Stream::Toolset>.
959 =item $Test::Builder::Test
961 The variable that holds the Test::Builder singleton.
963 =item $Test::Builder::Level
965 In the past this variable was used to track stack depth so that Test::Builder
966 could report the correct line number. If you use Test::Builder this will still
967 work, but in new code it is better to use the L<Test::Stream::Context> module.
977 =item Test::Builder->new
979 Returns the singleton stored in C<$Test::Builder::Test>.
981 =item Test::Builder->create
983 =item Test::Builder->create(use_shared => 1)
985 Returns a new instance of Test::Builder. It is important to note that this
986 instance will not use the shared L<Test::Stream> object unless you pass in the
987 C<< use_shared => 1 >> argument.
997 Helper method for Test::Builder to get a L<Test::Stream::Context> object.
1001 Get the subtest depth
1003 =item $TB->find_TODO
1009 These all check on todo state and value
1023 These let you figure out when/where the test is defined in the test file.
1027 Start a subtest (Please do not use this)
1031 Finish a subtest (Please do not use this)
1035 Interface to Data::Dumper that dumps whatever you give it.
1037 =item $TB->exported_to
1039 This used to tell you what package used Test::Builder, it never worked well.
1040 The previous bad and unpredictable behavior of this has largely been preserved,
1041 however nothing internal uses it in any meaningful way anymore.
1045 Check if something is a filehandle
1049 Get/Set C<$Test::Builder::Level>. $Level is a package var, and most things
1050 localize it, so this method is pretty useless.
1052 =item $TB->maybe_regex
1054 Check if something might be a regex.
1058 Reset the builder object to a very basic and default state. You almost
1059 certainly do not need this unless you are writing a tool to test testing
1060 libraries. Even then you probably do not want this.
1064 =item $TB->todo_start
1066 Start/end TODO state, there are better ways to do this now.
1070 =head2 STREAM INTERFACE
1072 These simply interface into functionality of L<Test::Stream>.
1076 =item $TB->failure_output
1080 =item $TB->reset_outputs
1082 =item $TB->todo_output
1084 These get/set the IO handle used in the 'legacy' tap encoding.
1088 Do not display L<Test::Stream::Event::Diag> events.
1090 =item $TB->no_ending
1092 Do not do some special magic at the end that tells you what went wrong with
1095 =item $TB->no_header
1097 Do not display the plan
1099 =item $TB->use_numbers
1101 Turn numbers in TAP on and off.
1111 Get all the events that occured on this object. Each event will be transformed
1112 into a hash that matches the legacy output of this method.
1114 =item $TB->expected_tests
1116 Set/Get expected number of tests
1120 Check if there is a plan
1124 List of pass/fail results.
1128 =head2 EVENT GENERATORS
1130 See L<Test::Stream::Context>, L<Test::Stream::Toolset>, and
1131 L<Test::More::Tools>. Calling the methods below is not advised.
1141 =item $TB->current_test
1145 =item $TB->done_testing
1151 =item $TB->is_passing
1173 =item $TB->todo_skip
1185 Get the stream used by this builder (or the shared stream).
1193 Parent if this is a child.
1197 =head1 MONKEYPATCHING
1199 Many legacy testing modules monkeypatch C<ok()>, C<plan()>, and others. The
1200 abillity to monkeypatch these to effect all events of the specified type is now
1201 considered discouraged. For backwords compatability monkeypatching continues to
1202 work, however in the distant future it will be removed. L<Test::Stream> upon
1203 which Test::Builder is now built, provides hooks and API's for doing everything
1204 that previously required monkeypatching.
1212 =item L<Test::Tutorial>
1214 The original L<Test::Tutorial>. Uses comedy to introduce you to testing from
1217 =item L<Test::Tutorial::WritingTests>
1219 The L<Test::Tutorial::WritingTests> tutorial takes a more technical approach.
1220 The idea behind this tutorial is to give you a technical introduction to
1221 testing that can easily be used as a reference. This is for people who say
1222 "Just tell me how to do it, and quickly!".
1224 =item L<Test::Tutorial::WritingTools>
1226 The L<Test::Tutorial::WritingTools> tutorial is an introduction to writing
1227 testing tools that play nicely with other L<Test::Stream> and L<Test::Builder>
1228 based tools. This is what you should look at if you want to write
1235 The source code repository for Test::More can be found at
1236 F<http://github.com/Test-More/test-more/>.
1242 =item Chad Granum E<lt>exodist@cpan.orgE<gt>
1248 The following people have all contributed to the Test-More dist (sorted using
1249 VIM's sort function).
1253 =item Chad Granum E<lt>exodist@cpan.orgE<gt>
1255 =item Fergal Daly E<lt>fergal@esatclear.ie>E<gt>
1257 =item Mark Fowler E<lt>mark@twoshortplanks.comE<gt>
1259 =item Michael G Schwern E<lt>schwern@pobox.comE<gt>
1267 There has been a lot of code migration between modules,
1268 here are all the original copyrights together:
1274 =item Test::Stream::Tester
1276 Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>.
1278 This program is free software; you can redistribute it and/or
1279 modify it under the same terms as Perl itself.
1281 See F<http://www.perl.com/perl/misc/Artistic.html>
1289 Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much
1290 inspiration from Joshua Pritikin's Test module and lots of help from Barrie
1291 Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa
1294 Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern
1295 E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein.
1297 Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>.
1299 This program is free software; you can redistribute it and/or
1300 modify it under the same terms as Perl itself.
1302 See F<http://www.perl.com/perl/misc/Artistic.html>
1306 To the extent possible under law, 唐鳳 has waived all copyright and related
1307 or neighboring rights to L<Test-use-ok>.
1309 This work is published from Taiwan.
1311 L<http://creativecommons.org/publicdomain/zero/1.0>
1315 This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts
1316 are based on other people's work.
1318 Under the same license as Perl itself
1320 See http://www.perl.com/perl/misc/Artistic.html
1322 =item Test::Builder::Tester
1324 Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004.
1326 This program is free software; you can redistribute it
1327 and/or modify it under the same terms as Perl itself.