78 lines
3.0 KiB
C
78 lines
3.0 KiB
C
#include "c_Test.h"
|
|||
|
|
#include "c_EdgeWeightedDigraph.h"
|
||
|
|
|
||
|
|
TEST_CASE(test_edge_weighted_digraph_plumbing) {
|
||
|
|
c_EdgeWeightedDigraph_t graph;
|
||
|
|
c_err_t err = c_EdgeWeightedDigraph_Init(&graph, 3, NULL);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
ASSERT_LL_EQ(3, c_EdgeWeightedDigraph_GetV(&graph));
|
||
|
|
ASSERT_LL_EQ(0, c_EdgeWeightedDigraph_GetE(&graph));
|
||
|
|
|
||
|
|
/* Inject directed edges: 0 -> 1 (W: 1.5) and 0 -> 2 (W: 4.2) */
|
||
|
|
err = c_EdgeWeightedDigraph_AddEdge(&graph, 0, 1, 1.5); ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
err = c_EdgeWeightedDigraph_AddEdge(&graph, 0, 2, 4.2); ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
ASSERT_LL_EQ(2, c_EdgeWeightedDigraph_GetE(&graph));
|
||
|
|
|
||
|
|
/* Validate O(1) degree cache outputs */
|
||
|
|
ASSERT_LL_EQ(2, c_EdgeWeightedDigraph_GetOutDegree(&graph, 0));
|
||
|
|
ASSERT_LL_EQ(0, c_EdgeWeightedDigraph_GetInDegree(&graph, 0));
|
||
|
|
ASSERT_LL_EQ(1, c_EdgeWeightedDigraph_GetInDegree(&graph, 1));
|
||
|
|
ASSERT_LL_EQ(1, c_EdgeWeightedDigraph_GetInDegree(&graph, 2));
|
||
|
|
|
||
|
|
/* Inspect outbound connections from vertex index 0 */
|
||
|
|
c_AdjList_t* zero_adj = &graph.adj_list[0];
|
||
|
|
ASSERT_INT_EQ(2, c_AdjList_GetSize(zero_adj));
|
||
|
|
|
||
|
|
c_uint_t first_edge_id = 0;
|
||
|
|
err = c_AdjList_Get(zero_adj, 0, &first_edge_id);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
/* Map back to the edge pool item row to verify its integrity */
|
||
|
|
c_DirectedEdge_t* edge1 = &graph.edges_pool[(c_size_t)first_edge_id];
|
||
|
|
ASSERT_LL_EQ(0, c_DirectedEdge_From(edge1));
|
||
|
|
ASSERT_LL_EQ(1, c_DirectedEdge_To(edge1));
|
||
|
|
ASSERT_DOUBLE_EQ_MSG(1.5, c_DirectedEdge_Weight(edge1), "Directed weight match failed");
|
||
|
|
|
||
|
|
c_EdgeWeightedDigraph_Destroy(&graph);
|
||
|
|
}
|
||
|
|
|
||
|
|
TEST_CASE(test_edge_weighted_digraph_soft_remove) {
|
||
|
|
c_EdgeWeightedDigraph_t graph;
|
||
|
|
c_err_t err = c_EdgeWeightedDigraph_Init(&graph, 3, NULL);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
/* Inject directed edges: 0 -> 1 [Edge ID: 0] and 0 -> 2 [Edge ID: 1] */
|
||
|
|
c_EdgeWeightedDigraph_AddEdge(&graph, 0, 1, 1.5);
|
||
|
|
c_EdgeWeightedDigraph_AddEdge(&graph, 0, 2, 4.2);
|
||
|
|
|
||
|
|
ASSERT_LL_EQ(2, c_EdgeWeightedDigraph_GetE(&graph));
|
||
|
|
ASSERT_LL_EQ(1, c_EdgeWeightedDigraph_GetInDegree(&graph, 1));
|
||
|
|
ASSERT_LL_EQ(2, c_EdgeWeightedDigraph_GetOutDegree(&graph, 0));
|
||
|
|
|
||
|
|
/* Remove edge 0 (0 -> 1) */
|
||
|
|
err = c_EdgeWeightedDigraph_RemoveEdge(&graph, 0);
|
||
|
|
ASSERT_INT_EQ(C_SUCCESS, err);
|
||
|
|
|
||
|
|
/* Verify that the adjacency list and degree caches accurately reflected the change */
|
||
|
|
ASSERT_LL_EQ(1, c_EdgeWeightedDigraph_GetOutDegree(&graph, 0));
|
||
|
|
ASSERT_LL_EQ(0, c_EdgeWeightedDigraph_GetInDegree(&graph, 1)); /* Should drop down to 0 */
|
||
|
|
ASSERT_LL_EQ(1, c_EdgeWeightedDigraph_GetInDegree(&graph, 2)); /* Edge 1 remains intact */
|
||
|
|
|
||
|
|
/* Ensure bounds boundary checks prevent out-of-bounds corruption */
|
||
|
|
err = c_EdgeWeightedDigraph_RemoveEdge(&graph, 99);
|
||
|
|
ASSERT_INT_EQ(C_ERR_OUTOFBOUND, err);
|
||
|
|
|
||
|
|
c_EdgeWeightedDigraph_Destroy(&graph);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int main(void) {
|
||
|
|
TEST_START(EdgeWeightedDigraph_Plumbing_Suite);
|
||
|
|
RUN_TEST(test_edge_weighted_digraph_plumbing);
|
||
|
|
RUN_TEST(test_edge_weighted_digraph_soft_remove);
|
||
|
|
TEST_REPORT();
|
||
|
|
RETURN_TEST_STATUS;
|
||
|
|
}
|