1#ifdef HAVE_DIX_CONFIG_H 2#include <dix-config.h> 3#endif 4 5#include <misc.h> 6#include <stdlib.h> 7#include <stdio.h> 8#include "hashtable.h" 9#include "resource.h" 10 11#include "tests-common.h" 12 13static void 14print_xid(void* ptr, void* v) 15{ 16 XID *x = v; 17 printf("%ld", (long)(*x)); 18} 19 20static void 21print_int(void* ptr, void* v) 22{ 23 int *x = v; 24 printf("%d", *x); 25} 26 27static int 28test1(void) 29{ 30 HashTable h; 31 int c; 32 int ok = 1; 33 const int numKeys = 420; 34 35 printf("test1\n"); 36 h = ht_create(sizeof(XID), sizeof(int), ht_resourceid_hash, ht_resourceid_compare, NULL); 37 38 for (c = 0; c < numKeys; ++c) { 39 int *dest; 40 XID id = c; 41 dest = ht_add(h, &id); 42 if (dest) { 43 *dest = 2 * c; 44 } 45 } 46 47 printf("Distribution after insertion\n"); 48 ht_dump_distribution(h); 49 ht_dump_contents(h, print_xid, print_int, NULL); 50 51 for (c = 0; c < numKeys; ++c) { 52 XID id = c; 53 int* v = ht_find(h, &id); 54 if (v) { 55 if (*v == 2 * c) { 56 // ok 57 } else { 58 printf("Key %d doesn't have expected value %d but has %d instead\n", 59 c, 2 * c, *v); 60 ok = 0; 61 } 62 } else { 63 ok = 0; 64 printf("Cannot find key %d\n", c); 65 } 66 } 67 68 if (ok) { 69 printf("%d keys inserted and found\n", c); 70 71 for (c = 0; c < numKeys; ++c) { 72 XID id = c; 73 ht_remove(h, &id); 74 } 75 76 printf("Distribution after deletion\n"); 77 ht_dump_distribution(h); 78 } 79 80 ht_destroy(h); 81 82 return ok; 83} 84 85static int 86test2(void) 87{ 88 HashTable h; 89 int c; 90 int ok = 1; 91 const int numKeys = 420; 92 93 printf("test2\n"); 94 h = ht_create(sizeof(XID), 0, ht_resourceid_hash, ht_resourceid_compare, NULL); 95 96 for (c = 0; c < numKeys; ++c) { 97 XID id = c; 98 ht_add(h, &id); 99 } 100 101 for (c = 0; c < numKeys; ++c) { 102 XID id = c; 103 if (!ht_find(h, &id)) { 104 ok = 0; 105 printf("Cannot find key %d\n", c); 106 } 107 } 108 109 { 110 XID id = c + 1; 111 if (ht_find(h, &id)) { 112 ok = 0; 113 printf("Could find a key that shouldn't be there\n"); 114 } 115 } 116 117 ht_destroy(h); 118 119 if (ok) { 120 printf("Test with empty keys OK\n"); 121 } else { 122 printf("Test with empty keys FAILED\n"); 123 } 124 125 return ok; 126} 127 128static int 129test3(void) 130{ 131 int ok = 1; 132 HtGenericHashSetupRec hashSetup = { 133 .keySize = 4 134 }; 135 HashTable h; 136 printf("test3\n"); 137 h = ht_create(4, 0, ht_generic_hash, ht_generic_compare, &hashSetup); 138 139 if (!ht_add(h, "helo") || 140 !ht_add(h, "wrld")) { 141 printf("Could not insert keys\n"); 142 } 143 144 if (!ht_find(h, "helo") || 145 !ht_find(h, "wrld")) { 146 ok = 0; 147 printf("Could not find inserted keys\n"); 148 } 149 150 printf("Hash distribution with two strings\n"); 151 ht_dump_distribution(h); 152 153 ht_destroy(h); 154 155 return ok; 156} 157 158int 159hashtabletest_test(void) 160{ 161 int ok = test1(); 162 ok = ok && test2(); 163 ok = ok && test3(); 164 165 return ok ? 0 : 1; 166} 167