#include "c_InsertionSort.h" #include "c_Test.h" #include #include #include "c_StringView.h" // ========================================== // 测试用例伴生比对器 // ========================================== static int sort_compare_ints(const void* a, const void* b, void* args) { int arg1 = *(const int*)a; int arg2 = *(const int*)b; if (arg1 < arg2) return -1; if (arg1 > arg2) return 1; return 0; } static int sort_compare_string_views(const void* key, const void* elem, void* args) { return c_StringView_Cmp((c_StringView_t*)key, (c_StringView_t*)elem); } // ========================================== // 核心测试用例 // ========================================== TEST_CASE(test_c_InsertionSort_IntArray) { // 准备一个乱序的 int 数组 int arr[] = { 42, 12, 88, 5, 23, 12, 64 }; c_size_t num = sizeof(arr) / sizeof(arr[0]); // 执行泛型插入排序 c_InsertionSort(arr, num, sizeof(int), sort_compare_ints, 0); // 1. 验证排序后的数组必须呈绝对递增排列 for (c_size_t i = 0; i < num - 1; i++) { ASSERT_TRUE(arr[i] <= arr[i + 1]); } // 2. 检查特定关键点的值,确保排序精度无误 ASSERT_INT_EQ(5, arr[0]); // 最小值 ASSERT_INT_EQ(12, arr[1]); // 相同元素的稳定性保留 ASSERT_INT_EQ(12, arr[2]); ASSERT_INT_EQ(88, arr[6]); // 最大值 } TEST_CASE(test_c_InsertionSort_StringViewArray) { // 3. 核心测试:对抽取自长文本、无 \0 结束符的 StringView 数组进行排序(深度边界防护) const char* raw_pool = "banana,apple,date,cherry"; // 手工切片构建一个乱序的无拷贝视图数组 c_StringView_t sv_arr[4]; sv_arr[0] = c_StringView_FromParts(raw_pool, 6); // "banana" sv_arr[1] = c_StringView_FromParts(raw_pool + 7, 5); // "apple" sv_arr[2] = c_StringView_FromParts(raw_pool + 13, 4); // "date" sv_arr[3] = c_StringView_FromParts(raw_pool + 18, 6); // "cherry" // 针对复杂结构体数组执行泛型插入排序 c_InsertionSort(sv_arr, 4, sizeof(c_StringView_t), sort_compare_string_views, 0); // 4. 验证排序后的字典序状态 // 正确顺序应当为: "apple" (size 5) -> "banana" (size 6) -> "cherry" (size 6) -> "date" (size 4) ASSERT_INT_EQ(5, (int)sv_arr[0].size); ASSERT_TRUE(memcmp(sv_arr[0].str, "apple", 5) == 0); ASSERT_INT_EQ(6, (int)sv_arr[1].size); ASSERT_TRUE(memcmp(sv_arr[1].str, "banana", 6) == 0); ASSERT_INT_EQ(6, (int)sv_arr[2].size); ASSERT_TRUE(memcmp(sv_arr[2].str, "cherry", 6) == 0); ASSERT_INT_EQ(4, (int)sv_arr[3].size); ASSERT_TRUE(memcmp(sv_arr[3].str, "date", 4) == 0); } TEST_CASE(test_c_InsertionSort_EdgeCases) { int single_arr[] = { 99 }; // 1. 空参数及单元素安全防御,确保不发生无符号整数溢出和死循环 c_InsertionSort(NULL, 1, sizeof(int), sort_compare_ints, 0); c_InsertionSort(single_arr, 1, sizeof(int), sort_compare_ints, 0); c_InsertionSort(single_arr, 0, sizeof(int), sort_compare_ints, 0); c_InsertionSort(single_arr, 1, sizeof(int), NULL, 0); ASSERT_INT_EQ(99, single_arr[0]); } int main(int argc, char** argv){ TEST_START(Unit Tests); // 运行普通无环境要求的用例 RUN_TEST(test_c_InsertionSort_IntArray); RUN_TEST(test_c_InsertionSort_StringViewArray); RUN_TEST(test_c_InsertionSort_EdgeCases); // 打印最终统计报告 TEST_REPORT(); RETURN_TEST_STATUS; }