X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Ftests%2Fcasefile-test.c;h=a1927ddb98dc3009820ed3b5200ca7a416997c44;hb=a37754c18dee3d5941e5fe041b2c1fa1a3370157;hp=a90cbfb7e7a1dc4f5b26d622478e40d8b94ee522;hpb=e16d30a43af6ada7b8846f48a55eb3cb8f4e5f22;p=pspp-builds.git diff --git a/src/language/tests/casefile-test.c b/src/language/tests/casefile-test.c index a90cbfb7..a1927ddb 100644 --- a/src/language/tests/casefile-test.c +++ b/src/language/tests/casefile-test.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "xalloc.h" @@ -38,6 +39,9 @@ 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 @@ -63,7 +67,7 @@ cmd_debug_casefile (void) if (token != '.') return lex_end_of_command (); - for (pattern = 0; pattern < 6; pattern++) + for (pattern = 0; pattern < 7; pattern++) { const size_t *size; @@ -129,6 +133,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."); @@ -204,6 +214,60 @@ 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); + + clone = casereader_clone (reader1); + + /* Copy all the cases into a new file */ + while( casereader_read (reader1, &c1)) + { + casefile_append (newfile, &c1); + cases ++; + } + + newreader = casefile_get_reader (newfile); + + /* 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) ) + 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); + } + + if ( cases > 0 ) + fail_test ("Cloned reader reads different number of cases."); + +} + static void fail_test (const char *message, ...) {