It all started easily enough. There was a little note sent to the Perl bug database:
perlop man page mentions: Binary "x" is the repetition operator ... repeated the number of times specified by the right operand.
It should mention what about if the right operand is negative, e.g., print '-' x -80
I figured I could make a quick documentation fix, and maybe even add some automated tests to the Perl test suite.
The x
operator in Perl does repetition on a scalar or list, as
appropriate. For example:
$a = "abc" x 2; # $a = "abcabc"; @a = ("abc") x 2; # @a = ("abc","abc");
If the right-hand operator is 0, then you get an empty scalar or list, as appropriate. If the right-hand operator was negative, it was the same effect as having it be zero. As the bug said, the man page didn't say anything about it.
I added a little sentence to the paragraph describing the operator, and then I added some tests. If it's worth documenting, it's worth testing. Documentation and tests are as much a part of the code as the code itself.
t/op/repeat.t already had a lot of tests in it, like:
is('-' x 5, '-----', 'compile time x'); is('-' x 1, '-', ' x 1'); is('-' x 0, '', ' x 0');
So I added the obvious add-ons:
is('-' x -1, '', ' x -1'); is('-' x undef,'', ' x undef');
And then went to add them to the list-related sections:
@x = qw( a b c ); is(join('', (@x) x -14), '', '(@x) x -14');
Before I sent the patch in, I ran a full make test
and found that
the last test didn't pass. In fact, it caused a Panic in Perl, and the
program died. I boiled it down to a simple:
perl -e'@x=(1);@y=(@x)x-1'
Turns out that that case of a negative or zero operand wasn't handling the stack correctly (in the bleadperl only, fortunately). A quick patch made it all better.
Some morals to this story:
I want to get automated tests going in our shop, and I'd like to frame your points 1 and 2, and put them on the wall.
Re:May I quote you?
petdance on 2004-03-23T02:57:45
Sure, go ahead. Point #2 is in one of my presentations at http://petdance.com/perl/. I also made a slightly different version that was less code-intensive if that would help.Heck, I'll come talk to your user group about testing, if you want...
Re:May I quote you?
JerseyTom on 2004-03-23T04:19:34
I can't agree more. Testing is underappreciated in coding, as well as in system administration. I've seen people do major upgrades without doing any testing afterwords. ugh. (and if it's a good enough test to do after an upgrade, why isn't it automated and added to your Nagios configuration?)Oh well. I'm preaching to the converted.
Short version:
*average number of tests you have per module?
As many as it takes to cover it. As many as you need to get all the weird corner cases handled. There's no way to put a number on it.
A test coverage tool like Devel::Cover can help make sure that you've exercised all your cases.