X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=perl-module%2Ft%2FPspp.t;h=b8b76d3c35d43b604deea796b4b964a35b9bb5d6;hb=refs%2Fheads%2Fctables10;hp=ff0e4d1e0dac22d277a28f95d606398bbb637485;hpb=4ed307e3ae98c362d182bc5c8b2d79f4252ff1b8;p=pspp diff --git a/perl-module/t/Pspp.t b/perl-module/t/Pspp.t index ff0e4d1e0d..b8b76d3c35 100644 --- a/perl-module/t/Pspp.t +++ b/perl-module/t/Pspp.t @@ -1,14 +1,34 @@ -# -*-perl-*- -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl PSPP.t' +## -*-perl-*- + +## PSPP - a program for statistical analysis. +## Copyright (C) 2019, 2020 Free Software Foundation, Inc. +## +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . + +# Before `make install' is performed this script should be runnable +# with `make test' as long as libpspp-core-$VERSION.so is in +# LD_LIBRARY_PATH. After `make install' it should work as `perl +# PSPP.t' ######################### # change 'tests => 1' to 'tests => last_test_to_print'; -use Test::More tests => 31; +use Test::More tests => 37; use Text::Diff; use File::Temp qw/ tempfile tempdir /; +use Memory::Usage; BEGIN { use_ok('PSPP') }; ######################### @@ -20,6 +40,13 @@ sub compare return ! diff ("$file", \$pattern); } +my $pspp_cmd = $ENV{PSPP_TEST_CMD}; + +if ( ! $pspp_cmd) +{ + $pspp_cmd="pspp"; +} + sub run_pspp_syntax { my $tempdir = shift; @@ -31,7 +58,7 @@ sub run_pspp_syntax print FH "$syntax"; close (FH); - system ("cd $tempdir; pspp -o raw-ascii $syntaxfile"); + system ("cd $tempdir; $pspp_cmd -o pspp.csv $syntaxfile"); } sub run_pspp_syntax_cmp @@ -43,7 +70,7 @@ sub run_pspp_syntax_cmp run_pspp_syntax ($tempdir, $syntax); - my $diff = diff ("$tempdir/pspp.list", \$result); + my $diff = diff ("$tempdir/pspp.csv", \$result); if ( ! ($diff eq "")) { @@ -60,25 +87,30 @@ sub run_pspp_syntax_cmp { my $d = PSPP::Dict->new(); ok (ref $d, "Dictionary Creation"); + ok ($d->get_var_cnt () == 0); $d->set_label ("My Dictionary"); - $d->set_documents ("These Documents"); + $d->add_document ("These Documents"); # Tests for variable creation my $var0 = PSPP::Var->new ($d, "le"); ok (!ref $var0, "Trap illegal variable name"); + ok ($d->get_var_cnt () == 0); $var0 = PSPP::Var->new ($d, "legal"); ok (ref $var0, "Accept legal variable name"); + ok ($d->get_var_cnt () == 1); my $var1 = PSPP::Var->new ($d, "legal"); ok (!ref $var1, "Trap duplicate variable name"); + ok ($d->get_var_cnt () == 1); - $var1 = PSPP::Var->new ($d, "money", - (fmt=>PSPP::Fmt::DOLLAR, + $var1 = PSPP::Var->new ($d, "money", + (fmt=>PSPP::Fmt::DOLLAR, width=>4, decimals=>2) ); ok (ref $var1, "Accept valid format"); + ok ($d->get_var_cnt () == 2); $d->set_weight ($var1); @@ -103,20 +135,20 @@ sub run_pspp_syntax_cmp my $d = PSPP::Dict->new(); PSPP::Var->new ($d, "id", ( - fmt=>PSPP::Fmt::F, - width=>2, + fmt=>PSPP::Fmt::F, + width=>2, decimals=>0 ) ); PSPP::Var->new ($d, "name", ( - fmt=>PSPP::Fmt::A, - width=>20, + fmt=>PSPP::Fmt::A, + width=>20, ) ); - $d->set_documents ("This should not appear"); + $d->add_document ("This should not appear"); $d->clear_documents (); $d->add_document ("This is a document line"); @@ -148,8 +180,8 @@ sub run_pspp_syntax_cmp my $res = $sysfile->append_case ( [21, "wheelbarrow"]); ok ($res, "Append Case 2"); - # Don't close. We want to test that the destructor does that - # automatically + # Don't close. We want to test that the destructor does that + # automatically } ok (-s "$tempfile", "existance2"); @@ -161,58 +193,46 @@ sub run_pspp_syntax_cmp DISPLAY DOCUMENTS. LIST. SYNTAX -1.1 DISPLAY. -+--------+-------------------------------------------+--------+ -|Variable|Description |Position| -#========#===========================================#========# -|id |Format: F2.0 | 1| -| |Measure: Scale | | -| |Display Alignment: Right | | -| |Display Width: 8 | | -+--------+-------------------------------------------+--------+ -|name |Format: A20 | 2| -| |Measure: Nominal | | -| |Display Alignment: Left | | -| |Display Width: 20 | | -+--------+-------------------------------------------+--------+ - -File label: -This is the file label - -Documents in the active file: +Table: Variables +Name,Position,Measurement Level,Role,Width,Alignment,Print Format,Write Format +id,1,Scale,Input,8,Right,F2.0,F2.0 +name,2,Nominal,Input,20,Left,A20,A20 -This is a document line +Table: File Label +Label,This is the file label -id name --- -------------------- -21 wheelbarrow +Table: Documents +This is a document line +Table: Data List +id,name +21,wheelbarrow RESULT } - # Now do some tests to make sure all the variable parameters + # Now do some tests to make sure all the variable parameters # can be written properly. { my $tempdir = tempdir( CLEANUP => 1 ); - my $tempfile = "$tempdir/testfile.sav"; + my $tempfile = "$tempdir/testfile.sav"; my $dict = PSPP::Dict->new(); ok (ref $dict, "Dictionary Creation 2"); - my $int = PSPP::Var->new ($dict, "integer", + my $int = PSPP::Var->new ($dict, "integer", (width=>8, decimals=>0) ); $int->set_label ("My Integer"); - + $int->add_value_label (99, "Silly"); $int->clear_value_labels (); $int->add_value_label (0, "Zero"); $int->add_value_label (1, "Unity"); $int->add_value_label (2, "Duality"); - my $str = PSPP::Var->new ($dict, "string", + my $str = PSPP::Var->new ($dict, "string", (fmt=>PSPP::Fmt::A, width=>8) ); @@ -223,15 +243,13 @@ RESULT $str->set_missing_values ("this", "that"); - my $longstr = PSPP::Var->new ($dict, "longstring", + my $longstr = PSPP::Var->new ($dict, "longstring", (fmt=>PSPP::Fmt::A, width=>9) ); $longstr->set_label ("My Long String"); my $re = $longstr->add_value_label ("xxx", "xfoo"); - ok (($re == 0), "Long strings cant have labels"); - - ok ($PSPP::errstr eq "Cannot add label to a long string variable", "Error msg"); + ok ($re, "Value label for long string"); $int->set_missing_values (9, 99); @@ -244,45 +262,27 @@ RESULT GET FILE='$tempfile'. DISPLAY DICTIONARY. SYNTAX -1.1 DISPLAY. -+----------+-----------------------------------------+--------+ -|Variable |Description |Position| -#==========#=========================================#========# -|integer |My Integer | 1| -| |Format: F8.0 | | -| |Measure: Scale | | -| |Display Alignment: Right | | -| |Display Width: 8 | | -| |Missing Values: 9; 99 | | -| +-----+-----------------------------------+ | -| | 0|Zero | | -| | 1|Unity | | -| | 2|Duality | | -+----------+-----+-----------------------------------+--------+ -|string |My String | 2| -| |Format: A8 | | -| |Measure: Nominal | | -| |Display Alignment: Left | | -| |Display Width: 8 | | -| |Missing Values: "this "; "that " | | -| +-----+-----------------------------------+ | -| | xx|foo | | -| | yy|bar | | -+----------+-----+-----------------------------------+--------+ -|longstring|My Long String | 3| -| |Format: A9 | | -| |Measure: Nominal | | -| |Display Alignment: Left | | -| |Display Width: 9 | | -+----------+-----------------------------------------+--------+ - +Table: Variables +Name,Position,Label,Measurement Level,Role,Width,Alignment,Print Format,Write Format,Missing Values +integer,1,My Integer,Scale,Input,8,Right,F8.0,F8.0,9; 99 +string,2,My String,Nominal,Input,8,Left,A8,A8,"""this ""; ""that """ +longstring,3,My Long String,Nominal,Input,9,Left,A9,A9, + +Table: Value Labels +Variable Value,,Label +My Integer,0,Zero +,1,Unity +,2,Duality +My String,xx,foo +,yy,bar +My Long String,xxx,xfoo RESULT } } -sub generate_sav_file +sub generate_sav_file { my $filename = shift; my $tempdir = shift; @@ -293,7 +293,7 @@ begin data. 1111 One 1 1/1/1 1 1/1/1+01:01 2222 Two 2 2/2/2 2 2/2/2+02:02 3333 Three 3 3/3/3 3 3/3/3+03:03 -. . . . . +. . . . . . 5555 Five 5 5/5/5 5 5/5/5+05:05 end data. @@ -314,6 +314,12 @@ add value labels /string '1111' 'ones' '2222' 'twos' '3333' 'threes' /numeric 1 'Unity' 2 'Duality' 3 'Thripality'. +variable attribute + variables = numeric + attribute=colour[1]('blue') colour[2]('pink') colour[3]('violet') + attribute=size('large') nationality('foreign'). + + save outfile='$filename'. SYNTAX @@ -334,8 +340,8 @@ RESULT PSPP::Var->new ($d, "id", ( - fmt=>PSPP::Fmt::F, - width=>2, + fmt=>PSPP::Fmt::F, + width=>2, decimals=>0 ) ); @@ -367,18 +373,18 @@ RESULT my $label = $var->get_label (); print MYFILE "Variable $v is \"$name\", label is \"$label\"\n"; - + my $vl = $var->get_value_labels (); print MYFILE "Value Labels:\n"; - print MYFILE "$_ => $vl->{$_}\n" for keys %$vl; + print MYFILE "$_ => $vl->{$_}\n" for (sort keys %$vl); } - while (my $c = $sf->get_next_case () ) + while (my @c = $sf->get_next_case () ) { for ($v = 0; $v < $dict->get_var_cnt(); $v++) { - print MYFILE "val$v: \"@$c[$v]\"\n"; + print MYFILE "val$v: \"$c[$v]\"\n"; } print MYFILE "\n"; } @@ -388,16 +394,16 @@ RESULT ok (compare ("$tempdir/out.txt", < threes 1111 => ones 2222 => twos +3333 => threes Variable 1 is "longstring", label is "A Long String Variable" Value Labels: Variable 2 is "numeric", label is "A Numeric Variable" Value Labels: 1 => Unity -3 => Thripality 2 => Duality +3 => Thripality Variable 3 is "date", label is "A Date Variable" Value Labels: Variable 4 is "dollar", label is "A Dollar Variable" @@ -456,9 +462,9 @@ EOF my $output = PSPP::Sysfile->new ("$tempdir/out.sav", $dict); - while (my $c = $input->get_next_case () ) + while (my (@c) = $input->get_next_case () ) { - $output->append_case ($c); + $output->append_case (\@c); } $output->close (); @@ -473,7 +479,7 @@ EOF SYNTAX - system ("cp $tempdir/pspp.list $tempdir/in.txt"); + system ("cp $tempdir/pspp.csv $tempdir/in.txt"); run_pspp_syntax ($tempdir, <get_dict (); - my $c = $sf->get_next_case (); + my (@c) = $sf->get_next_case (); my $var = $dict->get_var (0); - my $val = @$c[0]; + my $val = $c[0]; my $formatted = PSPP::format_value ($val, $var); my $str = gmtime ($val - PSPP::PERL_EPOCH); print "Formatted string is \"$formatted\"\n"; @@ -528,12 +534,12 @@ SYNTAX ok ( !ref $sf, "Returns undef on opening failure"); - ok ("$PSPP::errstr" eq "Error opening \"$tempdir/no-such-file.sav\" for reading as a system file: No such file or directory.", + ok ("$PSPP::errstr" eq "An error occurred while opening `$tempdir/no-such-file.sav': No such file or directory.", "Error string on open failure"); } -# Missing value tests. +# Missing value tests. { my $tempdir = tempdir( CLEANUP => 1 ); @@ -544,29 +550,77 @@ SYNTAX my $dict = $sf->get_dict (); - my $c = $sf->get_next_case (); + my (@c) = $sf->get_next_case (); my $stringvar = $dict->get_var (0); my $numericvar = $dict->get_var (2); - my $val = @$c[0]; + my $val = $c[0]; ok ( !PSPP::value_is_missing ($val, $stringvar), "Missing Value Negative String"); - $val = @$c[2]; + $val = $c[2]; ok ( !PSPP::value_is_missing ($val, $numericvar), "Missing Value Negative Num"); - $c = $sf->get_next_case (); - $c = $sf->get_next_case (); + @c = $sf->get_next_case (); + @c = $sf->get_next_case (); - $val = @$c[0]; + $val = $c[0]; ok ( PSPP::value_is_missing ($val, $stringvar), "Missing Value Positive"); - $c = $sf->get_next_case (); - $val = @$c[2]; + @c = $sf->get_next_case (); + $val = $c[2]; ok ( PSPP::value_is_missing ($val, $numericvar), "Missing Value Positive SYS"); - $c = $sf->get_next_case (); - $val = @$c[2]; + @c = $sf->get_next_case (); + $val = $c[2]; ok ( PSPP::value_is_missing ($val, $numericvar), "Missing Value Positive Num"); } + + +#Test reading of custom attributes +{ + my $tempdir = tempdir( CLEANUP => 1 ); + + generate_sav_file ("$tempdir/in.sav", "$tempdir"); + + my $sf = PSPP::Reader->open ("$tempdir/in.sav"); + + my $dict = $sf->get_dict (); + + my $var = $dict->get_var_by_name ("numeric"); + + my $attr = $var->get_attributes (); + + open (MYFILE, ">$tempdir/out.txt"); + + foreach $k (sort (keys (%$attr))) + { + my $ll = $attr->{$k}; + print MYFILE "$k =>"; + print MYFILE map "$_\n", join ', ', @$ll; + } + + close (MYFILE); + + ok (compare ("$tempdir/out.txt", <<'EOF'), "Custom Attributes"); +$@Role =>0 +colour =>blue, pink, violet +nationality =>foreign +size =>large +EOF +} + + +# Test of the get_case_cnt function +{ + my $tempdir = tempdir( CLEANUP => 1 ); + + generate_sav_file ("$tempdir/in.sav", "$tempdir"); + + my $sf = PSPP::Reader->open ("$tempdir/in.sav"); + + my $n = $sf->get_case_cnt (); + + ok ($n == 5, "Case count"); +}