#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){ 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")); // // TEST_Hashtable_Print(hashtable); // 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 tempMaxVal = 10000; for(uint32_t maxVal = 0; maxVal < tempMaxVal; maxVal++){ 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_CHECK(index == *(int32_t *)ARC_Hashtable_Get(hashtable, key)); ARC_Hashtable_Remove(hashtable, key); free(key); } printf("%u\n", maxVal); } ARC_Hashtable_Destroy(hashtable); }