#include "c_RBTreeSet.h" #include "c_Test.h" #include #include 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); }