165 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
#ifdef HAVE_DIX_CONFIG_H
 | 
						|
#include <dix-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <misc.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include "hashtable.h"
 | 
						|
#include "resource.h"
 | 
						|
 | 
						|
static void
 | 
						|
print_xid(void* ptr, void* v)
 | 
						|
{
 | 
						|
    XID *x = v;
 | 
						|
    printf("%ld", *x);
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
print_int(void* ptr, void* v)
 | 
						|
{
 | 
						|
    int *x = v;
 | 
						|
    printf("%d", *x);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
test1(void)
 | 
						|
{
 | 
						|
    HashTable h;
 | 
						|
    int c;
 | 
						|
    int ok = 1;
 | 
						|
    const int numKeys = 420;
 | 
						|
 | 
						|
    printf("test1\n");
 | 
						|
    h = ht_create(sizeof(XID), sizeof(int), ht_resourceid_hash, ht_resourceid_compare, NULL);
 | 
						|
 | 
						|
    for (c = 0; c < numKeys; ++c) {
 | 
						|
      int *dest;
 | 
						|
      XID id = c;
 | 
						|
      dest = ht_add(h, &id);
 | 
						|
      if (dest) {
 | 
						|
        *dest = 2 * c;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    printf("Distribution after insertion\n");
 | 
						|
    ht_dump_distribution(h);
 | 
						|
    ht_dump_contents(h, print_xid, print_int, NULL);
 | 
						|
 | 
						|
    for (c = 0; c < numKeys; ++c) {
 | 
						|
      XID id = c;
 | 
						|
      int* v = ht_find(h, &id);
 | 
						|
      if (v) {
 | 
						|
        if (*v == 2 * c) {
 | 
						|
          // ok
 | 
						|
        } else {
 | 
						|
          printf("Key %d doesn't have expected value %d but has %d instead\n",
 | 
						|
                 c, 2 * c, *v);
 | 
						|
          ok = 0;
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        ok = 0;
 | 
						|
        printf("Cannot find key %d\n", c);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (ok) {
 | 
						|
      printf("%d keys inserted and found\n", c);
 | 
						|
 | 
						|
      for (c = 0; c < numKeys; ++c) {
 | 
						|
        XID id = c;
 | 
						|
        ht_remove(h, &id);
 | 
						|
      }
 | 
						|
 | 
						|
      printf("Distribution after deletion\n");
 | 
						|
      ht_dump_distribution(h);
 | 
						|
    }
 | 
						|
 | 
						|
    ht_destroy(h);
 | 
						|
 | 
						|
    return ok;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
test2(void)
 | 
						|
{
 | 
						|
    HashTable h;
 | 
						|
    int c;
 | 
						|
    int ok = 1;
 | 
						|
    const int numKeys = 420;
 | 
						|
 | 
						|
    printf("test2\n");
 | 
						|
    h = ht_create(sizeof(XID), 0, ht_resourceid_hash, ht_resourceid_compare, NULL);
 | 
						|
 | 
						|
    for (c = 0; c < numKeys; ++c) {
 | 
						|
      XID id = c;
 | 
						|
      ht_add(h, &id);
 | 
						|
    }
 | 
						|
 | 
						|
    for (c = 0; c < numKeys; ++c) {
 | 
						|
      XID id = c;
 | 
						|
      if (!ht_find(h, &id)) {
 | 
						|
        ok = 0;
 | 
						|
        printf("Cannot find key %d\n", c);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
        XID id = c + 1;
 | 
						|
        if (ht_find(h, &id)) {
 | 
						|
            ok = 0;
 | 
						|
            printf("Could find a key that shouldn't be there\n");
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    ht_destroy(h);
 | 
						|
 | 
						|
    if (ok) {
 | 
						|
        printf("Test with empty keys OK\n");
 | 
						|
    } else {
 | 
						|
        printf("Test with empty keys FAILED\n");
 | 
						|
    }
 | 
						|
 | 
						|
    return ok;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
test3(void)
 | 
						|
{
 | 
						|
    int ok = 1;
 | 
						|
    HtGenericHashSetupRec hashSetup = {
 | 
						|
        .keySize = 4
 | 
						|
    };
 | 
						|
    HashTable h;
 | 
						|
    printf("test3\n");
 | 
						|
    h = ht_create(4, 0, ht_generic_hash, ht_generic_compare, &hashSetup);
 | 
						|
 | 
						|
    if (!ht_add(h, "helo") ||
 | 
						|
        !ht_add(h, "wrld")) {
 | 
						|
        printf("Could not insert keys\n");
 | 
						|
    }
 | 
						|
 | 
						|
    if (!ht_find(h, "helo") ||
 | 
						|
        !ht_find(h, "wrld")) {
 | 
						|
        ok = 0;
 | 
						|
        printf("Could not find inserted keys\n");
 | 
						|
    }
 | 
						|
 | 
						|
    printf("Hash distribution with two strings\n");
 | 
						|
    ht_dump_distribution(h);
 | 
						|
 | 
						|
    ht_destroy(h);
 | 
						|
 | 
						|
    return ok;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
main(void)
 | 
						|
{
 | 
						|
    int ok = test1();
 | 
						|
    ok = ok && test2();
 | 
						|
    ok = ok && test3();
 | 
						|
 | 
						|
    return ok ? 0 : 1;
 | 
						|
}
 |