]> git.vpit.fr Git - perl/modules/Test-Leaner.git/commitdiff
Fix the handling of the "import" import argument
authorVincent Pit <vince@profvince.com>
Fri, 8 Apr 2011 15:58:57 +0000 (17:58 +0200)
committerVincent Pit <vince@profvince.com>
Fri, 8 Apr 2011 15:59:01 +0000 (17:59 +0200)
And test it for Test::Leaner and for the Test::More fallback interface.

MANIFEST
lib/Test/Leaner.pm
t/02-import-arg.t [new file with mode: 0644]
t/03-fallback.t [moved from t/02-fallback.t with 100% similarity]
t/04-fallback-import-arg.t [new file with mode: 0644]

index 7b33b2e0b4c795634db26b0360dec0bd97079729..651d18a63903b9face21f1ce406d6fd59a261af1 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -7,7 +7,9 @@ lib/Test/Leaner.pm
 samples/bench.pl
 t/00-load.t
 t/01-import.t
-t/02-fallback.t
+t/02-import-arg.t
+t/03-fallback.t
+t/04-fallback-import-arg.t
 t/05-pass.t
 t/06-fail.t
 t/07-BAIL_OUT.t
index 72531845aac4a400a729807632de6ae37213c3ca..8e45f3c8bfe9d4a24266ffeea5b68c78d5263eac 100644 (file)
@@ -165,14 +165,13 @@ if ($ENV{PERL_TEST_LEANER_USES_TEST_MORE}) {
  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;
@@ -186,15 +185,15 @@ if ($ENV{PERL_TEST_LEANER_USES_TEST_MORE}) {
   shift;
 
   my @imports = &_handle_import_args;
-  @imports = @EXPORT unless @imports;
+  @imports    = @EXPORT unless @imports;
   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->{$_};
+   } else {
+    push @test_more_imports, $_;
    }
   }
 
