=head1 VERSION
-Version 0.02
+Version 0.05
=cut
-our $VERSION = '0.02';
+our $VERSION = '0.05';
=head1 SYNOPSIS
=item *
Stringification isn't forced on the test operands.
-However, L</ok> honors C<'bool'> overloading, L</is> and L</is_deeply> honor C<'eq'> overloading (and just that one) and L</cmp_ok> honors whichever overloading category corresponds to the specified operator.
+However, L</ok> honors C<'bool'> overloading, L</is> and L</is_deeply> honor C<'eq'> overloading (and just that one), L</isnt> honors C<'ne'> overloading, and L</cmp_ok> honors whichever overloading category corresponds to the specified operator.
=item *
-L</pass>, L</fail>, L</ok>, L</is>, L</isnt>, L</like>, L</unlike> and L</cmp_ok> are all guaranteed to return the truth value of the test.
+L</pass>, L</fail>, L</ok>, L</is>, L</isnt>, L</like>, L</unlike>, L</cmp_ok> and L</is_deeply> are all guaranteed to return the truth value of the test.
+
+=item *
+
+C<isn't> (the sub C<t> in package C<isn>) is not aliased to L</isnt>.
=item *
L</like> and L</unlike> don't special case regular expressions that are passed as C<'/.../'> strings.
-A string regexp argument is always treated as a the source of the regexp, making C<like $text, $rx> and C<like $text, qr[$rx]> equivalent to each other and to C<cmp_ok $text, '=~', $rx> (and likewise for C<unlike>).
+A string regexp argument is always treated as the source of the regexp, making C<like $text, $rx> and C<like $text, qr[$rx]> equivalent to each other and to C<cmp_ok $text, '=~', $rx> (and likewise for C<unlike>).
=item *
=item *
The tests don't output any kind of default diagnostic in case of failure ; the rationale being that if you have a large number of tests and a lot of them are failing, then you don't want to be flooded by diagnostics.
+Moreover, this allows a much faster variant of L</is_deeply>.
=item *
BEGIN {
$main_process = $$;
- if ($] >= 5.008 and $INC{'threads.pm'}) {
+ if ("$]" >= 5.008 and $INC{'threads.pm'}) {
my $use_ithreads = do {
require Config;
no warnings 'once';
=head2 C<PERL_TEST_LEANER_USES_TEST_MORE>
If this environment variable is set, L<Test::Leaner> will replace its functions by those from L<Test::More>.
-Moreover, the symbols that are imported you C<use Test::Leaner> will be those from L<Test::More>, but you can still only import the symbols originally defined in L<Test::Leaner> (hence the functions from L<Test::More> that are not implemented in L<Test::Leaner> will not be imported).
+Moreover, the symbols that are imported when you C<use Test::Leaner> will be those from L<Test::More>, but you can still only import the symbols originally defined in L<Test::Leaner> (hence the functions from L<Test::More> that are not implemented in L<Test::Leaner> will not be imported).
If your version of L<Test::More> is too old and doesn't have some symbols (like L</note> or L</done_testing>), they will be replaced in L<Test::Leaner> by croaking stubs.
This may be useful if your L<Test::Leaner>-based test script fails and you want extra diagnostics.
my $leaner_stash = \%Test::Leaner::;
my $more_stash = \%Test::More::;
- my %valid_imports;
+ my %stubbed;
for (@EXPORT) {
my $replacement = exists $more_stash->{$_} ? *{$more_stash->{$_}}{CODE}
: undef;
- if (defined $replacement) {
- $valid_imports{$_} = 1;
- } else {
+ unless (defined $replacement) {
+ $stubbed{$_}++;
$replacement = sub {
@_ = ("$_ is not implemented in this version of Test::More");
goto &croak;
}
my $import = sub {
- shift;
+ my $class = shift;
+
my @imports = &_handle_import_args;
- @imports = @EXPORT unless @imports;
+ if (@imports == grep /^!/, @imports) {
+ # All imports are negated, or @imports is empty
+ my %negated;
+ /^!(.*)/ and ++$negated{$1} for @imports;
+ push @imports, grep !$negated{$_}, @EXPORT;
+ }
+
my @test_more_imports;
for (@imports) {
- if ($valid_imports{$_}) {
- push @test_more_imports, $_;
- } else {
+ if ($stubbed{$_}) {
my $pkg = caller;
no strict 'refs';
*{$pkg."::$_"} = $leaner_stash->{$_};
+ } elsif (/^!/ or !exists $more_stash->{$_} or exists $leaner_stash->{$_}) {
+ push @test_more_imports, $_;
+ } else {
+ # Croak for symbols in Test::More but not in Test::Leaner
+ Exporter::import($class, $_);
}
}
+
my $test_more_import = 'Test::More'->can('import');
+ return unless $test_more_import;
+
@_ = (
'Test::More',
@_,
lock $plan if THREADSAFE;
push @_, 'no_diag' if $no_diag;
}
+
goto $test_more_import;
};
The following functions from L<Test::More> are implemented and exported by default.
-=head2 C<< plan [ tests => $count | 'no_plan' | skip_all => $reason ] >>
+=head2 C<plan>
+
+ plan tests => $count;
+ plan 'no_plan';
+ plan skip_all => $reason;
See L<Test::More/plan>.
goto &Exporter::import;
}
-=head2 C<< skip $reason => $count >>
+=head2 C<skip>
+
+ skip $reason => $count;
See L<Test::More/skip>.
last SKIP;
}
-=head2 C<done_testing [ $count ]>
+=head2 C<done_testing>
+
+ done_testing;
+ done_testing $count;
See L<Test::More/done_testing>.
return 1;
}
-=head2 C<ok $ok [, $desc ]>
+=head2 C<ok>
+
+ ok $ok;
+ ok $ok, $desc;
See L<Test::More/ok>.
++$test;
my $test_str = "ok $test";
- unless ($ok) {
+ $ok or do {
$test_str = "not $test_str";
++$failed;
- }
+ };
if (defined $desc) {
_sanitize_comment($desc);
$test_str .= " - $desc" if length $desc;
return $ok;
}
-=head2 C<pass [ $desc ]>
+=head2 C<pass>
+
+ pass;
+ pass $desc;
See L<Test::More/pass>.
goto &ok;
}
-=head2 C<fail [ $desc ]>
+=head2 C<fail>
+
+ fail;
+ fail $desc;
See L<Test::More/fail>.
goto &ok;
}
-=head2 C<is $got, $expected [, $desc ]>
+=head2 C<is>
+
+ is $got, $expected;
+ is $got, $expected, $desc;
See L<Test::More/is>.
goto &ok;
}
-=head2 C<isnt $got, $expected [, $desc ]>
+=head2 C<isnt>
+
+ isnt $got, $expected;
+ isnt $got, $expected, $desc;
See L<Test::More/isnt>.
'and' => 'and',
'||' => 'hor',
- ('//' => 'dor') x ($] >= 5.010),
+ ('//' => 'dor') x ("$]" >= 5.010),
'&&' => 'hand',
'|' => 'bor',
'=~' => 'like',
'!~' => 'unlike',
- ('~~' => 'smartmatch') x ($] >= 5.010),
+ ('~~' => 'smartmatch') x ("$]" >= 5.010),
'+' => 'add',
'-' => 'substract',
}
}
-=head2 C<like $got, $regexp_expected [, $desc ]>
+=head2 C<like>
+
+ like $got, $regexp_expected;
+ like $got, $regexp_expected, $desc;
See L<Test::More/like>.
-=head2 C<unlike $got, $regexp_expected, [, $desc ]>
+=head2 C<unlike>
+
+ unlike $got, $regexp_expected;
+ unlike $got, $regexp_expected, $desc;
See L<Test::More/unlike>.
*unlike = _create_binop_handler('!~');
}
-=head2 C<cmp_ok $got, $op, $expected [, $desc ]>
+=head2 C<cmp_ok>
+
+ cmp_ok $got, $op, $expected;
+ cmp_ok $got, $op, $expected, $desc;
See L<Test::More/cmp_ok>.
goto $handler;
}
-=head2 C<is_deeply $got, $expected [, $desc ]>
+=head2 C<is_deeply>
+
+ is_deeply $got, $expected;
+ is_deeply $got, $expected, $desc;
See L<Test::More/is_deeply>.
return 0;
};
-=head2 C<diag @text>
+=head2 C<diag>
+
+ diag @lines;
See L<Test::More/diag>.
goto &_diag_fh;
}
-=head2 C<note @text>
+=head2 C<note>
+
+ note @lines;
See L<Test::More/note>.
goto &_diag_fh;
}
-=head2 C<BAIL_OUT [ $desc ]>
+=head2 C<BAIL_OUT>
+
+ BAIL_OUT;
+ BAIL_OUT $desc;
See L<Test::More/BAIL_OUT>.
L<Test::Leaner> also provides some functions of its own, which are never exported.
-=head2 C<tap_stream [ $fh ]>
+=head2 C<tap_stream>
+
+ my $tap_fh = tap_stream;
+ tap_stream $fh;
Read/write accessor for the filehandle to which the tests are outputted.
On write, it also turns autoflush on onto C<$fh>.
tap_stream *STDOUT;
-=head2 C<diag_stream [ $fh ]>
+=head2 C<diag_stream>
+
+ my $diag_fh = diag_stream;
+ diag_stream $fh;
Read/write accessor for the filehandle to which the diagnostics are printed.
On write, it also turns autoflush on onto C<$fh>.
=head1 COPYRIGHT & LICENSE
-Copyright 2010 Vincent Pit, all rights reserved.
+Copyright 2010,2011,2013 Vincent Pit, all rights reserved.
+
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+Except for the fallback implementation of the internal C<_reftype> function, which has been taken from L<Scalar::Util> and is
+
+Copyright 1997-2007 Graham Barr, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.