perl-module: Remove test for memory usage.
[pspp] / perl-module / t / Pspp.t
index fe141514cc34921aade4f7c17c266d550538cc2f..b8b76d3c35d43b604deea796b4b964a35b9bb5d6 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
+
+# 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 => 32;
+use Test::More tests => 37;
 use Text::Diff;
 use File::Temp qw/ tempfile tempdir /;
+use Memory::Usage;
 BEGIN { use_ok('PSPP') };
 
 #########################
@@ -38,7 +58,7 @@ sub run_pspp_syntax
     print FH "$syntax";
     close (FH);
 
-    system ("cd $tempdir; $pspp_cmd -o raw-ascii $syntaxfile");
+    system ("cd $tempdir; $pspp_cmd -o pspp.csv $syntaxfile");
 }
 
 sub run_pspp_syntax_cmp
@@ -50,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 ""))
     {
@@ -67,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);
 
@@ -110,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");
 
@@ -155,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");
 
@@ -168,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) );
 
 
@@ -230,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);
 
@@ -251,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;
@@ -300,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.
 
@@ -347,8 +340,8 @@ RESULT
 
        PSPP::Var->new ($d, "id",
                        (
-                        fmt=>PSPP::Fmt::F, 
-                        width=>2, 
+                        fmt=>PSPP::Fmt::F,
+                        width=>2,
                         decimals=>0
                         )
                        );
@@ -380,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";
  }
@@ -401,16 +394,16 @@ RESULT
 ok (compare ("$tempdir/out.txt", <<EOF), "Basic reader operation");
 Variable 0 is "string", label is "A Short String Variable"
 Value Labels:
-3333     => 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"
@@ -469,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 ();
@@ -486,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, <<SYNTAX);
  get file='$tempdir/out.sav'.
@@ -494,8 +487,8 @@ SYNTAX
  list.
 
 SYNTAX
- ok (! diff ("$tempdir/pspp.list", "$tempdir/in.txt"), "Streaming of files");
+
+ ok (! diff ("$tempdir/pspp.csv", "$tempdir/in.txt"), "Streaming of files");
 }
 
 
@@ -519,10 +512,10 @@ SYNTAX
 
  my $dict = $sf->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";
@@ -541,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 );
 
@@ -557,30 +550,30 @@ 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");
 }
 
@@ -601,7 +594,7 @@ SYNTAX
 
     open (MYFILE, ">$tempdir/out.txt");
 
-    foreach $k (keys %$attr)
+    foreach $k (sort (keys (%$attr)))
     {
        my $ll = $attr->{$k};
        print MYFILE "$k =>";
@@ -610,10 +603,24 @@ SYNTAX
 
     close (MYFILE);
 
-    ok (compare ("$tempdir/out.txt", <<EOF), "Custom Attributes");
+    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");
 }