diff --git a/t/02-import-arg.t b/t/02-import-arg.t
new file mode 100644 (file)
index 0000000..fd6f0f9
--- /dev/null
@@ -0,0 +1,121 @@
+#!perl -T
+
+use strict;
+use warnings;
+
+BEGIN { delete $ENV{PERL_TEST_LEANER_USES_TEST_MORE} }
+
+use Test::Leaner ();
+use Test::More   ();
+
+sub get_subroutine {
+ my ($stash, $name) = @_;
+
+ my $glob = $stash->{$name};
+ return undef unless $glob;
+
+ return *$glob{CODE};
+}
+
+my $this_stash = \%main::;
+
+my @default_exports = qw<
+ plan
+ skip
+ done_testing
+ pass
+ fail
+ ok
+ is
+ isnt
+ like
+ unlike
+ cmp_ok
+ is_deeply
+ diag
+ note
+ BAIL_OUT
+>;
+
+sub check_imports {
+ my %imported     = map { $_ => 1 } @{ $_[0] || [] };
+ my @not_imported = @{ $_[1] || [] };
+ for (@not_imported, grep !$imported{$_}, @default_exports) {
+  Test::More::ok(!exists $this_stash->{$_}, "$_ was not imported");
+ }
+ for (grep $imported{$_}, @default_exports) {
+  my $code = get_subroutine($this_stash, $_);
+  Test::More::ok($code, "$_ was imported");
+ }
+ delete $this_stash->{$_} for @default_exports, keys %imported, @not_imported;
+}
+
+Test::More::plan(tests => 8 * @default_exports + 7 + 2);
+
+check_imports();
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ ]);
+ };
+ Test::More::is($@, '', 'empty import does not croak');
+ check_imports(\@default_exports);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'nonexistent' ]);
+ };
+ Test::More::like($@, qr/^"nonexistent" is not exported by the Test::Leaner module/, 'import "nonexistent" croaks');
+ check_imports([ ], [ 'nonexistent' ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'ok' ]);
+ };
+ Test::More::is($@, '', 'import "ok" does not croak');
+ check_imports([ 'ok' ], [ ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(
+   import => [ qw<like unlike> ],
+   import => [ qw<diag note> ],
+  );
+ };
+ Test::More::is($@, '', 'import "like", "unlike", "diag" and "note" does not croak');
+ check_imports([ qw<like unlike diag note> ], [ ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ '!fail' ]);
+ };
+ Test::More::is($@, '', 'import "!fail" does not croak');
+ check_imports([ grep $_ ne 'fail', @default_exports ], [ 'fail' ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'pass' ], import => [ '!fail' ]);
+ };
+ Test::More::is($@, '', 'import "pass", "!fail" does not croak');
+ check_imports([ 'pass' ], [ ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'fail' ], import => [ '!fail' ]);
+ };
+ Test::More::is($@, '', 'import "fail", "!fail" does not croak');
+ check_imports();
+}
similarity index 100%
rename from t/02-fallback.t
rename to t/03-fallback.t
diff --git a/t/04-fallback-import-arg.t b/t/04-fallback-import-arg.t
new file mode 100644 (file)
index 0000000..ee2bbd5
--- /dev/null
@@ -0,0 +1,121 @@
+#!perl -T
+
+use strict;
+use warnings;
+
+BEGIN { $ENV{PERL_TEST_LEANER_USES_TEST_MORE} = 1 }
+
+use Test::Leaner ();
+use Test::More   ();
+
+sub get_subroutine {
+ my ($stash, $name) = @_;
+
+ my $glob = $stash->{$name};
+ return undef unless $glob;
+
+ return *$glob{CODE};
+}
+
+my $this_stash = \%main::;
+
+my @default_exports = qw<
+ plan
+ skip
+ done_testing
+ pass
+ fail
+ ok
+ is
+ isnt
+ like
+ unlike
+ cmp_ok
+ is_deeply
+ diag
+ note
+ BAIL_OUT
+>;
+
+sub check_imports {
+ my %imported     = map { $_ => 1 } @{ $_[0] || [] };
+ my @not_imported = @{ $_[1] || [] };
+ for (@not_imported, grep !$imported{$_}, @default_exports) {
+  Test::More::ok(!exists $this_stash->{$_}, "$_ was not imported");
+ }
+ for (grep $imported{$_}, @default_exports) {
+  my $code = get_subroutine($this_stash, $_);
+  Test::More::ok($code, "$_ was imported");
+ }
+ delete $this_stash->{$_} for @default_exports, keys %imported, @not_imported;
+}
+
+Test::More::plan(tests => 8 * @default_exports + 7 + 2);
+
+check_imports();
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ ]);
+ };
+ Test::More::is($@, '', 'empty import does not croak');
+ check_imports(\@default_exports);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'nonexistent' ]);
+ };
+ Test::More::like($@, qr/^"nonexistent" is not exported by the Test::More module/, 'import "nonexistent" croaks');
+ check_imports([ ], [ 'nonexistent' ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'ok' ]);
+ };
+ Test::More::is($@, '', 'import "ok" does not croak');
+ check_imports([ 'ok' ], [ ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(
+   import => [ qw<like unlike> ],
+   import => [ qw<diag note> ],
+  );
+ };
+ Test::More::is($@, '', 'import "like", "unlike", "diag" and "note" does not croak');
+ check_imports([ qw<like unlike diag note> ], [ ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ '!fail' ]);
+ };
+ Test::More::is($@, '', 'import "!fail" does not croak');
+ check_imports([ grep $_ ne 'fail', @default_exports ], [ 'fail' ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'pass' ], import => [ '!fail' ]);
+ };
+ Test::More::is($@, '', 'import "pass", "!fail" does not croak');
+ check_imports([ 'pass' ], [ ]);
+}
+
+{
+ local $@;
+ eval {
+  Test::Leaner->import(import => [ 'fail' ], import => [ '!fail' ]);
+ };
+ Test::More::is($@, '', 'import "fail", "!fail" does not croak');
+ check_imports();
+}