#include #include struct idx; struct map { JMAP_MEMBERS(struct idx *, int); }; #define NUM 100 static int cmp_ptr(const void *a, const void *b) { return *(char **)a - *(char **)b; } int main(int argc, char *argv[]) { struct map *map; struct idx *idx[NUM+1], *index; unsigned int i; int *intp; plan_tests(25 + NUM*2 + 6); for (i = 0; i < NUM+1; i++) idx[i] = malloc(20); qsort(idx, NUM, sizeof(idx[0]), cmp_ptr); map = jmap_new(struct map); ok1(jmap_error(map) == NULL); ok1(jmap_test(map, idx[NUM]) == false); ok1(jmap_get(map, idx[NUM]) == 0); ok1(jmap_count(map) == 0); ok1(jmap_first(map) == 0); ok1(jmap_del(map, idx[0]) == false); /* Set only works on existing cases. */ ok1(jmap_set(map, idx[0], 0) == false); ok1(jmap_add(map, idx[0], 1) == true); ok1(jmap_get(map, idx[0]) == 1); ok1(jmap_set(map, idx[0], -1) == true); ok1(jmap_get(map, idx[0]) == -1); ok1(jmap_test(map, idx[0]) == true); ok1(jmap_count(map) == 1); ok1(jmap_first(map) == idx[0]); ok1(jmap_next(map, idx[0]) == NULL); ok1(jmap_del(map, idx[0]) == true); ok1(jmap_test(map, idx[0]) == false); ok1(jmap_count(map) == 0); for (i = 0; i < NUM; i++) jmap_add(map, idx[i], i+1); ok1(jmap_count(map) == NUM); ok1(jmap_first(map) == idx[0]); ok1(jmap_next(map, idx[0]) == idx[1]); ok1(jmap_next(map, idx[NUM-1]) == NULL); ok1(jmap_get(map, idx[0]) == 1); ok1(jmap_get(map, idx[NUM-1]) == NUM); ok1(jmap_get(map, (void *)((char *)idx[NUM-1] + 1)) == 0); /* Reverse values in map. */ for (i = 0; i < NUM; i++) { intp = jmap_getval(map, idx[i]); ok1(*intp == i+1); *intp = NUM-i; jmap_putval(map, &intp); } for (i = 0; i < NUM; i++) ok1(jmap_get(map, idx[i]) == NUM-i); intp = jmap_firstval(map, &index); ok1(index == idx[0]); ok1(*intp == NUM); jmap_putval(map, &intp); intp = jmap_nextval(map, &index); ok1(index == idx[1]); ok1(*intp == NUM-1); jmap_putval(map, &intp); index = idx[NUM-1]; intp = jmap_nextval(map, &index); ok1(intp == NULL); ok1(jmap_error(map) == NULL); jmap_free(map); for (i = 0; i < NUM+1; i++) free(idx[i]); return exit_status(); }