#include "c_SeparateChainingHashST.h" #include #include #include #define EXPECT_EQ(actual, expected, msg) \ do { \ if ((actual) != (expected)) { \ printf(" [X] Assert Failed: %s (Expected %d, got %d) %s:%d\n", msg, (int)(expected), (int)(actual), __FILE__, __LINE__); \ return C_FALSE; \ } \ } while(0) int compareIntKeys(const void* a, const void* b) { return (*(const int*)a - *(const int*)b); } extern c_err_t c_SeparateChainingHashST_Init(c_SeparateChainingHashST_t* st, c_size_t num_buckets, c_size_t key_size, c_size_t val_size, uint32_t (*hash_fn)(const void*, c_size_t), int (*key_compar)(const void*, const void*)); extern c_err_t c_SeparateChainingHashST_Put(c_SeparateChainingHashST_t* st, const void* key, const void* val); extern c_bool_t c_SeparateChainingHashST_Contains(const c_SeparateChainingHashST_t* st, const void* key); extern void c_SeparateChainingHashST_Destroy(c_SeparateChainingHashST_t* st); c_bool_t test_hash_st_forward_move_iterator(void) { c_SeparateChainingHashST_t hst; c_SeparateChainingHashST_Init(&hst, 4, sizeof(int), sizeof(char) * 16, NULL, compareIntKeys); int keys[] = { 101, 202, 303, 404, 505 }; char* vals[] = { "Val101", "Val202", "Val303", "Val404", "Val505" }; c_size_t count = sizeof(keys) / sizeof(keys[0]); // Safe static count calculation for (c_size_t i = 0; i < count; i++) { c_SeparateChainingHashST_Put(&hst, &keys[i], vals[i]); } c_SeparateChainingHashSTKeyIter_t iter; c_SeparateChainingHashSTKeyIter_Init(&iter, &hst); c_size_t step_idx = 0; c_bool_t dropped_303 = C_FALSE; printf(" [LOG] Scanning dataset verifying forward cursor alignment post-Remove...\n"); while (c_SeparateChainingHashSTKeyIter_HasNext(&iter)) { int* peeked_key = (int*)c_SeparateChainingHashSTKeyIter_Get(&iter); EXPECT_EQ(peeked_key != NULL, C_TRUE, "Get() cannot yield NULL if HasNext() evaluates true"); // int* current_key = (int*)c_SeparateChainingHashSTKeyIter_Next(&iter); // EXPECT_EQ(*peeked_key, *current_key, "Next output mismatched lookahead peek assignment"); if (*peeked_key == 303) { printf(" [MUTATE] Dropping target element key 303 inline...\n"); EXPECT_EQ(c_SeparateChainingHashSTKeyIter_Remove(&iter), C_ERR_OK, "Remove failed"); dropped_303 = C_TRUE; // Enforce state-machine boundaries // EXPECT_EQ(c_SeparateChainingHashSTKeyIter_Remove(&iter), C_ERR_NOT_FOUND, "Double-deletion guard missed tracking clear states"); }else { c_SeparateChainingHashSTKeyIter_Next(&iter); } step_idx++; } EXPECT_EQ(step_idx, count, "Iterator traversal loops bounds missed trailing indices"); EXPECT_EQ(hst.size, 4, "Backing container pool failed to shrink post delete pass"); EXPECT_EQ(dropped_303, C_TRUE, "Target match index was not intercepted during traversal"); int check_deleted_303 = 303; EXPECT_EQ(c_SeparateChainingHashST_Contains(&hst, &check_deleted_303), C_FALSE, "Data trace found leaked item remnants inside table"); c_SeparateChainingHashSTKeyIter_Destroy(&iter); c_SeparateChainingHashST_Destroy(&hst); return C_TRUE; } int main(void) { printf("=== Starting Forward-Move State Framework Verification ===\n"); if (test_hash_st_forward_move_iterator()) { printf(" [PASS] Traversal forward pointer synchronization post-Remove verified successfully.\n"); } else { printf(" [FAIL] State machine synchronization errors intercepted.\n"); } return 0; }