From: Maxwell Pirtle Date: Tue, 7 Mar 2023 08:10:58 +0000 (+0100) Subject: Add some basic tests for variable_for_loop X-Git-Tag: v3.34~362^2 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f6d79f0d52fecb70338e9028adeafe5b196ea4a2 Add some basic tests for variable_for_loop Some tests were added to confirm that the variable_for_loop iterator behaved as expected. --- diff --git a/src/xbt/utils/iter/subsets_tests.cpp b/src/xbt/utils/iter/subsets_tests.cpp index 45908d7953..41bdf419ee 100644 --- a/src/xbt/utils/iter/subsets_tests.cpp +++ b/src/xbt/utils/iter/subsets_tests.cpp @@ -75,9 +75,9 @@ TEST_CASE("simgrid::xbt::variable_for_loop: Edge Cases") { // Note the extra `{}` in the tests. This constructs a // `std::reference_wrapper` to the specified collection - std::vector outer_loop1{0, 1, 2, 3, 4, 5, 6, 7}; + std::vector outer_loop1{0, 1, 2, 3, 4}; std::vector outer_loop2{0, 1, 6, 7}; - std::vector outer_loop3{0}; + std::vector outer_loop3{1, 2}; std::vector empty_set; SECTION("Iterations without effect") @@ -128,5 +128,63 @@ TEST_CASE("simgrid::xbt::variable_for_loop: Edge Cases") REQUIRE(elements_seen == outer_loop1); } + + SECTION("Iteration over two collections yields all pairs") + { + variable_for_loop> first{{outer_loop1, outer_loop2}}; + variable_for_loop> last; + + std::vector> pairs_seen; + for (; first != last; ++first) { + const auto& elements = *first; + REQUIRE(elements.size() == 2); + pairs_seen.push_back(std::make_pair(*elements[0], *elements[1])); + } + + std::vector> expected_pairs{{0, 0}, {0, 1}, {0, 6}, {0, 7}, {1, 0}, {1, 1}, {1, 6}, + {1, 7}, {2, 0}, {2, 1}, {2, 6}, {2, 7}, {3, 0}, {3, 1}, + {3, 6}, {3, 7}, {4, 0}, {4, 1}, {4, 6}, {4, 7}}; + REQUIRE(pairs_seen == expected_pairs); + } + + SECTION("Iteration over three collections yields all triples") + { + variable_for_loop> first{{outer_loop3, outer_loop1, outer_loop2}}; + variable_for_loop> last; + + std::vector> triples_seen; + for (; first != last; ++first) { + const auto& elements = *first; + REQUIRE(elements.size() == 3); + triples_seen.push_back(std::make_tuple(*elements[0], *elements[1], *elements[2])); + } + + std::vector> expected_triples{ + {1, 0, 0}, {1, 0, 1}, {1, 0, 6}, {1, 0, 7}, {1, 1, 0}, {1, 1, 1}, {1, 1, 6}, {1, 1, 7}, {1, 2, 0}, {1, 2, 1}, + {1, 2, 6}, {1, 2, 7}, {1, 3, 0}, {1, 3, 1}, {1, 3, 6}, {1, 3, 7}, {1, 4, 0}, {1, 4, 1}, {1, 4, 6}, {1, 4, 7}, + + {2, 0, 0}, {2, 0, 1}, {2, 0, 6}, {2, 0, 7}, {2, 1, 0}, {2, 1, 1}, {2, 1, 6}, {2, 1, 7}, {2, 2, 0}, {2, 2, 1}, + {2, 2, 6}, {2, 2, 7}, {2, 3, 0}, {2, 3, 1}, {2, 3, 6}, {2, 3, 7}, {2, 4, 0}, {2, 4, 1}, {2, 4, 6}, {2, 4, 7}}; + + REQUIRE(triples_seen == expected_triples); + } + + SECTION("Iteration over all collections yields all combinations") + { + std::vector outer_loop4{1, 5}; + std::vector outer_loop5{1, 8}; + + variable_for_loop> first{ + {outer_loop1}, {outer_loop2}, {outer_loop3}, {outer_loop4}, {outer_loop5}}; + variable_for_loop> last; + + size_t total_iterations = 0; + for (; first != last; ++first, ++total_iterations) { + const auto& elements = *first; + REQUIRE(elements.size() == 5); + } + REQUIRE(total_iterations == + (outer_loop1.size() * outer_loop2.size() * outer_loop3.size() * outer_loop4.size() * outer_loop5.size())); + } } } \ No newline at end of file