2 # Before `make install' is performed this script should be runnable
3 # with `make test' as long as libpspp-core-$VERSION.so is in
4 # LD_LIBRARY_PATH. After `make install' it should work as `perl
7 #########################
9 # change 'tests => 1' to 'tests => last_test_to_print';
11 use Test::More tests => 37;
13 use File::Temp qw/ tempfile tempdir /;
14 BEGIN { use_ok('PSPP') };
16 #########################
22 return ! diff ("$file", \$pattern);
25 my $pspp_cmd = $ENV{PSPP_TEST_CMD};
37 my $syntaxfile = "$tempdir/foo.sps";
39 open (FH, ">$syntaxfile");
43 system ("cd $tempdir; $pspp_cmd -o pspp.csv $syntaxfile");
46 sub run_pspp_syntax_cmp
53 run_pspp_syntax ($tempdir, $syntax);
55 my $diff = diff ("$tempdir/pspp.csv", \$result);
66 # Insert your test code below, the Test::More module is used here so read
67 # its man page ( perldoc Test::More ) for help writing this test script.
70 my $d = PSPP::Dict->new();
71 ok (ref $d, "Dictionary Creation");
72 ok ($d->get_var_cnt () == 0);
74 $d->set_label ("My Dictionary");
75 $d->add_document ("These Documents");
77 # Tests for variable creation
79 my $var0 = PSPP::Var->new ($d, "le");
80 ok (!ref $var0, "Trap illegal variable name");
81 ok ($d->get_var_cnt () == 0);
83 $var0 = PSPP::Var->new ($d, "legal");
84 ok (ref $var0, "Accept legal variable name");
85 ok ($d->get_var_cnt () == 1);
87 my $var1 = PSPP::Var->new ($d, "legal");
88 ok (!ref $var1, "Trap duplicate variable name");
89 ok ($d->get_var_cnt () == 1);
91 $var1 = PSPP::Var->new ($d, "money",
92 (fmt=>PSPP::Fmt::DOLLAR,
93 width=>4, decimals=>2) );
94 ok (ref $var1, "Accept valid format");
95 ok ($d->get_var_cnt () == 2);
97 $d->set_weight ($var1);
100 # Tests for system file creation
101 # Make sure a system file can be created
103 my $tempdir = tempdir( CLEANUP => 1 );
104 my $tempfile = "$tempdir/testfile.sav";
105 my $syntaxfile = "$tempdir/syntax.sps";
106 my $sysfile = PSPP::Sysfile->new ("$tempfile", $d);
107 ok (ref $sysfile, "Create sysfile object");
110 ok (-s "$tempfile", "Write system file");
115 # Make sure we can write cases to a file
117 my $d = PSPP::Dict->new();
118 PSPP::Var->new ($d, "id",
126 PSPP::Var->new ($d, "name",
133 $d->add_document ("This should not appear");
134 $d->clear_documents ();
135 $d->add_document ("This is a document line");
137 $d->set_label ("This is the file label");
139 # Check that we can write system files
141 my $tempdir = tempdir( CLEANUP => 1 );
142 my $tempfile = "$tempdir/testfile.sav";
143 my $sysfile = PSPP::Sysfile->new ("$tempfile", $d);
145 my $res = $sysfile->append_case ( [34, "frederick"]);
146 ok ($res, "Append Case");
148 $res = $sysfile->append_case ( [34, "frederick", "extra"]);
149 ok (!$res, "Appending Case with too many variables");
152 ok (-s "$tempfile", "existance");
155 # Check that sysfiles are closed properly
157 my $tempdir = tempdir( CLEANUP => 1 );
158 my $tempfile = "$tempdir/testfile.sav";
160 my $sysfile = PSPP::Sysfile->new ("$tempfile", $d);
162 my $res = $sysfile->append_case ( [21, "wheelbarrow"]);
163 ok ($res, "Append Case 2");
165 # Don't close. We want to test that the destructor does that
168 ok (-s "$tempfile", "existance2");
170 ok (run_pspp_syntax_cmp ($tempdir, <<SYNTAX, <<RESULT), "Check output");
172 GET FILE='$tempfile'.
178 Variable,Description,,Position
181 ,Display Alignment: Right,,
185 ,Display Alignment: Left,,
188 File label: This is the file label
190 Documents in the active dataset:
192 This is a document line
202 # Now do some tests to make sure all the variable parameters
203 # can be written properly.
206 my $tempdir = tempdir( CLEANUP => 1 );
207 my $tempfile = "$tempdir/testfile.sav";
208 my $dict = PSPP::Dict->new();
209 ok (ref $dict, "Dictionary Creation 2");
211 my $int = PSPP::Var->new ($dict, "integer",
212 (width=>8, decimals=>0) );
214 $int->set_label ("My Integer");
216 $int->add_value_label (99, "Silly");
217 $int->clear_value_labels ();
218 $int->add_value_label (0, "Zero");
219 $int->add_value_label (1, "Unity");
220 $int->add_value_label (2, "Duality");
222 my $str = PSPP::Var->new ($dict, "string",
223 (fmt=>PSPP::Fmt::A, width=>8) );
226 $str->set_label ("My String");
227 ok ($str->add_value_label ("xx", "foo"), "Value label for short string");
228 diag ($PSPP::errstr);
229 $str->add_value_label ("yy", "bar");
231 $str->set_missing_values ("this", "that");
233 my $longstr = PSPP::Var->new ($dict, "longstring",
234 (fmt=>PSPP::Fmt::A, width=>9) );
237 $longstr->set_label ("My Long String");
238 my $re = $longstr->add_value_label ("xxx", "xfoo");
239 ok ($re, "Value label for long string");
241 $int->set_missing_values (9, 99);
243 my $sysfile = PSPP::Sysfile->new ("$tempfile", $dict);
248 ok (run_pspp_syntax_cmp ($tempdir, <<SYNTAX, <<RESULT), "Check output 2");
249 GET FILE='$tempfile'.
252 Variable,Description,,Position
253 integer,My Integer,,1
256 ,Display Alignment: Right,,
258 ,Missing Values: 9; 99,,
265 ,Display Alignment: Left,,
267 ,"Missing Values: ""this ""; ""that """,,
270 longstring,My Long String,,3
273 ,Display Alignment: Left,,
282 sub generate_sav_file
284 my $filename = shift;
287 run_pspp_syntax_cmp ($tempdir, <<SYNTAX, <<RESULT);
288 data list notable list /string (a8) longstring (a12) numeric (f10) date (date11) dollar (dollar8.2) datetime (datetime17)
290 1111 One 1 1/1/1 1 1/1/1+01:01
291 2222 Two 2 2/2/2 2 2/2/2+02:02
292 3333 Three 3 3/3/3 3 3/3/3+03:03
294 5555 Five 5 5/5/5 5 5/5/5+05:05
298 variable labels string 'A Short String Variable'
299 /longstring 'A Long String Variable'
300 /numeric 'A Numeric Variable'
301 /date 'A Date Variable'
302 /dollar 'A Dollar Variable'
303 /datetime 'A Datetime Variable'.
306 missing values numeric (9, 5, 999).
308 missing values string ("3333").
311 /string '1111' 'ones' '2222' 'twos' '3333' 'threes'
312 /numeric 1 'Unity' 2 'Duality' 3 'Thripality'.
316 attribute=colour[1]('blue') colour[2]('pink') colour[3]('violet')
317 attribute=size('large') nationality('foreign').
320 save outfile='$filename'.
328 # Test to make sure that the dictionary survives the sysfile.
329 # Thanks to Rob Messer for reporting this problem
331 my $tempdir = tempdir( CLEANUP => 1 );
332 my $tempfile = "$tempdir/testfile.sav";
336 my $d = PSPP::Dict->new();
338 PSPP::Var->new ($d, "id",
346 $sysfile = PSPP::Sysfile->new ("$tempfile", $d);
349 my $res = $sysfile->append_case ([3]);
351 ok ($res, "Dictionary survives sysfile");
357 my $tempdir = tempdir( CLEANUP => 1 );
359 generate_sav_file ("$tempdir/in.sav", "$tempdir");
361 my $sf = PSPP::Reader->open ("$tempdir/in.sav");
363 my $dict = $sf->get_dict ();
365 open (MYFILE, ">$tempdir/out.txt");
366 for ($v = 0 ; $v < $dict->get_var_cnt() ; $v++)
368 my $var = $dict->get_var ($v);
369 my $name = $var->get_name ();
370 my $label = $var->get_label ();
372 print MYFILE "Variable $v is \"$name\", label is \"$label\"\n";
374 my $vl = $var->get_value_labels ();
376 print MYFILE "Value Labels:\n";
377 print MYFILE "$_ => $vl->{$_}\n" for keys %$vl;
380 while (my @c = $sf->get_next_case () )
382 for ($v = 0; $v < $dict->get_var_cnt(); $v++)
384 print MYFILE "val$v: \"$c[$v]\"\n";
391 ok (compare ("$tempdir/out.txt", <<EOF), "Basic reader operation");
392 Variable 0 is "string", label is "A Short String Variable"
397 Variable 1 is "longstring", label is "A Long String Variable"
399 Variable 2 is "numeric", label is "A Numeric Variable"
404 Variable 3 is "date", label is "A Date Variable"
406 Variable 4 is "dollar", label is "A Dollar Variable"
408 Variable 5 is "datetime", label is "A Datetime Variable"
450 # Check that we can stream one file into another
452 my $tempdir = tempdir( CLEANUP => 1 );
454 generate_sav_file ("$tempdir/in.sav", "$tempdir");
456 my $input = PSPP::Reader->open ("$tempdir/in.sav");
458 my $dict = $input->get_dict ();
460 my $output = PSPP::Sysfile->new ("$tempdir/out.sav", $dict);
462 while (my (@c) = $input->get_next_case () )
464 $output->append_case (\@c);
470 #Check the two files are the same (except for metadata)
472 run_pspp_syntax ($tempdir, <<SYNTAX);
473 get file='$tempdir/in.sav'.
479 system ("cp $tempdir/pspp.csv $tempdir/in.txt");
481 run_pspp_syntax ($tempdir, <<SYNTAX);
482 get file='$tempdir/out.sav'.
488 ok (! diff ("$tempdir/pspp.csv", "$tempdir/in.txt"), "Streaming of files");
493 # Check that the format_value function works properly
495 my $tempdir = tempdir( CLEANUP => 1 );
497 run_pspp_syntax ($tempdir, <<SYNTAX);
499 data list list /d (datetime17).
504 save outfile='$tempdir/dd.sav'.
508 my $sf = PSPP::Reader->open ("$tempdir/dd.sav");
510 my $dict = $sf->get_dict ();
512 my (@c) = $sf->get_next_case ();
514 my $var = $dict->get_var (0);
516 my $formatted = PSPP::format_value ($val, $var);
517 my $str = gmtime ($val - PSPP::PERL_EPOCH);
518 print "Formatted string is \"$formatted\"\n";
519 ok ( $formatted eq "11-SEP-2001 08:20", "format_value function");
520 ok ( $str eq "Tue Sep 11 08:20:00 2001", "Perl representation of time");
524 # Check that attempting to open a non-existent file results in an error
526 my $tempdir = tempdir( CLEANUP => 1 );
528 unlink ("$tempdir/no-such-file.sav");
530 my $sf = PSPP::Reader->open ("$tempdir/no-such-file.sav");
532 ok ( !ref $sf, "Returns undef on opening failure");
534 ok ("$PSPP::errstr" eq "Error opening `$tempdir/no-such-file.sav' for reading as a system file: No such file or directory.",
535 "Error string on open failure");
539 # Missing value tests.
541 my $tempdir = tempdir( CLEANUP => 1 );
543 generate_sav_file ("$tempdir/in.sav", "$tempdir");
545 my $sf = PSPP::Reader->open ("$tempdir/in.sav");
547 my $dict = $sf->get_dict ();
550 my (@c) = $sf->get_next_case ();
552 my $stringvar = $dict->get_var (0);
553 my $numericvar = $dict->get_var (2);
556 ok ( !PSPP::value_is_missing ($val, $stringvar), "Missing Value Negative String");
560 ok ( !PSPP::value_is_missing ($val, $numericvar), "Missing Value Negative Num");
562 @c = $sf->get_next_case ();
563 @c = $sf->get_next_case ();
566 ok ( PSPP::value_is_missing ($val, $stringvar), "Missing Value Positive");
568 @c = $sf->get_next_case ();
570 ok ( PSPP::value_is_missing ($val, $numericvar), "Missing Value Positive SYS");
572 @c = $sf->get_next_case ();
574 ok ( PSPP::value_is_missing ($val, $numericvar), "Missing Value Positive Num");
578 #Test reading of custom attributes
580 my $tempdir = tempdir( CLEANUP => 1 );
582 generate_sav_file ("$tempdir/in.sav", "$tempdir");
584 my $sf = PSPP::Reader->open ("$tempdir/in.sav");
586 my $dict = $sf->get_dict ();
588 my $var = $dict->get_var_by_name ("numeric");
590 my $attr = $var->get_attributes ();
592 open (MYFILE, ">$tempdir/out.txt");
594 foreach $k (keys %$attr)
596 my $ll = $attr->{$k};
597 print MYFILE "$k =>";
598 print MYFILE map "$_\n", join ', ', @$ll;
603 ok (compare ("$tempdir/out.txt", <<EOF), "Custom Attributes");
604 colour =>blue, pink, violet
605 nationality =>foreign
611 # Test of the get_case_cnt function
613 my $tempdir = tempdir( CLEANUP => 1 );
615 generate_sav_file ("$tempdir/in.sav", "$tempdir");
617 my $sf = PSPP::Reader->open ("$tempdir/in.sav");
619 my $n = $sf->get_case_cnt ();
621 ok ($n == 5, "Case count");