@@ -21,10 +21,10 @@ TEST_CASE_TEMPLATE_DEFINE(
2121 hypergraph_type hypergraph;
2222 std::vector<id_type> root_vertices;
2323
24- std::vector<id_type> expected_previsit_order;
25- std::vector<id_type> expected_postvisit_order;
24+ std::vector<id_type> expected_visit_order;
2625 std::vector<id_type> expected_pred_map;
2726 std::vector<id_type> expected_in_hyperedges;
27+ std::vector<id_type> unreachable_vertices;
2828
2929 /* Topology:
3030 V = {v0, v1, v2, v3, v4}
@@ -58,28 +58,28 @@ TEST_CASE_TEMPLATE_DEFINE(
5858
5959 SUBCASE (" single root v0 (immediate halt)" ) {
6060 root_vertices = {0u };
61- expected_previsit_order = {0u };
62- expected_postvisit_order = {0u };
61+ expected_visit_order = {0u };
6362 expected_pred_map.resize (order, hgl::invalid_id);
6463 expected_pred_map[0uz] = 0u ;
6564 expected_in_hyperedges.resize (order, hgl::invalid_id);
65+ unreachable_vertices = {1u , 2u , 3u , 4u };
6666 }
6767
6868 SUBCASE (" roots v0 and v1 (complete traversal)" ) {
6969 root_vertices = {0u , 1u };
70- expected_previsit_order = {0u , 1u , 2u , 4u , 3u };
71- expected_postvisit_order = expected_previsit_order;
70+ expected_visit_order = {0u , 1u , 2u , 4u , 3u };
7271 // v0->v0(root), v1->v1(root), v1->v2 (e0), v2->v3 (e1), v2->v4 (e2)
7372 expected_pred_map = {0u , 1u , 1u , 2u , 1u };
7473 expected_in_hyperedges = {hgl::invalid_id, hgl::invalid_id, e0 , e1 , e2 };
74+ unreachable_vertices = {};
7575 }
7676
7777 CAPTURE (hypergraph);
7878 CAPTURE (root_vertices);
79- CAPTURE (expected_previsit_order);
80- CAPTURE (expected_postvisit_order);
79+ CAPTURE (expected_visit_order);
8180 CAPTURE (expected_pred_map);
8281 CAPTURE (expected_in_hyperedges);
82+ CAPTURE (unreachable_vertices);
8383
8484 // --- noret search ---
8585
@@ -99,8 +99,8 @@ TEST_CASE_TEMPLATE_DEFINE(
9999 [&](const auto & node) { postvisit_order.push_back (node.vertex_id ); }
100100 );
101101
102- CHECK_EQ (previsit_order, expected_previsit_order );
103- CHECK_EQ (postvisit_order, expected_postvisit_order );
102+ CHECK_EQ (previsit_order, expected_visit_order );
103+ CHECK_EQ (postvisit_order, expected_visit_order );
104104 CHECK_EQ (noret_pred_map, expected_pred_map);
105105 CHECK_EQ (noret_in_hyperedges, expected_in_hyperedges);
106106
@@ -117,6 +117,12 @@ TEST_CASE_TEMPLATE_DEFINE(
117117
118118 CHECK_EQ (ret_pred_map, expected_pred_map);
119119 CHECK_EQ (ret_in_hyperedges, expected_in_hyperedges);
120+ CHECK (std::ranges::all_of (expected_visit_order, [&search_tree](const auto v_id) {
121+ return hgl::algorithm::is_reachable (search_tree, v_id);
122+ }));
123+ CHECK (std::ranges::all_of (unreachable_vertices, [&search_tree](const auto v_id) {
124+ return not hgl::algorithm::is_reachable (search_tree, v_id);
125+ }));
120126}
121127
122128TEST_CASE_TEMPLATE_INSTANTIATE (
@@ -165,10 +171,10 @@ TEST_CASE_TEMPLATE_DEFINE(
165171 hypergraph_type hypergraph;
166172 std::vector<id_type> root_vertices;
167173
168- std::vector<id_type> expected_previsit_order;
169- std::vector<id_type> expected_postvisit_order;
174+ std::vector<id_type> expected_visit_order;
170175 std::vector<id_type> expected_pred_map;
171176 std::vector<id_type> expected_in_hyperedges;
177+ std::vector<id_type> unreachable_vertices;
172178
173179 /* Topology:
174180 V = {v0, v1, v2, v3, v4}
@@ -202,11 +208,11 @@ TEST_CASE_TEMPLATE_DEFINE(
202208
203209 SUBCASE (" single root v0 (immediate halt)" ) {
204210 root_vertices = {0u };
205- expected_previsit_order = {0u };
206- expected_postvisit_order = {0u };
211+ expected_visit_order = {0u };
207212 expected_pred_map.resize (order, hgl::invalid_id);
208213 expected_pred_map[0uz] = 0u ;
209214 expected_in_hyperedges.resize (order, hgl::invalid_id);
215+ unreachable_vertices = {1u , 2u , 3u , 4u };
210216 }
211217
212218 SUBCASE (" roots v0 and v1 (complete traversal)" ) {
@@ -219,21 +225,21 @@ TEST_CASE_TEMPLATE_DEFINE(
219225 // Pop v0 -> unlocks e0 -> pushes v2.
220226 // Pop v2 -> unlocks e1 -> pushes v3, v4(visited).
221227 // Pop v3 -> no outgoing.
222- expected_previsit_order = {1u , 4u , 0u , 2u , 3u };
223- expected_postvisit_order = expected_previsit_order;
228+ expected_visit_order = {1u , 4u , 0u , 2u , 3u };
224229
225- // Notice v2's pred is v0 now! (v0 was popped after v1, unlocking e0)
226230 // v0->v0(root), v1->v1(root), v2->v0 (via e0), v3->v2 (via e1), v4->v1 (via e2)
227231 expected_pred_map = {0u , 1u , 0u , 2u , 1u };
228232 expected_in_hyperedges = {hgl::invalid_id, hgl::invalid_id, e0 , e1 , e2 };
233+
234+ unreachable_vertices = {};
229235 }
230236
231237 CAPTURE (hypergraph);
232238 CAPTURE (root_vertices);
233- CAPTURE (expected_previsit_order);
234- CAPTURE (expected_postvisit_order);
239+ CAPTURE (expected_visit_order);
235240 CAPTURE (expected_pred_map);
236241 CAPTURE (expected_in_hyperedges);
242+ CAPTURE (unreachable_vertices);
237243
238244 // --- noret search ---
239245
@@ -253,8 +259,8 @@ TEST_CASE_TEMPLATE_DEFINE(
253259 [&](const auto & node) { postvisit_order.push_back (node.vertex_id ); }
254260 );
255261
256- CHECK_EQ (previsit_order, expected_previsit_order );
257- CHECK_EQ (postvisit_order, expected_postvisit_order );
262+ CHECK_EQ (previsit_order, expected_visit_order );
263+ CHECK_EQ (postvisit_order, expected_visit_order );
258264 CHECK_EQ (noret_pred_map, expected_pred_map);
259265 CHECK_EQ (noret_in_hyperedges, expected_in_hyperedges);
260266
@@ -271,6 +277,12 @@ TEST_CASE_TEMPLATE_DEFINE(
271277
272278 CHECK_EQ (ret_pred_map, expected_pred_map);
273279 CHECK_EQ (ret_in_hyperedges, expected_in_hyperedges);
280+ CHECK (std::ranges::all_of (expected_visit_order, [&search_tree](const auto v_id) {
281+ return hgl::algorithm::is_reachable (search_tree, v_id);
282+ }));
283+ CHECK (std::ranges::all_of (unreachable_vertices, [&search_tree](const auto v_id) {
284+ return not hgl::algorithm::is_reachable (search_tree, v_id);
285+ }));
274286}
275287
276288TEST_CASE_TEMPLATE_INSTANTIATE (
0 commit comments