54 lines
1.9 KiB
C
54 lines
1.9 KiB
C
#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;
|
||
|
|
}
|