#include "../test.h" #include "arc/std/bool.h" #include "arc/std/errno.h" #include "arc/std/hashtable.h" #include #include #include #include //TODO: add hash function for testing void TEST_Hashtable_PrintIter(void *key, void *value){ //printf("%s, %d\n", (char *)key, *(int32_t *)value); } void TEST_Hashtable_Print(void *hashtable){ printf("hashtable:\n"); ARC_Hashtable_RunIteration(hashtable, TEST_Hashtable_PrintIter); printf("\n"); } ARC_Bool TEST_Hashtable_KeyCompareDataFn(void *dataA, void *dataB){ return (ARC_Bool)strcmp((const char *)dataA, (const char *)dataB) == 0; } void TEST_Hashtable_DestroyKeyValueFn(void *key, void *value){ free((char *)key); free((int32_t *)value); } ARC_TEST(Hashtable_Init){ ARC_Hashtable *hashtable; ARC_Hashtable_KeyCompareFn keyCompareFn = TEST_Hashtable_KeyCompareDataFn; ARC_Hashtable_Create(&hashtable, NULL, &keyCompareFn, NULL); ARC_CHECK(arc_errno == 0); ARC_Hashtable_Destroy(hashtable); } ARC_TEST(Hashtable_Add_Get_Remove){ ARC_Hashtable *hashtable; ARC_Hashtable_KeyCompareFn keyCompareFn = TEST_Hashtable_KeyCompareDataFn; ARC_Hashtable_Create(&hashtable, NULL, &keyCompareFn, NULL); char *key0 = (char *)"key0"; char *key1 = (char *)"key1"; char *key2 = (char *)"key2"; char *key3 = (char *)"key3"; char *key4 = (char *)"key4"; char *key5 = (char *)"key5"; char *key6 = (char *)"key6"; char *key7 = (char *)"key7"; char *key8 = (char *)"key8"; int32_t val0 = 2; int32_t val1 = 7; int32_t val2 = 4; int32_t val3 = 9; int32_t val4 = 0; int32_t val5 = 1; int32_t val6 = 3; int32_t val7 = 5; int32_t val8 = 6; ARC_Hashtable_Add(hashtable, key0, &val0); ARC_Hashtable_Add(hashtable, key1, &val1); ARC_Hashtable_Add(hashtable, key2, &val2); ARC_Hashtable_Add(hashtable, key3, &val3); ARC_Hashtable_Add(hashtable, key4, &val4); ARC_Hashtable_Add(hashtable, key5, &val5); ARC_Hashtable_Add(hashtable, key6, &val6); ARC_Hashtable_Add(hashtable, key7, &val7); ARC_Hashtable_Add(hashtable, key8, &val8); ARC_CHECK(2 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key0")); ARC_CHECK(7 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key1")); ARC_CHECK(4 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key2")); ARC_CHECK(9 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key3")); ARC_CHECK(0 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key4")); ARC_CHECK(1 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key5")); ARC_CHECK(3 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key6")); ARC_CHECK(5 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key7")); ARC_CHECK(6 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key8")); ARC_Hashtable_Remove(hashtable, (void *)"key2"); ARC_CHECK(2 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key0")); ARC_CHECK(7 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key1")); ARC_CHECK(9 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key3")); ARC_CHECK(0 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key4")); ARC_CHECK(1 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key5")); ARC_CHECK(3 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key6")); ARC_CHECK(5 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key7")); ARC_CHECK(6 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key8")); ARC_Hashtable_Remove(hashtable, (void *)"key0"); ARC_Hashtable_Remove(hashtable, (void *)"key4"); ARC_Hashtable_Remove(hashtable, (void *)"key3"); ARC_Hashtable_Remove(hashtable, (void *)"key8"); ARC_Hashtable_Remove(hashtable, (void *)"key6"); ARC_Hashtable_Remove(hashtable, (void *)"key7"); ARC_CHECK(7 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key1")); ARC_CHECK(1 == *(int32_t *)ARC_Hashtable_Get(hashtable, (void *)"key5")); ARC_Hashtable_Remove(hashtable, (void *)"key1"); ARC_Hashtable_Remove(hashtable, (void *)"key5"); ARC_Hashtable_Destroy(hashtable); } ARC_TEST(Hashtable_Add_Get_100){ ARC_Hashtable *hashtable; ARC_Hashtable_KeyCompareFn keyCompareFn = TEST_Hashtable_KeyCompareDataFn; ARC_Hashtable_DestroyKeyValueFn destroyKeyValueFn = TEST_Hashtable_DestroyKeyValueFn; ARC_Hashtable_Create(&hashtable, NULL, &keyCompareFn, &destroyKeyValueFn); const char *keyCStr = "key%03u"; for(uint32_t index = 0; index < 100; index++){ char *key = (char *)malloc(strlen(keyCStr)); sprintf(key, keyCStr, index); int32_t *val = (int32_t *)malloc(sizeof(int32_t)); *val = index; ARC_Hashtable_Add(hashtable, key, val); } for(uint32_t index = 0; index < 100; index++){ char *key = (char *)malloc(strlen(keyCStr)); sprintf(key, keyCStr, index); ARC_CHECK(index == *(int32_t *)ARC_Hashtable_Get(hashtable, key)); free(key); } ARC_Hashtable_Destroy(hashtable); } ARC_TEST(Hashtable_Add_Get_Remove_100){ ARC_Hashtable *hashtable; ARC_Hashtable_KeyCompareFn keyCompareFn = TEST_Hashtable_KeyCompareDataFn; ARC_Hashtable_DestroyKeyValueFn destroyKeyValueFn = TEST_Hashtable_DestroyKeyValueFn; ARC_Hashtable_Create(&hashtable, NULL, &keyCompareFn, &destroyKeyValueFn); const char *keyCStr = "key%03u"; uint32_t maxVal = 15; for(uint32_t index = 0; index < maxVal; index++){ char *key = (char *)malloc(strlen(keyCStr)); sprintf(key, keyCStr, index); int32_t *val = (int32_t *)malloc(sizeof(int32_t)); *val = index; ARC_Hashtable_Add(hashtable, key, val); } for(uint32_t index = 0; index < maxVal; index++){ char *key = (char *)malloc(strlen(keyCStr)); sprintf(key, keyCStr, index); ARC_CHECK(index == *(int32_t *)ARC_Hashtable_Get(hashtable, key)); free(key); } for(uint32_t index = 0; index < maxVal; index++){ char *key = (char *)malloc(strlen(keyCStr)); sprintf(key, keyCStr, index); TEST_Hashtable_Print(hashtable); ARC_Hashtable_Remove(hashtable, key); free(key); } ARC_Hashtable_Destroy(hashtable); }