Mercurial
view dowa/dowa_test.c @ 22:947b81010aba
[Dowa & Seobeo] Updated so that Dowa hashmaps can use arena and not be broken. Split up web so taht it can handle different paths. Also fixes issues with hash collisions which was pain in the ass.
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Tue, 07 Oct 2025 07:11:02 -0700 |
| parents | 09def63429b9 |
| children | a30944e5719e |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "dowa.h" int main(void) { // --- Test Arena Allocator --- Dowa_PArena arena = Dowa_Arena_Create(64); assert(arena && "Arena creation failed"); char *arena_mem1 = (char *)Dowa_Arena_Allocate(arena, 16); assert(arena_mem1 && "Arena allocation #1 failed"); strcpy(arena_mem1, "hello arena"); printf("[Arena Allocate] mem1 = \"%s\"\n", arena_mem1); char *arena_mem2 = (char *)Dowa_Arena_Allocate(arena, 8); assert(arena_mem2 && "Arena allocation #2 failed"); strcpy(arena_mem2, "data"); printf("[Arena Allocate] mem2 = \"%s\"\n", arena_mem2); Dowa_Arena_Destroy(arena); printf("[Arena] destroyed\n\n"); // --- Test HashMap Basic Operations --- Dowa_PHashMap map = Dowa_HashMap_Create(8); assert(map && "HashMap_Create failed"); // Push raw buffer (default type: BUFFER) const char raw_buf[] = {0x01, 0x02, 0x03, 0x04}; Dowa_HashMap_Push_Value(map, "raw", raw_buf, sizeof(raw_buf)); // Push string with explicit STRING type const char *hello = "hello, world"; Dowa_HashMap_Push_Value_With_Type(map, "greeting", hello, strlen(hello) + 1, DOWA_HASH_MAP_TYPE_STRING); // Push nested hashmap (no copy) Dowa_PHashMap inner = Dowa_HashMap_Create(4); Dowa_HashMap_Push_Value(inner, "inner_key", "inner_val", strlen("inner_val") + 1); Dowa_HashMap_Push_Value_With_Type_NoCopy(map, "nested", inner, sizeof(inner), DOWA_HASH_MAP_TYPE_HASHMAP); // Push integer with INT type int32 number = 42; Dowa_HashMap_Push_Value_With_Type(map, "answer", &number, sizeof(number), DOWA_HASH_MAP_TYPE_INT); // Print full map printf("=== Map After Inserts ===\n"); Dowa_HashMap_Print(map); // Retrieve and validate values { // raw buffer uint8 *r = Dowa_HashMap_Get(map, "raw"); printf("[Get raw] bytes:"); for (size_t i = 0; i < sizeof(raw_buf); ++i) { printf(" %02X", r[i]); } printf("\n"); // greeting char *g = Dowa_HashMap_Get(map, "greeting"); printf("[Get greeting] \"%s\"\n", g); // nested hashmap Dowa_PHashMap ni = Dowa_HashMap_Get(map, "nested"); printf("[Get nested] Inner map contents:\n"); Dowa_HashMap_Print(ni); // answer int32 *ans = Dowa_HashMap_Get(map, "answer"); printf("[Get answer] %d\n", *ans); } // Test Get_Position printf("[Get_Position] 'greeting' at index %d\n", Dowa_HashMap_Get_Position(map, "greeting")); printf("[Get_Position] 'missing' at index %d\n", Dowa_HashMap_Get_Position(map, "missing")); // Pop a key Dowa_HashMap_Pop_Key(map, "raw"); printf("=== Map After Pop 'raw' ===\n"); Dowa_HashMap_Print(map); // --- Test HashMap with Arena --- Dowa_PArena mapArena = Dowa_Arena_Create(256); Dowa_PHashMap map2 = Dowa_HashMap_Create_With_Arena(8, mapArena); assert(map2 && "HashMap_Create_With_Arena failed"); char *test = "bar"; Dowa_HashMap_Push_Value_With_Type(map2, "foo", test, 4, DOWA_HASH_MAP_TYPE_STRING); Dowa_HashMap_Push_Value_With_Type(map2, "num", &number, sizeof(number), DOWA_HASH_MAP_TYPE_INT); printf("=== Map2 (with arena) ===\n"); Dowa_HashMap_Print(map2); Dowa_HashMap_Destroy(map2); printf("[Map2] destroyed (no change)\n\n"); Dowa_Arena_Destroy(mapArena); printf("[Arena] destroyed (all null)\n\n"); // --- Test Cache_Folder --- // Ensure there is a directory "./dowa/test_folder" with some files for this test to succeed. int cache_result = Dowa_HashMap_Cache_Folder(map, "dowa/test_folder"); printf("[Cache_Folder] returned %d\n", cache_result); if (cache_result == 0) { printf("=== Map After Caching 'dowa/test_folder' ===\n"); Dowa_HashMap_Print(map); }else { printf("Cache_Folder failed (ensure 'dowa/test_folder' exists with files)\n"); } // Cleanup Dowa_HashMap_Destroy(map); printf("[Map] destroyed\n"); return 0; }