#include "c_MSD.h" #include "c_Test.h" #include #include static int string_msd_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; // 🌟【完美契合契约】:若当前寻位 d 超出其字符串物理长度,抛出终止哨兵 } return (int)((unsigned char)str[d]); // 返回对应无符号字符代码 } TEST_CASE(test_c_MSD_RadixSort_VariableLengthStrings) { // 声明一组长度严重参差不齐、带有相同前缀干扰项的变长变长堆字符串数组 const char* arr[] = { "she", "sells", "seashells", "by", "the", "sea", "shore", "the", "shells", "she" }; c_size_t num = sizeof(arr) / sizeof(arr[0]); // 激活 MSD 基数排序:单体大为指针 sizeof(char*),无须传入 w_bytes c_err_t err = c_MSD_RadixSort(arr, num, sizeof(char*), string_msd_extractor, NULL, &c_DefaultAllocator); 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) { // 抛出数据乱序冲突拦截 ASSERT_TRUE(false); return; } } // 精确的字典升序插槽下标内容比对验证 ASSERT_TRUE(strcmp("by", arr[0]) == 0); ASSERT_TRUE(strcmp("sea", arr[1]) == 0); ASSERT_TRUE(strcmp("seashells", arr[2]) == 0); ASSERT_TRUE(strcmp("sells", arr[3]) == 0); ASSERT_TRUE(strcmp("she", arr[4]) == 0); // 稳定去重项紧凑对齐 ASSERT_TRUE(strcmp("the", arr[num - 1]) == 0); // 尾部合拢正确 } TEST_CASE(test_c_MSD_RadixSort_Boundaries) { const char* single[] = { "hello" }; // 验证非法及单元素边界 ASSERT_INT_EQ(C_ERR_PARAM, c_MSD_RadixSort(NULL, 5, sizeof(char*), string_msd_extractor, NULL, NULL)); ASSERT_INT_EQ(C_ERR_PARAM, c_MSD_RadixSort((void*)single, 1, 0, string_msd_extractor, NULL, NULL)); ASSERT_INT_EQ(C_ERR_OK, c_MSD_RadixSort((void*)single, 1, sizeof(char*), string_msd_extractor, NULL, NULL)); } // ========================================== // 5. 主集成入口 // ========================================== int main(void) { TEST_START(C_MSD_RadixSort_PolymorphicVariable_TestSuite); RUN_TEST(test_c_MSD_RadixSort_VariableLengthStrings); RUN_TEST(test_c_MSD_RadixSort_Boundaries); TEST_REPORT(); RETURN_TEST_STATUS; }