#include "c_MinPQ.h" #include "c_Test.h" #include #include 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; }