in reply to Re^4: How to write testable command line script?
in thread How to write testable command line script?

Oh! Silly me. You call:

main('90 35 29 + 90 24 29')

But main is:

sub main { reduce(@ARGV); }

so reduce doesn't see the parameters passed to main, it sees @ARGV which is empty. Change main to:

sub main { reduce(@_); }

Also:

  1. Whatever is natural for the sub. Because of its recursive implementation returning anything except a list from reduce doesn't make sense.
  2. There are two different test modes: Functional testing where you test the whole system works as a whole - call main, and unit testing where you test individual units work as advertised - call reduce.

In this case "the whole" is a trivial wrapper around reduce so I'd go for testing reduce directly - a unit test.

Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond

Replies are listed 'Best First'.
Re^6: How to write testable command line script?
by thechartist (Monk) on Nov 21, 2018 at 03:31 UTC

    You last reply was very helpful! Running the test code manually, my debug print statements in the *.pl file show that the @answer array continues to contain the values from previous calls:

  • Test 1. @answer array returns 180 59 58 (test passes).
  • Test 2. @answer array returns 179 1 9 180 59 58 (test fails).
  • Test 3. @answer array returns 180 0 0 179 1 9 180 59 58 (test fails).
  • I tried adding
    my @answer = undef;
    to the test file main sub definition (thinking that this would get cleared on every call) but that did not work. What do you suggest now?

      my @answer = undef;

      General note: I'm not sure what you intend by the quoted statement, but you should realize that it initializes the (newly created) array with a single element, the undef value, which in Perl is a well-defined value! (The  @answer array thus created is also entirely and absolutely independent of any other array with the same name.)

      c:\@Work\Perl\monks>perl -wMstrict -le "use Data::Dump qw(dd); ;; my @answer = undef; dd \@answer; " [undef]


      Give a man a fish:  <%-{-{-{-<

        I am trying to clear an array via assignment in the test file that is already defined in the script file. It appears that command line usage differs from how the subroutine is called in the test environment.

        On the command line, once the subroutine prints the results and exits, the variables are cleared, so when I enter another expression manually, things work. With the test environment, those values do not get cleared, but remain in the @answer array, and appear to be causing the failure.

        There might be other problems causing the failure too, but the @answer array should have 3 or fewer values in it when running any tests.

        What I thought was going to be a rather simple problem turned out to be much more involved than I thought.