Files
cKit/Sort/c_BinaryInsertionSort.t.c
2026-08-30 22:24:45 +08:00

80 lines
2.6 KiB
C

#include "c_BinaryInsertionSort.h"
#include "c_Test.h"
#include <stdlib.h>
#include <stdio.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;
}
TEST_CASE(test_c_BinaryInsertionSort_IntArray) {
// 1. 测试基础整型数据的二分插入重排
int arr[] = { 34, 12, 5, 56, 12, 1, 90 };
c_size_t num = sizeof(arr) / sizeof(arr[0]);
c_BinaryInsertionSort(arr, num, sizeof(int), sort_compare_ints, 0);
// 验证全区间是否呈绝对严格递增排列
for (c_size_t i = 0; i < num - 1; i++) {
ASSERT_TRUE(arr[i] <= arr[i + 1]);
}
ASSERT_INT_EQ(1, arr[0]); // 最小值
ASSERT_INT_EQ(12, arr[2]); // 保持稳定性
ASSERT_INT_EQ(12, arr[3]);
ASSERT_INT_EQ(90, arr[6]); // 最大值
}
TEST_CASE(test_c_BinaryInsertionSort_ReverseAndEdge) {
// 3. 压测完全倒序的极值数组,确保 low/high 边界收缩时无溢出
int rev_arr[] = { 5, 4, 3, 2, 1 };
c_BinaryInsertionSort(rev_arr, 5, sizeof(int), sort_compare_ints, 0);
for (c_size_t i = 0; i < 4; i++) {
ASSERT_TRUE(rev_arr[i] < rev_arr[i + 1]);
}
// 4. 空指针与单元素数组的安全防御
int single_arr[] = { 77 };
c_BinaryInsertionSort(single_arr, 1, sizeof(int), sort_compare_ints, 0);
c_BinaryInsertionSort(NULL, 0, sizeof(int), sort_compare_ints, 0);
ASSERT_INT_EQ(77, single_arr[0]);
}
TEST_CASE(test_c_BinaryInsertionSort_Underflow) {
// 准备一个完全倒序的数组。
// 在旧代码中,由于新元素每次都比前面的小,会导致 while 内部频繁引发 high = 0 - 1 = UINT64_MAX 从而死循环卡死。
int toxic_arr[] = { 5, 4, 3, 2, 1 };
c_size_t num = sizeof(toxic_arr) / sizeof(toxic_arr[0]);
// 运行安全修改后的无符号排序
c_BinaryInsertionSort(toxic_arr, num, sizeof(int), sort_compare_ints, NULL);
// 1. 验证没有发生卡死或崩溃,且全区间呈绝对严格递增排列
for (c_size_t i = 0; i < num - 1; i++) {
ASSERT_TRUE(toxic_arr[i] < toxic_arr[i + 1]);
}
// 2. 精准校验边界项
ASSERT_INT_EQ(1, toxic_arr[0]);
ASSERT_INT_EQ(5, toxic_arr[4]);
}
int main(int argc, char** argv){
TEST_START(Unit Tests);
// 运行普通无环境要求的用例
RUN_TEST(test_c_BinaryInsertionSort_IntArray);
RUN_TEST(test_c_BinaryInsertionSort_ReverseAndEdge);
RUN_TEST(test_c_BinaryInsertionSort_Underflow);
// 打印最终统计报告
TEST_REPORT();
RETURN_TEST_STATUS;
}