开始设计
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
#include "c_SeparateChainingHashST.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user