Files
2026-08-31 22:49:42 +08:00

66 lines
2.5 KiB
C

#include "c_MSD.h"
#include "c_Test.h"
#include <stdlib.h>
#include <stdio.h>
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;
}