80 lines
2.6 KiB
C
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;
|
|
}
|