Hi,

while testing 1.34rc1 I get these lines in the error_log.

Prototype mismatch: sub Apache::Test::ok ($;$$) vs ($;$) at 
/home/r2/tmp/tmp3/Apache-Test-1.34-rc1/t/../lib/Apache/Test.pm line 88
Prototype mismatch: sub Apache::Test::skip ($;$$$) vs none at 
/home/r2/tmp/tmp3/Apache-Test-1.34-rc1/t/../lib/Apache/Test.pm line 88

A look at the source reveals that import() imports these functions either from 
Test::More or from Test. So if one calls AT -withtestmore the functions from 
Test::More are loaded otherwise from Test.

But what happens if I use AT with and without testmore in the same 
interpreter? (For larger projects this is probably the common case.)

$ perl -MApache::Test -MApache::Test=-withtestmore -le ''
Prototype mismatch: sub Apache::Test::ok ($;$$) vs ($;$) at 
/opt/perl/lib/vendor_perl/5.12.1/x86_64-linux/Apache/Test.pm line 88
Prototype mismatch: sub Apache::Test::skip ($;$$$) vs none at 
/opt/perl/lib/vendor_perl/5.12.1/x86_64-linux/Apache/Test.pm line 88
Prototype mismatch: sub main::ok ($;$$) vs ($;$) at -e line 0
Prototype mismatch: sub main::skip ($;$$$) vs none at -e line 0

while the other way around there is no error:

$ perl -MApache::Test=-withtestmore -MApache::Test -le ''
$

I believe this is a sign for a deeper problem. Can we really allow for

  use Apache::Test qw/-withtestmore/;

and

  use Apache::Test;

in the same interpreter?

The way it is currently implemented you might not get what you want. Test::ok 
eats up to 3 parameters: the value to test, an optional value to compare with 
and a test name. Test::More::ok eats only 2 parameters: a boolean value and a 
name. So, I implement my first test w/o -wtm and use somewhere

  ok $got, qr/\b(?:foo|bar)\b/, 'test for foo or bar';

Some time later I write another test where Test::More's is_deeply comes in 
handy. So, that module is written with -wtm. Now it may happen that the ok() 
function in my first test becomes suddenly Test::More::ok and the test 
succeeds even if $got is 'blahblah'.

I thought about the -withtestmore option always as sort of lexical pragma. I 
believe most people do. And the experts know that it's not a good idea to mix 
-withtestmore and -withouttestmore in the same interpreter. I think I recall 
running into such an issue with no time to investigate further.

How about implementing it as lexical pragma and let the user decide which 
flavor to use? 

package YY;
use strict;
use warnings;
use Exporter ();

our @ISA=(qw/Exporter/);
our @EXPORT=(qw/plan/);

sub simple {warn "simple"}
sub more   {warn "more"}

sub import {
  my $class=shift;
  $^H{YY}=1 if grep $_ eq '-wtm', @_;
  my @exp=grep $_ ne '-wtm', @_;
  $class->export_to_level(1, undef, @exp ? @exp : @EXPORT);
}

sub unimport {
  my $class=shift;
  delete $^H{YY} if grep $_ eq '-wtm', @_;
}

sub plan {
  ((caller 0)[10]||{})->{YY} ? more : simple;
}

1;

$ perl -I. -e 'use strict; use YY; plan; {use YY qw/-wtm/; plan;}; plan; use 
YY qw/-wtm/; plan; no YY qw/-wtm/; plan;'
simple at YY.pm line 9.
more at YY.pm line 10.
simple at YY.pm line 9.
more at YY.pm line 10.
simple at YY.pm line 9.

I know this breaks the current API. But I think the current implementation is 
unfixable buggy.

Other options are drop -wtm and implement it as separate module 
Apache::Test::More or make -wtm standard and drop Test.pm and the option. The 
latter requires perl>=5.8.7.

I think this bug should not stop the current release cycle since it has always 
been that way.

Thoughts?

Torsten Förtsch

-- 
Need professional modperl support? Hire me! (http://foertsch.name)

Like fantasy? http://kabatinte.net

Reply via email to