On Tue, 4 Dec 2001, Doug MacEachern wrote:
> On Thu, 22 Nov 2001, Stas Bekman wrote:
>
> > I can extend it to engulf the plan() extension that we have added and then
> > the only function you will ever call with plan() is skip_unless. I
> > think this:
> >
> > plan ..., skip_unless('cgi', 'lwp');
>
> there's no point in overloading plan anymore then. we should just change
> it to:
>
> skip_unless(...);
>
> plan tests => $tests;
>
> and have skip_unless() print "1..0\n..."; exit; if conditions are not met.
>
> personally, i would rather keep the the current plan shorthand and change
> skip_unless to be called as it is above.
OK, here it is: I've finally called it skip_all() as it's a standalone
function now.
Index: Apache-Test/lib/Apache/Test.pm
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/Test.pm,v
retrieving revision 1.40
diff -u -r1.40 Test.pm
--- Apache-Test/lib/Apache/Test.pm 2001/12/18 00:47:03 1.40
+++ Apache-Test/lib/Apache/Test.pm 2001/12/21 09:34:43
@@ -11,7 +11,7 @@
use vars qw(@ISA @EXPORT $VERSION %SubTests @SkipReasons);
@ISA = qw(Exporter);
[EMAIL PROTECTED] = qw(ok skip sok plan skip_unless have_lwp have_http11
[EMAIL PROTECTED] = qw(ok skip sok plan skip_all have_lwp have_http11
have_cgi have_module have_apache have_perl);
$VERSION = '0.01';
@@ -138,17 +138,33 @@
Test::plan(@_);
}
-sub skip_unless {
- my $condition = shift;
- my $reason = shift || "no reason given";
-
- if (ref $condition eq 'CODE' and $condition->()) {
- return 1;
+sub skip_all {
+ my $should_skip = 0;
+ for my $cond (@_) {
+ if (ref $cond eq 'HASH') {
+ while (my($code, $reason) = each %$cond) {
+ $reason = "no reason given" unless defined $reason;
+ if (ref $code eq 'CODE' and $code->()) {
+ next;
+ }
+ else {
+ push @SkipReasons, $reason;
+ $should_skip++;
+ }
+ }
+ }
+ else {
+ $should_skip++ unless have_module($cond);
+ }
}
- else {
- push @SkipReasons, $reason;
- return 0;
+
+ if ($should_skip) {
+ my $reason = join ', ',
+ @SkipReasons ? @SkipReasons : "no reason given";
+ print "1..0 # skipped: $reason\n";
+ exit; #XXX: Apache->exit
}
+ @SkipReasons = (); # reset
}
sub have_module {
@@ -321,11 +337,12 @@
plan tests => 5, 0;
But this won't hint the reason for skipping therefore it's better to
-use skip_unless():
+use skip_all()
- plan tests => 5, skip_unless(sub { $a == $b }, "$a != $b");
+ skip_all({sub { $a == $b } => "$a != $b"}, 'LWP');
+ plan tests => 5;
-see skip_unless() for more info.
+see skip_all() for more info.
=item * an C<ARRAY> reference
@@ -364,16 +381,27 @@
=item skip
Same as I<Test::skip>, see I<Test.pm> documentation.
-
-=item skip_unless
- skip_unless($cond_sub, $reason);
+=item skip_all
-skip_unless() is used with plan(), it executes C<$cond_sub> code
-reference and if it returns a false value C<$reason> gets printed as a
-reason for test skipping.
+ skip_all({sub {$a==$b} => "$a != $b!"
+ sub {$a==1} => "$a != 1!"},
+ 'LWP',
+ 'cgi_d',
+ {sub {0} => "forced to be skipped"},
+ );
+
+skip_all() can be called before plan(), to decide whether to skip the
+whole test or not. plan() won't be reached if skip_all decides to skip
+the test.
+
+skip_all's argument is a list of things to test. The list can include
+scalars, which are passed to have_module(), and hash references. The
+hash references have condition code ref as a key and the reason for
+failure as a value. The condition code is run and if it fails the
+reason is used to explain the failure.
-see plan().
+Also see plan().
=item test_pm_refresh
_____________________________________________________________________
Stas Bekman JAm_pH -- Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide http://perl.apache.org/guide
mailto:[EMAIL PROTECTED] http://ticketmaster.com http://apacheweek.com
http://singlesheaven.com http://perl.apache.org http://perlmonth.com/