#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){ ARC_Hashtable_RunIteration(hashtable, TEST_Hashtable_PrintIter); } ARC_Bool TEST_Hashtable_KeyCompareDataFn(void *dataA, void *dataB){ printf("%s, %s\n", (char *)dataA, (char *)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_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"; // // 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); // } // // for(uint32_t index = 0; index < 100; 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); //}