X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=perl-module%2Ft%2FPspp.t;h=d93a27020b7158f1fefbe566b854635c6e67d622;hb=b401615e6db40bf74394839b96600afe3a868a95;hp=3388120acd0282f67e33d86523183b4cbb97d4e9;hpb=66b1b93cf6ca53c86199e88e5972f3017c56314c;p=pspp-builds.git diff --git a/perl-module/t/Pspp.t b/perl-module/t/Pspp.t index 3388120a..d93a2702 100644 --- a/perl-module/t/Pspp.t +++ b/perl-module/t/Pspp.t @@ -1,32 +1,58 @@ # -*-perl-*- -# Before `make install' is performed this script should be runnable with -# `make test'. After `make install' it should work as `perl PSPP.t' +# 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 => 19; +use Test::More tests => 36; use Text::Diff; use File::Temp qw/ tempfile tempdir /; BEGIN { use_ok('PSPP') }; ######################### +sub compare +{ + my $file = shift; + my $pattern = shift; + return ! diff ("$file", \$pattern); +} + +my $pspp_cmd = $ENV{PSPP_TEST_CMD}; + +if ( ! $pspp_cmd) +{ + $pspp_cmd="pspp"; +} + sub run_pspp_syntax { my $tempdir = shift; my $syntax = shift; - my $result = shift; + my $syntaxfile = "$tempdir/foo.sps"; open (FH, ">$syntaxfile"); print FH "$syntax"; close (FH); - system ("cd $tempdir; pspp -o raw-ascii $syntaxfile"); + system ("cd $tempdir; $pspp_cmd -o pspp.csv $syntaxfile"); +} - my $diff = diff ("$tempdir/pspp.list", \$result); +sub run_pspp_syntax_cmp +{ + my $tempdir = shift; + my $syntax = shift; + + my $result = shift; + + run_pspp_syntax ($tempdir, $syntax); + + my $diff = diff ("$tempdir/pspp.csv", \$result); if ( ! ($diff eq "")) { @@ -37,31 +63,36 @@ sub run_pspp_syntax } -# Insert your test code below, the Test::More module is use()ed here so read +# Insert your test code below, the Test::More module is used here so read # its man page ( perldoc Test::More ) for help writing this test script. { 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, width=>4, decimals=>2) ); ok (ref $var1, "Accept valid format"); + ok ($d->get_var_cnt () == 2); $d->set_weight ($var1); @@ -99,7 +130,7 @@ sub run_pspp_syntax ) ); - $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"); @@ -136,7 +167,7 @@ sub run_pspp_syntax } ok (-s "$tempfile", "existance2"); - ok (run_pspp_syntax ($tempdir, <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); @@ -223,44 +247,365 @@ RESULT $sysfile->close (); - ok (run_pspp_syntax ($tempdir, < 1 ); + my $tempfile = "$tempdir/testfile.sav"; + my $sysfile ; + + { + my $d = PSPP::Dict->new(); + + PSPP::Var->new ($d, "id", + ( + fmt=>PSPP::Fmt::F, + width=>2, + decimals=>0 + ) + ); + + $sysfile = PSPP::Sysfile->new ("$tempfile", $d); + } + + my $res = $sysfile->append_case ([3]); + + ok ($res, "Dictionary survives sysfile"); +} + + +# Basic reader test +{ + 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 (); + + open (MYFILE, ">$tempdir/out.txt"); + for ($v = 0 ; $v < $dict->get_var_cnt() ; $v++) + { + my $var = $dict->get_var ($v); + my $name = $var->get_name (); + 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; + } + + 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 "\n"; + } + + close (MYFILE); + +ok (compare ("$tempdir/out.txt", < threes +1111 => ones +2222 => twos +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 +Variable 3 is "date", label is "A Date Variable" +Value Labels: +Variable 4 is "dollar", label is "A Dollar Variable" +Value Labels: +Variable 5 is "datetime", label is "A Datetime Variable" +Value Labels: +val0: "1111 " +val1: "One " +val2: "1" +val3: "13197686400" +val4: "1" +val5: "13197690060" + +val0: "2222 " +val1: "Two " +val2: "2" +val3: "13231987200" +val4: "2" +val5: "13231994520" + +val0: "3333 " +val1: "Three " +val2: "3" +val3: "13266028800" +val4: "3" +val5: "13266039780" + +val0: ". " +val1: ". " +val2: "" +val3: "" +val4: "" +val5: "" + +val0: "5555 " +val1: "Five " +val2: "5" +val3: "13334630400" +val4: "5" +val5: "13334648700" + +EOF + +} + + +# Check that we can stream one file into another +{ + my $tempdir = tempdir( CLEANUP => 1 ); + + generate_sav_file ("$tempdir/in.sav", "$tempdir"); + + my $input = PSPP::Reader->open ("$tempdir/in.sav"); + + my $dict = $input->get_dict (); + + my $output = PSPP::Sysfile->new ("$tempdir/out.sav", $dict); + + while (my (@c) = $input->get_next_case () ) + { + $output->append_case (\@c); + } + + $output->close (); + + + #Check the two files are the same (except for metadata) + + run_pspp_syntax ($tempdir, < 1 ); + + run_pspp_syntax ($tempdir, <open ("$tempdir/dd.sav"); + + my $dict = $sf->get_dict (); + + my (@c) = $sf->get_next_case (); + + my $var = $dict->get_var (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"; + ok ( $formatted eq "11-SEP-2001 08:20", "format_value function"); + ok ( $str eq "Tue Sep 11 08:20:00 2001", "Perl representation of time"); +} + + +# Check that attempting to open a non-existent file results in an error +{ + my $tempdir = tempdir( CLEANUP => 1 ); + + unlink ("$tempdir/no-such-file.sav"); + + my $sf = PSPP::Reader->open ("$tempdir/no-such-file.sav"); + + 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.", + "Error string on open failure"); +} + + +# Missing value tests. +{ + 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 (@c) = $sf->get_next_case (); + + my $stringvar = $dict->get_var (0); + my $numericvar = $dict->get_var (2); + my $val = $c[0]; + + ok ( !PSPP::value_is_missing ($val, $stringvar), "Missing Value Negative String"); + + $val = $c[2]; + + ok ( !PSPP::value_is_missing ($val, $numericvar), "Missing Value Negative Num"); + + @c = $sf->get_next_case (); + @c = $sf->get_next_case (); + + $val = $c[0]; + ok ( PSPP::value_is_missing ($val, $stringvar), "Missing Value Positive"); + + @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]; + 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 (keys %$attr) + { + my $ll = $attr->{$k}; + print MYFILE "$k =>"; + print MYFILE map "$_\n", join ', ', @$ll; + } + + close (MYFILE); + + ok (compare ("$tempdir/out.txt", <blue, pink, violet +nationality =>foreign +size =>large +EOF + +}