stas        02/04/09 00:24:29

  Modified:    perl-framework/Apache-Test/lib/Apache Test.pm
               src/docs/2.0/devel/testing testing.pod
  Log:
  skip_unless function was broken:
  - it's wrong to use CODE ref as hash keys, they get stringified
  - it didn't handle the setting of the headers
  
  rewrite skip_unless() as have() which is passed to plan(), just like other
  have_* functions so plan() will handle the setting/printing of the HTTP
  headers. it uses CODE refs as values in hash refs now.
  
  adjust and extend the relevant documentation.
  
  Revision  Changes    Path
  1.44      +108 -43   httpd-test/perl-framework/Apache-Test/lib/Apache/Test.pm
  
  Index: Test.pm
  ===================================================================
  RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/Test.pm,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- Test.pm   8 Jan 2002 19:00:14 -0000       1.43
  +++ Test.pm   9 Apr 2002 07:24:29 -0000       1.44
  @@ -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 have have_lwp have_http11
                have_cgi have_module have_apache have_perl);
   $VERSION = '0.01';
   
  @@ -127,7 +127,7 @@
               $meets_condition = $condition ? 1 : 0;
           }
   
  -        # tryint to emulate a dual variable (ala errno)
  +        # trying to emulate a dual variable (ala errno)
           unless ($meets_condition) {
               my $reason = join ', ',
                 @SkipReasons ? @SkipReasons : "no reason given";
  @@ -140,33 +140,26 @@
       Test::plan(@_);
   }
   
  -sub skip_unless {
  -    my $should_skip = 0;
  +sub have {
  +    my $have_all = 1;
       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->()) {
  +            while (my($reason, $code) = each %$cond) {
  +                if (ref $code eq 'CODE' && $code->()) {
                       next;
                   }
                   else {
                       push @SkipReasons, $reason;
  -                    $should_skip++;
  +                    $have_all = 0;
                   }
               }
           }
           else {
  -            $should_skip++ unless have_module($cond);
  +            $have_all = 0 unless have_module($cond);
           }
       }
  +    return $have_all;
   
  -    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 {
  @@ -190,7 +183,6 @@
           #print $@ if $@;
           if ($@) {
               push @reasons, "cannot find module '$_'";
  -            next;
           }
       }
       if (@reasons) {
  @@ -339,12 +331,13 @@
     plan tests => 5, 0;
   
   But this won't hint the reason for skipping therefore it's better to
  -use skip_unless()
  +use have():
   
  -  skip_unless({sub { $a == $b } => "$a != $b"}, 'LWP');
  -  plan tests => 5;
  +  plan tests => 5,
  +      have 'LWP',
  +           { "perl >= 5.7.3 is required" => sub { $] >= 5.007003 } };
   
  -see skip_unless() for more info.
  +see have() for more info.
   
   =item * an C<ARRAY> reference
   
  @@ -384,34 +377,106 @@
   
   Same as I<Test::skip>, see I<Test.pm> documentation.
   
  -=item skip_unless
  -
  -  skip_unless({sub {$a==$b} => "$a != $b!"
  -               sub {$a==1}  => "$a != 1!"},
  -              'LWP',
  -              'cgi_d',
  -               {sub {0} => "forced to be skipped"},
  -             );
  -
  -skip_unless() can be called before plan(), to decide whether to skip the
  -whole test or not. plan() won't be reached if skip_unless decides to skip
  -the test.
  -
  -skip_unless()'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 a condition code reference as a
  -key and a reason for failure as a value. The condition code is run and
  -if it fails the provided reason is used to tell user why the test was
  -skipped.
  -
  -Also see plan().
  -
   =item test_pm_refresh
   
   Normally called by I<Apache::Test::plan>, this function will refresh
   the global state maintained by I<Test.pm>, allowing C<plan> and
   friends to be called more than once per-process.  This function is not
   exported.
  +
  +=back
  +
  +Functions that can be used as a last argument to the extended plan():
  +
  +=over have_http11
  +
  +  plan tests => 5, &have_http11;
  +
  +Require HTTP/1.1 support.
  +
  +=item have_ssl
  +
  +  plan tests => 5, &have_ssl;
  +
  +Require SSL support.
  +
  +Not exported by default.
  +
  +=item have_lwp
  +
  +  plan tests => 5, &have_lwp;
  +
  +Require LWP support.
  +
  +=item have_cgi
  +
  +  plan tests => 5, &have_cgi;
  +
  +Requires mod_cgi or mod_cgid to be installed.
  +
  +=item have_apache
  +
  +  plan tests => 5, have_apache 2;
  +
  +Requires httpd-2.x (apache-2.x).
  +
  +  plan tests => 5, have_apache 1;
  +
  +Requires apache-1.3.x.
  +
  +=item have_perl
  +
  +  plan tests => 5, have_perl 'iolayers';
  +  plan tests => 5, have_perl 'ithreads';
  +
  +Requires a perl extension to be present, or perl compiled with certain
  +capabilities.
  +
  +The first example tests whether C<PerlIO> is available, the second
  +whether:
  +
  +  $Config{useithread} eq 'define';
  +
  +=item have_module
  +
  +  plan tests => 5, have_module 'CGI';
  +  plan tests => 5, have_module qw(CGI Find::File);
  +  plan tests => 5, have_module ['CGI', 'Find::File', 'cgid'];
  +
  +Requires Apache C and Perl modules. In case of C modules, the test
  +will be done by prefixing I<mod_>. The function accept a list of
  +arguments or a reference to a list.
  +
  +=item have
  +
  +  plan tests => 5,
  +      have 'LWP',
  +           { "perl >= 5.7.3 is required" => sub { $] >= 5.007003   } },
  +           { "not Win32"                 => sub { $^O eq 'MSWin32' } },
  +           'cgid';
  +
  +have() is more generic function which can impose multiple requirements
  +at once. All requirements must be satisfied.
  +
  +have()'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 a condition code reference as a value and a
  +reason for failure as a key. The condition code is run and if it fails
  +the provided reason is used to tell user why the test was skipped.
  +
  +In the presented example, we require the presense of the C<LWP> Perl
  +module, C<mod_cgid>, that we run under perl E<gt>= 5.7.3 on Win32.
  +
  +It's possible to put more than one requirement into a single hash
  +reference, but be careful that the keys will be different:
  +
  +      have 'LWP',
  +           { "perl >= 5.7.3 is required" => sub { $] >= 5.007003   },
  +             "not Win32"                 => sub { $^O eq 'MSWin32' },
  +           },
  +           'cgid';
  +
  +Also see plan().
   
   =back
   
  
  
  
  1.17      +38 -37    modperl-docs/src/docs/2.0/devel/testing/testing.pod
  
  Index: testing.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/devel/testing/testing.pod,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- testing.pod       20 Mar 2002 17:44:03 -0000      1.16
  +++ testing.pod       9 Apr 2002 07:24:29 -0000       1.17
  @@ -1815,50 +1815,41 @@
   
   =over
   
  -=item * skip_unless()
  -
  -Alternatively to specifying a last argument for plan(), the
  -skip_unless() function can be called before plan(), to decide whether
  -to skip the whole test or not. plan() won't be reached if skip_unless
  -decides to skip the test.
  -
  -skip_unless()'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 a condition code reference as a
  -key and a reason for failure as a value. The condition code is run and
  -if it fails the provided reason is used to tell user why the test was
  -skipped.
  -
  -For example:
  -
  -  skip_unless({sub {$a==$b} => "$a != $b!"
  -               sub {$a==1}  => "$a != 1!"},
  -              'LWP',
  -              'cgi_d',
  -               {sub {0} => "forced to be skipped"},
  -             );
  -  plan tests => 5;
  -
  -In this example, the first argument is a hash reference which includes
  -two pairs of condition test functions and the corresponding reasons,
  -the second and the third arguments are scalars passed to have_module()
  -and the last argument is another hash reference with a single
  -condition. This is just to demonstrate that you can supply conditions
  -in various syntaxes without particular order. If any of the
  -requirements from this list fail, plan() won't be called since
  -skip_unless() will call exit().
  -
   =item * have_module()
   
  -have_module() tests for existance of Perl modules or C modules
  +have_module() tests for presense of Perl modules or C modules
   I<mod_*>. It accepts a list of modules or a reference to the list.  If
   at least one of the modules is not found it returns a false value,
   otherwise it returns a true value. For example:
   
     plan tests => 5, have_module qw(Chatbot::Eliza Apache::AI);
   
  -will skip the whole test if both Perl modules C<Chatbot::Eliza> and
  -C<Apache::AI> are not available.
  +will skip the whole test unless both Perl modules C<Chatbot::Eliza>
  +and C<Apache::AI> are available.
  +
  +=item * have
  +
  +have() called as a last argument of plan() can impose multiple
  +requirements at once.
  +
  +have()'s arguments can include scalars, which are passed to
  +have_module(), and hash references. The hash references have a
  +condition code reference as a value and a reason for failure as a
  +key. The condition code is run and if it fails the provided reason is
  +used to tell user why the test was skipped.
  +
  +For example:
  +
  +  plan tests => 5,
  +      have 'LWP',
  +           { "perl >= 5.7.3 is required" => sub { $] >= 5.007003   } },
  +           { "not Win32"                 => sub { $^O eq 'MSWin32' } },
  +           'cgid';
  +
  +In this example, we require the presense of the C<LWP> Perl module,
  +C<mod_cgid>, that we run under perl E<gt>= 5.7.3 on Win32. If any of
  +the requirements from this list fail, the test will be skipped and
  +each failed requiremnt will print a reason for its failure.
   
   =item * have_perl()
   
  @@ -1870,6 +1861,12 @@
   if Perl wasn't compiled with C<-Duseithreads> the condition will be
   false and the test will be skipped.
   
  +Also it checks for Perl extensions. For example:
  +
  +  plan tests => 5, have_perl 'iolayers';
  +
  +tests whether C<PerlIO> is available.
  +
   =item * have_lwp()
   
   Tests whether the Perl module LWP is installed.
  @@ -1890,7 +1887,11 @@
   
     plan tests => 2, have_apache 2;
   
  -will skip the test if not run under httpd 2.x.
  +will skip the test if not run under httpd-2.x.
  +
  +  plan tests => 2, have_apache 1;
  +
  +will run the test only if run under Apache version 1.x.
   
   =back
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to