Remove "Written by Ben Pfaff <blp@gnu.org>" lines everywhere.
[pspp-builds.git] / src / language / tests / casefile-test.c
index a90cbfb7e7a1dc4f5b26d622478e40d8b94ee522..eb8ee061956db8569e5c930d82157907ecf77ee4 100644 (file)
@@ -1,6 +1,5 @@
 /* PSPP - computes sample statistics.
    Copyright (C) 2004 Free Software Foundation, Inc.
-   Written by Ben Pfaff <blp@gnu.org>.
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -28,6 +27,7 @@
 #include <stdarg.h>
 #include <language/command.h>
 #include <language/lexer/lexer.h>
+#include <libpspp/assertion.h>
 
 #include "xalloc.h"
 
@@ -38,10 +38,13 @@ static void write_random_case (struct casefile *cf, size_t case_idx);
 static void read_and_verify_random_case (struct casefile *cf,
                                          struct casereader *reader,
                                          size_t case_idx);
+static void test_casereader_clone (struct casereader *reader1, size_t case_cnt);
+                                
+
 static void fail_test (const char *message, ...);
 
 int
-cmd_debug_casefile (void
+cmd_debug_casefile (struct lexer *lexer, struct dataset *ds UNUSED
 {
   static const size_t sizes[] =
     {
@@ -53,17 +56,17 @@ cmd_debug_casefile (void)
   int pattern;
 
   size_max = sizeof sizes / sizeof *sizes;
-  if (lex_match_id ("SMALL")) 
+  if (lex_match_id (lexer, "SMALL")) 
     {
       size_max -= 4;
       case_max = 511; 
     }
   else
     case_max = 4095;
-  if (token != '.')
-    return lex_end_of_command ();
+  if (lex_token (lexer) != '.')
+    return lex_end_of_command (lexer);
     
-  for (pattern = 0; pattern < 6; pattern++) 
+  for (pattern = 0; pattern < 7; pattern++) 
     {
       const size_t *size;
 
@@ -97,8 +100,8 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt)
     write_random_case (cf, i);
   if (pattern == 5)
     casefile_sleep (cf);
-  r1 = casefile_get_reader (cf);
-  r2 = casefile_get_reader (cf);
+  r1 = casefile_get_reader (cf, NULL);
+  r2 = casefile_get_reader (cf, NULL);
   switch (pattern) 
     {
     case 0:
@@ -129,6 +132,12 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt)
       for (; j < case_cnt; j++) 
         read_and_verify_random_case (cf, r2, j);
       break;
+    case 6:
+      test_casereader_clone (r1, case_cnt);
+      test_casereader_clone (r2, case_cnt);
+      break;
+    default:
+      NOT_REACHED ();
     }
   if (casereader_read (r1, &c))
     fail_test ("Casereader 1 not at end of file.");
@@ -150,8 +159,8 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt)
             fail_test ("Premature end of casefile.");
           for (j = 0; j < value_cnt; j++) 
             {
-              double a = case_num (&read_case, j);
-              double b = case_num (&expected_case, j);
+              double a = case_num_idx (&read_case, j);
+              double b = case_num_idx (&expected_case, j);
               if (a != b)
                 fail_test ("Case %lu fails comparison.", (unsigned long) i); 
             }
@@ -170,7 +179,7 @@ get_random_case (struct ccase *c, size_t value_cnt, size_t case_idx)
   int i;
   case_create (c, value_cnt);
   for (i = 0; i < value_cnt; i++)
-    case_data_rw (c, i)->f = case_idx % 257 + i;
+    case_data_rw_idx (c, i)->f = case_idx % 257 + i;
 }
 
 static void
@@ -195,8 +204,8 @@ read_and_verify_random_case (struct casefile *cf,
     fail_test ("Premature end of casefile.");
   for (i = 0; i < value_cnt; i++) 
     {
-      double a = case_num (&read_case, i);
-      double b = case_num (&expected_case, i);
+      double a = case_num_idx (&read_case, i);
+      double b = case_num_idx (&expected_case, i);
       if (a != b)
         fail_test ("Case %lu fails comparison.", (unsigned long) case_idx); 
     }
@@ -204,6 +213,69 @@ read_and_verify_random_case (struct casefile *cf,
   case_destroy (&expected_case);
 }
 
+static void
+test_casereader_clone (struct casereader *reader1, size_t case_cnt)
+{
+  size_t i;
+  size_t cases = 0;
+  struct ccase c1;
+  struct ccase c2;
+  struct casefile *src = casereader_get_casefile (reader1);
+  struct casereader *clone = NULL;
+
+  size_t value_cnt = casefile_get_value_cnt (src);
+
+  struct casefile *newfile = fastfile_create (value_cnt);
+  struct casereader *newreader;
+
+
+  /* Read a 3rd of the cases */
+  for ( i = 0 ; i < case_cnt / 3 ; ++i ) 
+    {
+      casereader_read (reader1, &c1);
+      case_destroy (&c1);
+    }
+
+  clone = casereader_clone (reader1);
+
+  /* Copy all the cases into a new file */
+  while( casereader_read (reader1, &c1))
+    { 
+      casefile_append_xfer (newfile, &c1);
+      cases ++;
+    }
+
+  newreader = casefile_get_reader (newfile, NULL);
+
+  /* Make sure that the new file's are identical to those returned from 
+     the cloned reader */
+  while( casereader_read (clone, &c1))
+    { 
+      const union value *v1;
+      const union value *v2;
+      cases --;
+
+      if ( ! casereader_read_xfer (newreader, &c2) ) 
+        {
+          case_destroy (&c1);
+          break; 
+        }
+      
+      v1 = case_data_all (&c1) ;
+      v2 = case_data_all (&c2) ;
+
+      if ( 0 != memcmp (v1, v2, value_cnt * MAX_SHORT_STRING))
+       fail_test ("Cloned reader read different value at case %ld", cases);
+
+      case_destroy (&c1);
+      case_destroy (&c2);
+    }
+
+  if ( cases > 0 ) 
+    fail_test ("Cloned reader reads different number of cases.");
+
+}
+
 static void
 fail_test (const char *message, ...) 
 {