X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Ftests%2Fcasefile-test.c;h=33b15cb6eb00ef0eb93e7ae312859b79c458e576;hb=cf2b8455da9e0ae5359740dcb6ad2037046f88e7;hp=432cf388e944f1d9add1345db209c62f510fe038;hpb=93d4e1865e8e3e2c62bddad822869eedf2e457e0;p=pspp-builds.git diff --git a/src/language/tests/casefile-test.c b/src/language/tests/casefile-test.c index 432cf388..33b15cb6 100644 --- a/src/language/tests/casefile-test.c +++ b/src/language/tests/casefile-test.c @@ -19,6 +19,8 @@ #include #include +#include + #include #include @@ -26,6 +28,7 @@ #include #include #include +#include #include "xalloc.h" @@ -36,10 +39,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[] = { @@ -51,17 +57,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; @@ -88,15 +94,15 @@ test_casefile (int pattern, size_t value_cnt, size_t case_cnt) size_t i, j; rng = gsl_rng_alloc (gsl_rng_mt19937); - cf = casefile_create (value_cnt); + cf = fastfile_create (value_cnt); if (pattern == 5) casefile_to_disk (cf); for (i = 0; i < case_cnt; i++) 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: @@ -127,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."); @@ -136,24 +148,6 @@ 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); @@ -166,8 +160,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); } @@ -186,7 +180,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 @@ -211,8 +205,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); } @@ -220,6 +214,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, ...) {