X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Fdata%2Fdata-in.at;h=72f1515ea2a6a15629693e92479cb5c53b04dd47;hb=c1b1583b96cc05a2bf9f3f6d01bbfa063fafb253;hp=d27b7fe86ee2433fc6d8899cd996c3441798f275;hpb=bbb073424738ac65571ee2e7ea6471c695881302;p=pspp diff --git a/tests/data/data-in.at b/tests/data/data-in.at index d27b7fe86e..72f1515ea2 100644 --- a/tests/data/data-in.at +++ b/tests/data/data-in.at @@ -1,24 +1,30 @@ dnl PSPP - a program for statistical analysis. dnl Copyright (C) 2017 Free Software Foundation, Inc. -dnl +dnl dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation, either version 3 of the License, or dnl (at your option) any later version. -dnl +dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. -dnl +dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . dnl AT_BANNER([data input (data-in)]) -m4_divert_push([PREPARE_TESTS]) -[data_in_prng () { - cat > my-rand.pl <<'EOF' +AT_SETUP([numeric input formats]) +AT_KEYWORDS([data-in slow]) +data_in_prng +AT_DATA([num-in.py], +[[#! /usr/bin/python3 + +import math +import re + # This random number generator and the test for it below are drawn # from Park and Miller, "Random Number Generators: Good Ones are Hard # to Come By", Communications of the ACM 31:10 (October 1988). It is @@ -26,132 +32,85 @@ m4_divert_push([PREPARE_TESTS]) # real significand, which includes systems that have 64-bit IEEE reals # (with 53-bit significand). The test should catch any systems for # which this is not true, in any case. +def my_rand(modulus): + global seed + a = 16807 + m = 2147483647 + tmp = a * seed + seed = tmp - m * (tmp // m) + return seed % modulus + +# Test the random number generator for reproducibility, +# then reset the seed +seed = 1 +for i in range(10000): + my_rand(1) +assert seed == 1043618065 +seed = 1 + +def permute_zeros(fraction, exponent): + frac_rep = "%f" % fraction + leading_zeros = len(frac_rep) - len(frac_rep.lstrip('0')) + trailing_zeros = len(re.search(r'(\.?0*)$', frac_rep).group(1)) + for i in range(leading_zeros + 1): + for j in range(trailing_zeros + 1): + trimmed = frac_rep[i:len(frac_rep) - j] + if trimmed == '.' or not trimmed: + continue + + permute_commas(trimmed, exponent) + +def permute_commas(frac_rep, exponent): + permute_dot_comma(frac_rep, exponent) + pos = my_rand(len(frac_rep) + 1) + frac_rep = "%s,%s" % (frac_rep[:pos], frac_rep[pos:]) + permute_dot_comma(frac_rep, exponent) + +def permute_dot_comma(frac_rep, exponent): + permute_exponent_syntax(frac_rep, exponent) + if ',' in frac_rep or '.' in frac_rep: + frac_rep = frac_rep.translate(str.maketrans('.,', ',.')) + permute_exponent_syntax(frac_rep, exponent) + +def permute_exponent_syntax(frac_rep, exponent): + if exponent == 0: + e = pick(('', 'e0', 'e-0', 'e+0', '-0', '+0')) + elif exponent > 0: + e = pick(("e%s" % exponent, "e+%s" % exponent, "+%s" % exponent)) + else: + abs_exp = -exponent + e = pick(("e-%s" % abs_exp, "e-%s" % abs_exp, "-%s" % abs_exp)) + permute_sign_and_affix(frac_rep, e) + +def permute_sign_and_affix(frac_rep, exp_rep): + for prefix in (pick(('', '$')), + pick(('-', '-$', '$-', '$-$')), + pick(('+', '+$', '$+', '$+$'))): + for suffix in ('', '%'): + permute_spaces(prefix + frac_rep + exp_rep + suffix) + +def permute_spaces(s): + fields = re.sub(r'([-+\$e%])', r' \1 ', s).split() + print(''.join(fields)) + + if len(fields) > 1: + pos = my_rand(len(fields) - 1) + 1 + print("%s %s" % (''.join(fields[:pos]), + ''.join(fields[pos:]))) + +def pick(choices): + return choices[my_rand(len(choices))] + +for number in (0, 1, .5, .015625, 123): + base_exp = math.floor(math.log10(number)) if number else 0 + for offset in range(-3, 4): + exponent = base_exp + offset + fraction = number / 10**offset + + permute_zeros(fraction, exponent) -our ($seed) = 1; -sub my_rand { - my ($modulo) = @_; - my ($a) = 16807; - my ($m) = 2147483647; - my ($tmp) = $a * $seed; - $seed = $tmp - $m * int ($tmp / $m); - return $seed % $modulo; -} -EOF - cat > test-my-rand.pl <<'EOF' -#! /usr/bin/perl -use strict; -use warnings; -do './my-rand.pl'; -my_rand (1) foreach 1...10000; -our $seed; -die $seed if $seed != 1043618065; -EOF -} -] -m4_divert_pop([PREPARE_TESTS]) - -AT_SETUP([numeric input formats]) -AT_KEYWORDS([data-in]) -data_in_prng -AT_CHECK([$PERL test-my-rand.pl]) -AT_DATA([num-in.pl], -[[#! /usr/bin/perl - -use POSIX; -use strict; -use warnings; - -do './my-rand.pl'; - -for my $number (0, 1, .5, .015625, 123) { - my ($base_exp) = floor ($number ? log10 ($number) : 0); - for my $offset (-3...3) { - my ($exponent) = $base_exp + $offset; - my ($fraction) = $number / 10**$offset; - - permute_zeros ($fraction, $exponent); - } -} - -sub permute_zeros { - my ($fraction, $exponent) = @_; - - my ($frac_rep) = sprintf ("%f", $fraction); - my ($leading_zeros) = length (($frac_rep =~ /^(0*)/)[0]); - my ($trailing_zeros) = length (($frac_rep =~ /(\.?0*)$/)[0]); - for my $i (0...$leading_zeros) { - for my $j (0...$trailing_zeros) { - my ($trimmed) = substr ($frac_rep, $i, - length ($frac_rep) - $i - $j); - next if $trimmed eq '.' || $trimmed eq ''; - - permute_commas ($trimmed, $exponent); - } - } -} - -sub permute_commas { - my ($frac_rep, $exponent) = @_; - permute_dot_comma ($frac_rep, $exponent); - my ($pos) = int (my_rand (length ($frac_rep) + 1)); - $frac_rep = substr ($frac_rep, 0, $pos) . "," . substr ($frac_rep, $pos); - permute_dot_comma ($frac_rep, $exponent); -} - -sub permute_dot_comma { - my ($frac_rep, $exponent) = @_; - permute_exponent_syntax ($frac_rep, $exponent); - if ($frac_rep =~ /[,.]/) { - $frac_rep =~ tr/.,/,./; - permute_exponent_syntax ($frac_rep, $exponent); - } -} - -sub permute_exponent_syntax { - my ($frac_rep, $exponent) = @_; - my (@exp_reps); - if ($exponent == 0) { - @exp_reps = pick ('', 'e0', 'e-0', 'e+0', '-0', '+0'); - } elsif ($exponent > 0) { - @exp_reps = pick ("e$exponent", "e+$exponent", "+$exponent"); - } else { - my ($abs_exp) = -$exponent; - @exp_reps = pick ("e-$abs_exp", , "e-$abs_exp", "-$abs_exp"); - } - permute_sign_and_affix ($frac_rep, $_) foreach @exp_reps; -} - -sub permute_sign_and_affix { - my ($frac_rep, $exp_rep) = @_; - for my $prefix (pick ('', '$'), - pick ('-', '-$', '$-', '$-$'), - pick ('+', '+$', '$+', '$+$')) { - for my $suffix ('', '%') { - permute_spaces ("$prefix$frac_rep$exp_rep$suffix"); - } - } -} - -sub permute_spaces { - my ($s) = @_; - $s =~ s/([-+\$e%])/ $1 /g; - my (@fields) = split (' ', $s); - print join ('', @fields), "\n"; - - if ($#fields > 0) { - my ($pos) = int (my_rand ($#fields)) + 1; - print join ('', @fields[0...$pos - 1]); - print " "; - print join ('', @fields[$pos...$#fields]); - print "\n"; - } -} - -sub pick { - return $_[int (my_rand ($#_ + 1))]; -} ]]) -AT_CHECK([$PERL num-in.pl > num-in.data]) +AT_CHECK([$PYTHON3 num-in.py > num-in.data]) AT_DATA([num-in.sps], [dnl SET ERRORS=NONE. SET MXERRS=10000000. @@ -247,7 +206,7 @@ title 'Test use of big numbers'. data list file='bignum.txt'/BIGNUM 1-40. list. -*** Do the nonportable output for fun. +*** Do the nonportable output for fun. descriptives BIGNUM. ]) AT_CHECK([pspp -o pspp.csv bignum.sps], [0], [ignore]) @@ -255,8 +214,7 @@ AT_CLEANUP AT_SETUP([DATE input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py date d-m-y]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py date d-m-y]) AT_FAIL_IF([test ! -s date.sps || test ! -s date.input || test ! -s expout]) AT_CHECK([pspp -O format=csv date.sps]) AT_CHECK([cat date.output], [0], [expout]) @@ -264,8 +222,7 @@ AT_CLEANUP AT_SETUP([ADATE input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py adate m-d-y]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py adate m-d-y]) AT_FAIL_IF([test ! -s adate.sps || test ! -s adate.input || test ! -s expout]) AT_CHECK([pspp -O format=csv adate.sps]) AT_CHECK([cat adate.output], [0], [expout]) @@ -273,8 +230,7 @@ AT_CLEANUP AT_SETUP([EDATE input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py edate d-m-y]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py edate d-m-y]) AT_FAIL_IF([test ! -s edate.sps || test ! -s edate.input || test ! -s expout]) AT_CHECK([pspp -O format=csv edate.sps]) AT_CHECK([cat edate.output], [0], [expout]) @@ -282,8 +238,7 @@ AT_CLEANUP AT_SETUP([JDATE input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py jdate j]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py jdate j]) AT_FAIL_IF([test ! -s jdate.sps || test ! -s jdate.input || test ! -s expout]) AT_CHECK([pspp -O format=csv jdate.sps]) AT_CHECK([cat jdate.output], [0], [expout]) @@ -291,8 +246,7 @@ AT_CLEANUP AT_SETUP([SDATE input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py sdate y-m-d]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py sdate y-m-d]) AT_FAIL_IF([test ! -s sdate.sps || test ! -s sdate.input || test ! -s expout]) AT_CHECK([pspp -O format=csv sdate.sps]) AT_CHECK([cat sdate.output], [0], [expout]) @@ -300,8 +254,7 @@ AT_CLEANUP AT_SETUP([QYR input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py qyr qQy]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py qyr qQy]) AT_FAIL_IF([test ! -s qyr.sps || test ! -s qyr.input || test ! -s expout]) AT_CHECK([pspp -O format=csv qyr.sps]) AT_CHECK([cat qyr.output], [0], [expout]) @@ -309,8 +262,7 @@ AT_CLEANUP AT_SETUP([MOYR input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py moyr m-y]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py moyr m-y]) AT_FAIL_IF([test ! -s moyr.sps || test ! -s moyr.input || test ! -s expout]) AT_CHECK([pspp -O format=csv moyr.sps]) AT_CHECK([cat moyr.output], [0], [expout]) @@ -318,17 +270,15 @@ AT_CLEANUP AT_SETUP([WKYR input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py wkyr wWy]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py wkyr wWy]) AT_FAIL_IF([test ! -s wkyr.sps || test ! -s wkyr.input || test ! -s expout]) AT_CHECK([pspp -O format=csv wkyr.sps]) AT_CHECK([cat wkyr.output], [0], [expout]) AT_CLEANUP AT_SETUP([DATETIME input format]) -AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py datetime "d-m-y +H:M" "d-m-y +H:M:S"]) +AT_KEYWORDS([data-in slow]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py datetime "d-m-y +H:M" "d-m-y +H:M:S"]) AT_FAIL_IF([test ! -s datetime.sps || test ! -s datetime.input || \ test ! -s expout]) AT_CHECK([pspp -O format=csv datetime.sps]) @@ -336,9 +286,8 @@ AT_CHECK([cat datetime.output], [0], [expout]) AT_CLEANUP AT_SETUP([YMDHMS input format]) -AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-date-input.py ymdhms "y-m-d +H:M" "y-m-d +H:M:S"]) +AT_KEYWORDS([data-in slow]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-date-input.py ymdhms "y-m-d +H:M" "y-m-d +H:M:S"]) AT_FAIL_IF([test ! -s ymdhms.sps || test ! -s ymdhms.input || \ test ! -s expout]) AT_CHECK([pspp -O format=csv ymdhms.sps]) @@ -347,8 +296,7 @@ AT_CLEANUP AT_SETUP([MTIME input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-time-input.py mtime +M:S]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-time-input.py mtime +M:S]) AT_FAIL_IF([test ! -s mtime.sps || test ! -s mtime.input || test ! -s expout]) AT_CHECK([pspp -O format=csv mtime.sps]) AT_CHECK([cat mtime.output], [0], [expout]) @@ -356,8 +304,7 @@ AT_CLEANUP AT_SETUP([TIME input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-time-input.py time +H:M +H:M:S]) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-time-input.py time +H:M +H:M:S]) AT_FAIL_IF([test ! -s time.sps || test ! -s time.input || test ! -s expout]) AT_CHECK([pspp -O format=csv time.sps]) AT_CHECK([cat time.output], [0], [expout]) @@ -365,15 +312,30 @@ AT_CLEANUP AT_SETUP([DTIME input format]) AT_KEYWORDS([data-in]) -AT_SKIP_IF([test "$PYTHON" = none]) -AT_CHECK([$PYTHON $top_srcdir/tests/data/test-time-input.py dtime '+D H:M' '+D H:M:S']) +AT_CHECK([$PYTHON3 $top_srcdir/tests/data/test-time-input.py dtime '+D H:M' '+D H:M:S']) AT_FAIL_IF([test ! -s dtime.sps || test ! -s dtime.input || test ! -s expout]) AT_CHECK([pspp -O format=csv dtime.sps]) AT_CHECK([cat dtime.output], [0], [expout]) AT_CLEANUP +m4_divert_push([PREPARE_TESTS]) +[number_lines_in_hex () { + $PYTHON3 -c ' +import sys +for i, line in enumerate(sys.stdin): + sys.stdout.write(" %04X %s" % (i, line)) +' +}] +m4_divert_pop([PREPARE_TESTS]) + + AT_SETUP([binary and hexadecimal input (IB, PIB, and PIBHEX formats)]) -AT_CHECK([$PERL -e 'print pack "n", $_ foreach 0...65535' > binhex-in.data]) +AT_KEYWORDS([slow]) +AT_CHECK([$PYTHON3 -c ' +import struct +import sys +for i in range(65536): + sys.stdout.buffer.write(struct.pack(">H", i))' > binhex-in.data]) AT_CHECK([[wc -c < binhex-in.data | sed 's/[ ]//g']], [0], [131072 ]) AT_DATA([binhex-in.sps], [dnl @@ -388,13 +350,18 @@ PRINT OUTFILE='binhex-in.out'/x (PIBHEX4) ' ' ib pib pibhex. EXECUTE. ]) AT_CHECK([gzip -cd < $top_srcdir/tests/data/binhex-in.expected.cmp.gz | \ - $PERL -pe "printf ' %04X ', $.-1" > expout]) + number_lines_in_hex > expout]) AT_CHECK([pspp -O format=csv binhex-in.sps], [0]) AT_CHECK([cat binhex-in.out], [0], [expout]) AT_CLEANUP AT_SETUP([BCD input (P and PK formats)]) -AT_CHECK([$PERL -e 'print pack "n", $_ foreach 0...65535' > bcd-in.data]) +AT_KEYWORDS([slow]) +AT_CHECK([$PYTHON3 -c ' +import struct +import sys +for i in range(65536): + sys.stdout.buffer.write(struct.pack(">H", i))' > bcd-in.data]) AT_CHECK([[wc -c < bcd-in.data | sed 's/[ ]//g']], [0], [131072 ]) AT_DATA([bcd-in.sps], [dnl @@ -408,13 +375,18 @@ PRINT OUTFILE='bcd-in.out'/x (PIBHEX4) ' ' P PK. EXECUTE. ]) AT_CHECK([gzip -cd < $top_srcdir/tests/data/bcd-in.expected.cmp.gz | \ - $PERL -pe "printf ' %04X ', $.-1" > expout]) + number_lines_in_hex > expout]) AT_CHECK([pspp -O format=csv bcd-in.sps]) AT_CHECK([cat bcd-in.out], [0], [expout]) AT_CLEANUP AT_SETUP([legacy input (N and Z formats)]) -AT_CHECK([$PERL -e 'print pack "n", $_ foreach 0...65535' > legacy-in.data]) +AT_KEYWORDS([slow]) +AT_CHECK([$PYTHON3 -c ' +import struct +import sys +for i in range(65536): + sys.stdout.buffer.write(struct.pack(">H", i))' > legacy-in.data]) AT_CHECK([[wc -c < legacy-in.data | sed 's/[ ]//g']], [0], [131072 ]) AT_DATA([legacy-in.sps], [dnl @@ -428,7 +400,7 @@ PRINT OUTFILE='legacy-in.out'/x (PIBHEX4) ' ' N Z. EXECUTE. ]) AT_CHECK([gzip -cd < $top_srcdir/tests/data/legacy-in.expected.cmp.gz | \ - $PERL -pe "printf ' %04X ', $.-1" > expout]) + number_lines_in_hex > expout]) AT_CHECK([pspp -O format=csv legacy-in.sps]) AT_CHECK([cat legacy-in.out], [0], [expout]) AT_CLEANUP