Add random access to casefiles, for use in GUI.
[pspp-builds.git] / src / language / tests / casefile-test.c
index 10722dcbaf17152c9f62740e1586a19ab7585e07..432cf388e944f1d9add1345db209c62f510fe038 100644 (file)
 #include <data/casefile.h>
 #include <data/case.h>
 
+#include <gsl/gsl_randist.h>
 #include <gsl/gsl_rng.h>
 #include <stdarg.h>
 #include <language/command.h>
 #include <language/lexer/lexer.h>
 
+#include "xalloc.h"
+
 static void test_casefile (int pattern, size_t value_cnt, size_t case_cnt);
 static void get_random_case (struct ccase *, size_t value_cnt,
                              size_t case_idx);
@@ -133,6 +136,24 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt)
     casereader_destroy (r1);
   if (pattern != 2)
     casereader_destroy (r2);
+  if (pattern > 3) 
+    {
+      int *order;
+      r1 = casefile_get_random_reader (cf);
+      order = xmalloc (sizeof *order * case_cnt);
+      for (i = 0; i < case_cnt; i++)
+        order[i] = i;
+      if (case_cnt > 0)
+        gsl_ran_shuffle (rng, order, case_cnt, sizeof *order);
+      for (i = 0; i < case_cnt; i++)
+        {
+          int case_idx = order[i];
+          casereader_seek (r1, case_idx);
+          read_and_verify_random_case (cf, r1, case_idx);
+        }
+      casereader_destroy (r1);
+      free (order);
+    }
   if (pattern > 2) 
     {
       r1 = casefile_get_destructive_reader (cf);