Files
cKit/Search/c_RBTreeSet.t.c
T

69 lines
2.4 KiB
C
Raw Normal View History

2026-08-30 22:24:45 +08:00
#include "c_RBTreeSet.h"
#include "c_Test.h"
#include <stdlib.h>
#include <stdio.h>
static int rbset_compare_ints(const void* a, const void* b, void* args) {
(void)args;
int arg1 = *(const int*)a;
int arg2 = *(const int*)b;
if (arg1 < arg2) return -1;
if (arg1 > arg2) return 1;
return 0;
}
TEST_CASE(test_c_RBTreeSet_Unique_CRUD) {
c_RBTreeSet_t set;
c_err_t err = c_RBTreeSet_Init(&set, sizeof(int), rbset_compare_ints, NULL, &c_DefaultAllocator);
ASSERT_INT_EQ(C_ERR_OK, err);
int n1 = 50; int n2 = 20; int n3 = 80;
// 1. 基础 Add 压入与 Contains 检测断言
ASSERT_INT_EQ(C_ERR_OK, c_RBTreeSet_Add(&set, &n1));
ASSERT_INT_EQ(C_ERR_OK, c_RBTreeSet_Add(&set, &n2));
ASSERT_INT_EQ(C_ERR_OK, c_RBTreeSet_Add(&set, &n3));
ASSERT_INT_EQ(3, (int)set.size);
ASSERT_TRUE(c_RBTreeSet_Contains(&set, &n2));
// 2. 🌟【绝杀点 1:去重防御】:再次尝试注入相同的数字 20
// 修复后的代码必须果断返回 C_ERR_EXIST 报错拦截,且全局大小坚守为 3 守恒!
ASSERT_INT_EQ(C_ERR_EXIST, c_RBTreeSet_Add(&set, &n2));
ASSERT_INT_EQ(3, (int)set.size);
// 3. 🌟【绝杀点 2:平衡级联删除】:移出处于中段的核心枢纽元素 50
ASSERT_INT_EQ(C_ERR_OK, c_RBTreeSet_Remove(&set, &n1));
ASSERT_INT_EQ(2, (int)set.size);
ASSERT_TRUE(!c_RBTreeSet_Contains(&set, &n1));
// 确保大震荡洗牌后,树根的字符颜色依然被恢复洗回黑链接 'B'
ASSERT_INT_EQ(C_RB_BLACK, (int)set.root->color);
c_RBTreeSet_Destroy(&set);
}
TEST_CASE(test_c_RBTreeSet_EmptyDefenses) {
c_RBTreeSet_t local_set;
c_RBTreeSet_Init(&local_set, sizeof(int), rbset_compare_ints, NULL, NULL);
int item = 777;
// 4. 空仓及入参不合法拦截校验
ASSERT_INT_EQ(C_ERR_PARAM, c_RBTreeSet_Init(NULL, sizeof(int), rbset_compare_ints, NULL, NULL));
ASSERT_INT_EQ(C_ERR_EMPTY, c_RBTreeSet_Remove(&local_set, &item)); // 空仓删除安全返回 C_ERR_EMPTY
c_RBTreeSet_Destroy(&local_set);
}
// ==========================================
// 5. 主集成入口
// ==========================================
int main(void) {
TEST_START(C_RBTreeSet_UniqueUnsigned_TestSuite);
RUN_TEST(test_c_RBTreeSet_Unique_CRUD);
RUN_TEST(test_c_RBTreeSet_EmptyDefenses);
TEST_REPORT();
return (g_test_registry.failed_count > 0 ? 1 : 0);
}