72 lines
2.7 KiB
C
72 lines
2.7 KiB
C
#include "c_Test.h"
|
|
#include "c_Digraph.h"
|
|
#include "c_DirectedCycle.h"
|
|
#include "c_VertexIdList.h"
|
|
|
|
TEST_CASE(test_directed_cycle_detection_with_vertex_list) {
|
|
c_Digraph_t g;
|
|
|
|
/* 1. Initialize a directed graph with 4 vertices using the default allocator */
|
|
c_err_t err = c_Digraph_Init(&g, 4, NULL);
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
|
|
|
/*
|
|
* 2. Construct an explicit cyclical loop topology:
|
|
* 0 -> 1 -> 2 -> 0 (Cyclic core group)
|
|
* 2 -> 3 (Dead-end branch link)
|
|
*/
|
|
c_Digraph_AddEdge(&g, 0, 1);
|
|
c_Digraph_AddEdge(&g, 1, 2);
|
|
c_Digraph_AddEdge(&g, 2, 0); /* Creates back edge link closing the loop */
|
|
c_Digraph_AddEdge(&g, 2, 3);
|
|
|
|
/* 3. Initialize the cycle processing engine (explicitly passing graph's allocator) */
|
|
c_DirectedCycle_t detector;
|
|
err = c_DirectedCycle_Init(&detector, &g, &g.allocator);
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
|
|
|
/* 4. Assert that a directed cycle was successfully intercepted */
|
|
ASSERT_TRUE(c_DirectedCycle_HasCycle(&detector));
|
|
|
|
/* 5. Extract the tracked cycle loop vertices into an external c_VertexIdList_t container */
|
|
c_VertexIdList_t extracted_cycle;
|
|
c_VertexIdList_Init(&extracted_cycle, 0, NULL);
|
|
|
|
err = c_DirectedCycle_GetCycle(&detector, &extracted_cycle);
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
|
|
|
/* The cyclic sequence path count should be 4 elements long (e.g., 0 -> 1 -> 2 -> 0) */
|
|
c_size_t cycle_size = (c_size_t)c_VertexIdList_GetSize(&extracted_cycle);
|
|
ASSERT_LL_EQ(4, cycle_size);
|
|
|
|
/* 6. Verify the sequential order of vertices inside the cycle using safe c_VertexIdList_Get specs */
|
|
c_uint_t v0 = 0, v1 = 0, v2 = 0, v3 = 0;
|
|
|
|
ASSERT_INT_EQ(C_SUCCESS, c_VertexIdList_Get(&extracted_cycle, 0, &v0));
|
|
ASSERT_INT_EQ(C_SUCCESS, c_VertexIdList_Get(&extracted_cycle, 1, &v1));
|
|
ASSERT_INT_EQ(C_SUCCESS, c_VertexIdList_Get(&extracted_cycle, 2, &v2));
|
|
ASSERT_INT_EQ(C_SUCCESS, c_VertexIdList_Get(&extracted_cycle, 3, &v3));
|
|
|
|
/* A valid cycle validation check ensures the sequence loops cleanly back to its origin vertex */
|
|
ASSERT_LL_EQ(v0, v3);
|
|
|
|
/* 7. Clean up and reclaim all tracked buffer allocations safely */
|
|
c_VertexIdList_Destroy(&extracted_cycle);
|
|
c_DirectedCycle_Destroy(&detector);
|
|
c_Digraph_Destroy(&g);
|
|
}
|
|
|
|
int main(void) {
|
|
/* Bootstrapping the testing test suite environment */
|
|
TEST_START(DirectedCycle_Verification_Suite);
|
|
|
|
/* Run specified structural topology edge cases */
|
|
RUN_TEST(test_directed_cycle_detection_with_vertex_list);
|
|
|
|
/* Generate the total reporting tracking sheet metrics summary */
|
|
TEST_REPORT();
|
|
|
|
/* Unwind back with correct failure signal flag checking patterns */
|
|
RETURN_TEST_STATUS;
|
|
}
|