#include "c_Quick3string.h" #include "c_Test.h" #include #include static int q3s_string_extractor(const void* elem, c_size_t d, void* args) { (void)args; const char* str = *(const char* const*)elem; // 二级指针穿透锁字符 c_size_t len = strlen(str); if (d >= len) return -1; // 截止返回终止符 return (int)((unsigned char)str[d]); } TEST_CASE(test_c_Quick3string_大容量三向划分压测) { // 🌟 18 个包含大量深度高度咬合前缀("shor", "shore", "short")和高频大量全等项的恶劣大方阵 const char* arr[] = { "she", "sells", "seashells", "by", "the", "sea", "shore", "the", "shells", "she", "sea", "shore", "sit", "short", "shor", "a", "sh", "z" }; c_size_t num = sizeof(arr) / sizeof(arr[0]); // 触发三向快排主专线,单体大为 sizeof(char*) c_err_t err = c_Quick3string(arr, num, sizeof(char*), q3s_string_extractor, NULL); ASSERT_INT_EQ(C_ERR_OK, err); // 验证严格的全局字典序单调非减 for (c_size_t i = 0; i < num - 1; i++) { if (strcmp(arr[i], arr[i + 1]) > 0) { printf(" " COLOR_RED "[FAIL] 三向对碰错位捕获: arr[%d]='%s' 居然排在 arr[%d]='%s' 的前面!" COLOR_RESET "\n", (int)i, arr[i], (int)(i + 1), arr[i + 1]); ASSERT_TRUE(false); return; } } // 首尾下标插槽数据精准断言比对 ASSERT_TRUE(strcmp("a", arr[0]) == 0); ASSERT_TRUE(strcmp("by", arr[1]) == 0); ASSERT_TRUE(strcmp("sea", arr[2]) == 0); // 极短终止符前缀必须完美垫底最前端 ASSERT_TRUE(strcmp("shells", arr[9]) == 0); // 极短终止符前缀必须完美垫底最前端 ASSERT_TRUE(strcmp("shor", arr[10]) == 0); ASSERT_TRUE(strcmp("shore", arr[11]) == 0); ASSERT_TRUE(strcmp("z", arr[num - 1]) == 0); // 尾部大收拢正确 } TEST_CASE(test_c_Quick3string_小样本Cutoff插入专线压测) { // 🌟 10 个数据(小于阈值 15),强迫顶层在第 0 字节时就前置下触降级机制,由内联插入排序完全接管 const char* arr_short[] = { "shore", "she", "sells", "sea", "sh", "shor", "sit", "short", "a", "sea" }; c_size_t num = sizeof(arr_short) / sizeof(arr_short[0]); c_err_t err = c_Quick3string(arr_short, num, sizeof(char*), q3s_string_extractor, NULL); ASSERT_INT_EQ(C_ERR_OK, err); // 验证降级后缀插入排序后的单调非减正确性 for (c_size_t i = 0; i < num - 1; i++) { if (strcmp(arr_short[i], arr_short[i + 1]) > 0) { ASSERT_TRUE(false); return; } } ASSERT_TRUE(strcmp("a", arr_short[0]) == 0); ASSERT_TRUE(strcmp("sea", arr_short[1]) == 0); ASSERT_TRUE(strcmp("sea", arr_short[2]) == 0); // 稳定排序项紧凑排布 ASSERT_TRUE(strcmp("sh", arr_short[4]) == 0); // 短前缀完美垫底 ASSERT_TRUE(strcmp("shor", arr_short[6]) == 0); ASSERT_TRUE(strcmp("shore", arr_short[7]) == 0); ASSERT_TRUE(strcmp("short", arr_short[8]) == 0); ASSERT_TRUE(strcmp("sit", arr_short[num-1]) == 0); } // ========================================== // 5. 主集成入口 // ========================================== int main(void) { TEST_START(C_Quick3string_RigorousStandard_TestSuite); RUN_TEST(test_c_Quick3string_大容量三向划分压测); RUN_TEST(test_c_Quick3string_小样本Cutoff插入专线压测); TEST_REPORT(); RETURN_TEST_STATUS; }