#include "c_Test.h" #include "c_Digraph.h" #include "c_TransitiveClosure.h" TEST_CASE(test_transitive_closure_reachability) { c_Digraph_t g; c_err_t err = c_Digraph_Init(&g, 4, NULL); ASSERT_INT_EQ(C_SUCCESS, err); /* Construct a graph topology: * 0 -> 1 -> 2 * 3 (Isolated component node) */ c_Digraph_AddEdge(&g, 0, 1); c_Digraph_AddEdge(&g, 1, 2); c_TransitiveClosure_t tc; err = c_TransitiveClosure_Init(&tc, &g, NULL); ASSERT_INT_EQ(C_SUCCESS, err); /* Verify standard forward reachability mappings */ ASSERT_TRUE(c_TransitiveClosure_Reachable(&tc, 0, 1)); ASSERT_TRUE(c_TransitiveClosure_Reachable(&tc, 0, 2)); /* Transitive step: 0 can reach 2 via 1 */ ASSERT_TRUE(c_TransitiveClosure_Reachable(&tc, 1, 2)); /* Verify unreachable path invariants */ ASSERT_FALSE(c_TransitiveClosure_Reachable(&tc, 2, 0)); /* Backwards parsing is invalid */ ASSERT_FALSE(c_TransitiveClosure_Reachable(&tc, 0, 3)); /* 3 is completely disconnected */ ASSERT_FALSE(c_TransitiveClosure_Reachable(&tc, 3, 2)); /* Verify safe fallback check limits on out-of-bounds queries */ ASSERT_FALSE(c_TransitiveClosure_Reachable(&tc, 0, 99)); ASSERT_FALSE(c_TransitiveClosure_Reachable(&tc, 99, 1)); c_TransitiveClosure_Destroy(&tc); c_Digraph_Destroy(&g); } int main(int argc, char** argv){ TEST_START(Component Tests); // Execution list configurations RUN_TEST(test_transitive_closure_reachability); TEST_REPORT(); RETURN_TEST_STATUS; }