#! /usr/bin/perl # # Generate a random test file for dynamic array testing. # # Syntax reference: # # push n, pop, shift, unshift n -- normal stack ops (pop and shift print) # insert x y z ... -- insert items at beginning # append x y z ... -- append items at end # delete n -- remove n items from beginning # reduce n -- remove n items from end # set i n -- assign item at index i to be n # get i -- display item at index i # first, last -- show first or last item # show -- write entire array to stdout, space separated on one line sub random ($) { my $lim = shift; return int(rand($lim)); } $lines = shift || 100; $max = 0; # Estimate of size of array $serial = 1; while ($lines) { $what = random(21); if ($what < 8) { my $op = (qw(push pop shift unshift))[$what % 4]; if ($op eq "push" || $op eq "unshift") { my $n = $serial++; $max++; print "$op $n\n"; } elsif ($max > 0) { $max--; print "$op\n"; } } elsif ($what < 10) { my @n = ($serial++); my $op = (qw(insert append))[$what % 2]; push(@n, $serial++) while random(4) < 3; print "$op ", join(" ", @n), "\n"; $max += @n; } elsif ($what < 12) { if ($max < 10000) { next; } my $n = 1; my $op = (qw(delete reduce))[$what % 2]; $n++ while random(4) < 3; print "$op $n\n"; $max -= $n; if ($max < 0) { $max = 0; } } elsif ($what < 16) { my $i = random($max); $i++ while random(4) < 2; if ($what % 2 == 0) { my $n = $serial++; print "set $i $n\n"; if ($i >= $max) { $max = $i + 1; } } else { print "get $i\n"; } } elsif ($what < 20) { my $op = (qw(first last))[$what % 2]; print "$op\n" if $max; } elsif (random(10) == 0) { print "show\n"; } else { next; } $lines--; } print "show\n";