+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.");
+
+}
+