Files

54 lines
1.9 KiB
C
Raw Permalink Normal View History

2026-09-07 18:48:16 +08:00
#include "c_Test.h"
#include "c_EdgeWeightedDigraph.h"
#include "c_EdgeWeightedDirectedCycle.h"
#include "c_VertexIdList.h"
TEST_CASE(test_edge_weighted_directed_cycle_detection) {
c_EdgeWeightedDigraph_t g;
c_err_t err = c_EdgeWeightedDigraph_Init(&g, 3, NULL);
ASSERT_INT_EQ(C_SUCCESS, err);
/* Construct a simple cyclic network loop topology:
* 0 -> 1 (Weight: 1.5) [Edge ID: 0]
* 1 -> 2 (Weight: 2.3) [Edge ID: 1]
* 2 -> 0 (Weight: 0.8) [Edge ID: 2] -> Closes the cycle
*/
c_EdgeWeightedDigraph_AddEdge(&g, 0, 1, 1.5);
c_EdgeWeightedDigraph_AddEdge(&g, 1, 2, 2.3);
c_EdgeWeightedDigraph_AddEdge(&g, 2, 0, 0.8);
c_EdgeWeightedDirectedCycle_t detector;
err = c_EdgeWeightedDirectedCycle_Init(&detector, &g, &g.allocator);
ASSERT_INT_EQ(C_SUCCESS, err);
/* Assert that a cycle is captured */
ASSERT_TRUE(c_EdgeWeightedDirectedCycle_HasCycle(&detector));
c_VertexIdList_t extracted;
c_VertexIdList_Init(&extracted, 0, 0);
err = c_EdgeWeightedDirectedCycle_GetCycle(&detector, &extracted);
ASSERT_INT_EQ(C_SUCCESS, err);
/* The loop cycle size must match exactly 3 edge elements */
c_size_t cycle_size = (c_size_t)c_VertexIdList_GetSize(&extracted);
ASSERT_LL_EQ(3, cycle_size);
/* Verify the extracted sequential edge tokens order matches forward travel steps */
c_uint_t e0 = 0, e1 = 0, e2 = 0;
c_VertexIdList_Get(&extracted, 0, &e0); ASSERT_LL_EQ(0, e0); /* Edge 0 (0->1) */
c_VertexIdList_Get(&extracted, 1, &e1); ASSERT_LL_EQ(1, e1); /* Edge 1 (1->2) */
c_VertexIdList_Get(&extracted, 2, &e2); ASSERT_LL_EQ(2, e2); /* Edge 2 (2->0) */
c_VertexIdList_Destroy(&extracted);
c_EdgeWeightedDirectedCycle_Destroy(&detector);
c_EdgeWeightedDigraph_Destroy(&g);
}
int main(void) {
TEST_START(EdgeWeightedDirectedCycle_Suite);
RUN_TEST(test_edge_weighted_directed_cycle_detection);
TEST_REPORT();
RETURN_TEST_STATUS;
}