aboutsummaryrefslogtreecommitdiff
path: root/tests/list_check.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/list_check.c')
-rw-r--r--tests/list_check.c110
1 files changed, 96 insertions, 14 deletions
diff --git a/tests/list_check.c b/tests/list_check.c
index 91d7367d..00e27e00 100644
--- a/tests/list_check.c
+++ b/tests/list_check.c
@@ -37,34 +37,45 @@ static int test_lists(int num_items)
struct refltemp *check;
RefList *list;
int i;
-
- fprintf(stderr, "Testing with %i items.\n", num_items);
+ signed int h, k, l;
check = malloc(num_items * sizeof(struct refltemp));
list = reflist_new();
+ printf("Testing with %i\n", num_items);
+
+ h = RANDOM_INDEX;
+ k = RANDOM_INDEX;
+ l = RANDOM_INDEX;
+
for ( i=0; i<num_items; i++ ) {
- signed int h, k, l;
int j;
int duplicate = 0;
- do {
- duplicate = 0;
-
+ if ( random() > RAND_MAX/2 ) {
h = RANDOM_INDEX;
k = RANDOM_INDEX;
l = RANDOM_INDEX;
-
- for ( j=0; j<i; j++ ) {
- if ( (check[j].h == h)
- && (check[j].k == k)
- && (check[j].l == l) ) {
- duplicate++;
- }
+ } /* else use the same as last time */
+
+ /* Count the number of times this reflection appeared before */
+ for ( j=0; j<i; j++ ) {
+ if ( (check[j].h == h)
+ && (check[j].k == k)
+ && (check[j].l == l) ) {
+ duplicate++;
}
+ }
- } while ( duplicate );
+ /* Update all copies with this number */
+ for ( j=0; j<i; j++ ) {
+ if ( (check[j].h == h)
+ && (check[j].k == k)
+ && (check[j].l == l) ) {
+ check[j].dup = duplicate;
+ }
+ }
add_refl(list, h, k, l);
check[i].h = h;
@@ -75,6 +86,8 @@ static int test_lists(int num_items)
}
+ /* Check that all the reflections can be found,
+ * and delete the first few. */
for ( i=0; i<num_items; i++ ) {
signed int h, k, l;
@@ -90,9 +103,73 @@ static int test_lists(int num_items)
return 1;
}
+ /* Delete some reflections */
if ( i<num_items/2 ) {
+
+ int j;
+
delete_refl(refl);
check[i].del = 1;
+
+ /* Update all counts */
+ for ( j=0; j<i; j++ ) {
+ if ( (check[j].h == h)
+ && (check[j].k == k)
+ && (check[j].l == l) ) {
+ check[j].dup--;
+ }
+ }
+
+ }
+
+ }
+
+ /* Check that the deleted reflections can no longer be found, unless
+ * duplicated. If duplicated, remove all the remaining copies. */
+ for ( i=0; i<num_items/2; i++ ) {
+
+ signed int h, k, l;
+ Reflection *refl;
+
+ h = check[i].h;
+ k = check[i].k;
+ l = check[i].l;
+
+ refl = find_refl(list, h, k, l);
+ if ( refl != NULL ) {
+
+ /* Whoops, found it. Was it a duplicate? */
+ if ( check[i].dup == 0 ) {
+ fprintf(stderr, "Found %3i %i %3i after"
+ " deletion.\n", h, k, l);
+ return 1;
+ } else {
+
+ int j;
+ Reflection *c;
+
+ for ( j=0; j<check[i].dup; j++ ) {
+ Reflection *r2;
+ r2 = find_refl(list, h, k, l);
+ if ( r2 == NULL ) {
+ fprintf(stderr, "Found too few"
+ " duplicates for"
+ " %3i %3i %3i\n",
+ h, k, l);
+ return 1;
+ }
+ delete_refl(r2);
+ }
+
+ c = find_refl(list, h, k, l);
+ if ( c != NULL ) {
+ fprintf(stderr, "Found too many "
+ "duplicates for %3i %3i %3i\n",
+ h, k, l);
+ return 1;
+ }
+
+ }
}
}
@@ -107,9 +184,14 @@ int main(int argc, char *argv[])
{
int i;
+ printf("Running list test...");
+ fflush(stdout);
+
for ( i=0; i<100; i++ ) {
if ( test_lists(4096*random()/RAND_MAX) ) return 1;
}
+ printf("\r");
+
return 0;
}