String
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user