103 lines
3.5 KiB
C
103 lines
3.5 KiB
C
#include "c_InsertionSort.h"
|
|
#include "c_Test.h"
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#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;
|
|
}
|