Files

86 lines
3.5 KiB
C
Raw Permalink Normal View History

2026-08-31 22:49:42 +08:00
#include "c_Quick3string.h"
#include "c_Test.h"
#include <stdlib.h>
#include <stdio.h>
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;
}