81 lines
2.5 KiB
C
81 lines
2.5 KiB
C
#include "c_MinPQ.h"
|
|
#include "c_Test.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
static int min_pq_compare_ints(const void* a, const void* b, void* args) {
|
|
(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_MinPQ_FullChainStatusCodes) {
|
|
c_MinPQ_t pq;
|
|
// 就地初始化
|
|
c_err_t err = c_MinPQ_Init(&pq, 2, sizeof(int), min_pq_compare_ints, NULL, &c_DefaultAllocator);
|
|
ASSERT_INT_EQ(C_ERR_OK, err);
|
|
|
|
// 1. 验证初次空堆下的 Pop 和 Peek 是否完美返回 C_ERR_EMPTY
|
|
int dummy = 0;
|
|
ASSERT_INT_EQ(C_ERR_EMPTY, c_MinPQ_Pop(&pq, &dummy));
|
|
ASSERT_INT_EQ(C_ERR_EMPTY, c_MinPQ_Peek(&pq, &dummy));
|
|
|
|
int data[] = { 45, 12, 85, 4, 67 };
|
|
c_size_t num = sizeof(data) / sizeof(data[0]);
|
|
|
|
for (c_size_t i = 0; i < num; i++) {
|
|
// 2. 验证规范后的 Push 返回状态码
|
|
ASSERT_INT_EQ(C_ERR_OK, c_MinPQ_Push(&pq, &data[i]));
|
|
}
|
|
ASSERT_INT_EQ((int)num, (int)pq.size);
|
|
|
|
int previous_extracted = -999999;
|
|
int current_extracted = 0;
|
|
|
|
// 3. 验证连续循环弹出状态链
|
|
while (pq.size > 0) {
|
|
ASSERT_INT_EQ(C_ERR_OK, c_MinPQ_Peek(&pq, ¤t_extracted));
|
|
|
|
int pop_verify = 0;
|
|
ASSERT_INT_EQ(C_ERR_OK, c_MinPQ_Pop(&pq, &pop_verify));
|
|
ASSERT_INT_EQ(current_extracted, pop_verify);
|
|
|
|
// 验证最小堆单调递增性
|
|
ASSERT_TRUE(previous_extracted <= current_extracted);
|
|
previous_extracted = current_extracted;
|
|
}
|
|
|
|
// 4. 彻底清空后,再次断言状态码归回 C_ERR_EMPTY
|
|
ASSERT_INT_EQ(C_ERR_EMPTY, c_MinPQ_Pop(&pq, &dummy));
|
|
|
|
c_MinPQ_Destroy(&pq);
|
|
}
|
|
|
|
TEST_CASE(test_c_MinPQ_ParamDefenses) {
|
|
c_MinPQ_t local_pq;
|
|
c_MinPQ_Init(&local_pq, 4, sizeof(int), min_pq_compare_ints, NULL, NULL);
|
|
|
|
int item = 42;
|
|
// 5. 验证各底层核心函数对非法入参的 C_ERR_PARAM 拦截线
|
|
ASSERT_INT_EQ(C_ERR_PARAM, c_MinPQ_Init(NULL, 4, sizeof(int), min_pq_compare_ints, NULL, NULL));
|
|
ASSERT_INT_EQ(C_ERR_PARAM, c_MinPQ_Push(NULL, &item));
|
|
ASSERT_INT_EQ(C_ERR_PARAM, c_MinPQ_Pop(NULL, &item));
|
|
ASSERT_INT_EQ(C_ERR_PARAM, c_MinPQ_Peek(NULL, &item));
|
|
ASSERT_INT_EQ(C_ERR_PARAM, c_MinPQ_Peek(&local_pq, NULL));
|
|
|
|
c_MinPQ_Destroy(&local_pq);
|
|
}
|
|
|
|
int main(int argc, char** argv){
|
|
|
|
TEST_START(C_MinPQ_FullChainStatus_TestSuite);
|
|
RUN_TEST(test_c_MinPQ_FullChainStatusCodes);
|
|
RUN_TEST(test_c_MinPQ_ParamDefenses);
|
|
TEST_REPORT();
|
|
RETURN_TEST_STATUS;
|
|
}
|