#include "c_BST.h" #include "c_Test.h" #include #include static int bst_compare_chars(const void* a, const void* b, void* args) { (void)args; char char1 = *(const char*)a; char char2 = *(const char*)b; return char1 - char2; } TEST_CASE(test_c_BST_Dynamic_CRUD) { c_BST_t tree; // 就地初始化:将 char 作为 Key,int 作为 Value c_err_t err = c_BST_Init(&tree, sizeof(char), sizeof(int), bst_compare_chars, NULL, &c_DefaultAllocator); ASSERT_INT_EQ(C_ERR_OK, err); // 故意以颠簸顺序插入,构造一个经典的非退化二叉平衡树拓扑 char key_M = 'M'; int val_M = 40; char key_E = 'E'; int val_E = 20; char key_S = 'S'; int val_S = 50; char key_A = 'A'; int val_A = 10; char key_R = 'R'; int val_R = 45; ASSERT_INT_EQ(C_ERR_OK, c_BST_Put(&tree, &key_M, &val_M)); ASSERT_INT_EQ(C_ERR_OK, c_BST_Put(&tree, &key_E, &val_E)); ASSERT_INT_EQ(C_ERR_OK, c_BST_Put(&tree, &key_S, &val_S)); ASSERT_INT_EQ(C_ERR_OK, c_BST_Put(&tree, &key_A, &val_A)); ASSERT_INT_EQ(C_ERR_OK, c_BST_Put(&tree, &key_R, &val_R)); ASSERT_INT_EQ(5, (int)tree.size); // 1. Get 状态命中读取验证 int get_val = 0; ASSERT_INT_EQ(C_ERR_OK, c_BST_Get(&tree, &key_S, &get_val)); ASSERT_INT_EQ(50, get_val); ASSERT_TRUE(c_BST_Contains(&tree, &key_R)); char key_X = 'X'; ASSERT_TRUE(!c_BST_Contains(&tree, &key_X)); // 2. Overwrite 相同键覆写更新审计 int update_val_M = 999; ASSERT_INT_EQ(C_ERR_OK, c_BST_Put(&tree, &key_M, &update_val_M)); ASSERT_INT_EQ(5, (int)tree.size); // 大小锁死不能变 ASSERT_INT_EQ(C_ERR_OK, c_BST_Get(&tree, &key_M, &get_val)); ASSERT_INT_EQ(999, get_val); // 3. Delete 深度极限压测:删除拥有双向子树的复杂中段根节点 'S' // 修复后的 Hibbard 机制应当自动将 'R' 节点提升顶替上来,并原路释放 S 的内存 ASSERT_INT_EQ(C_ERR_OK, c_BST_Delete(&tree, &key_S)); ASSERT_INT_EQ(4, (int)tree.size); ASSERT_INT_EQ(C_ERR_NOTFOUND, c_BST_Get(&tree, &key_S, &get_val)); // 确保与 S 共同历经剧变的邻居节点 R 依然在新树中完好驻留 ASSERT_INT_EQ(C_ERR_OK, c_BST_Get(&tree, &key_R, &get_val)); ASSERT_INT_EQ(45, get_val); // 深度级联注销反初始化 c_BST_Destroy(&tree); } TEST_CASE(test_c_BST_ParamConstraints) { c_BST_t local_tree; c_BST_Init(&local_tree, sizeof(char), sizeof(int), bst_compare_chars, NULL, NULL); // 降格 Fallback char k = 'Q'; int v = 77; // 验证各类非法调用的拦截返回 ASSERT_INT_EQ(C_ERR_PARAM, c_BST_Init(NULL, sizeof(char), sizeof(int), bst_compare_chars, NULL, NULL)); ASSERT_INT_EQ(C_ERR_PARAM, c_BST_Put(NULL, &k, &v)); ASSERT_INT_EQ(C_ERR_EMPTY, c_BST_Delete(&local_tree, &k)); // 空树删除直接拦截抛出 C_ERR_EMPTY c_BST_Destroy(&local_tree); } // ========================================== // 5. 主集成入口 // ========================================== int main(void) { TEST_START(C_BinarySearchTreeST_Isolated_TestSuite); RUN_TEST(test_c_BST_Dynamic_CRUD); RUN_TEST(test_c_BST_ParamConstraints); TEST_REPORT(); return (g_test_registry.failed_count > 0 ? 1 : 0); }