#include #include "helpers.hpp" #include #include #include #include "catch.hpp" using iter::repeat; TEST_CASE("repeat: one argument keeps giving value back", "[repeat]") { auto r = repeat('a'); auto it = std::begin(r); REQUIRE(*it == 'a'); ++it; REQUIRE(*it == 'a'); ++it; REQUIRE(*it == 'a'); ++it; REQUIRE(*it == 'a'); ++it; REQUIRE(*it == 'a'); } TEST_CASE("repeat: can be used as constexpr", "[repeat]") { static constexpr char c = 'a'; { constexpr auto r = repeat(c); constexpr auto i = r.begin(); constexpr char c2 = *i; static_assert(c == c2, "repeat value not as expected"); constexpr auto i2 = ++i; (void)i2; } { constexpr static auto r = repeat('a'); constexpr auto i = r.begin(); constexpr char c2 = *i; static_assert(c2 == 'a', "repeat value not as expected"); } { constexpr auto r = repeat(c, 2); constexpr auto i = r.begin(); constexpr char c2 = *i; static_assert(c2 == c, "repeat value not as expected"); } } TEST_CASE("repeat: two argument repeats a number of times", "[repeat]") { auto r = repeat('a', 3); std::string s(std::begin(r), std::end(r)); REQUIRE(s == "aaa"); } TEST_CASE("repeat: 0 count gives empty sequence", "[repeat]") { auto r = repeat('a', 0); REQUIRE(std::begin(r) == std::end(r)); } TEST_CASE("repeat: negative count gives empty sequence", "[repeat]") { auto r = repeat('a', -2); REQUIRE(std::begin(r) == std::end(r)); auto r2 = repeat('a', -1); REQUIRE(std::begin(r2) == std::end(r2)); } TEST_CASE("repeat: doesn't duplicate item", "[repeat]") { itertest::SolidInt si{2}; auto r = repeat(si); auto it = std::begin(r); (void)*it; } TEST_CASE("repeat: iterator meets requirements", "[repeat]") { auto r = repeat(1); REQUIRE(itertest::IsIterator::value); } template using ImpT = decltype(repeat(std::declval())); template using ImpT2 = decltype(repeat(std::declval(), 1)); TEST_CASE("repeat: has correct ctor and assign ops", "[repeat]") { REQUIRE(itertest::IsMoveConstructibleOnly>::value); REQUIRE(itertest::IsMoveConstructibleOnly>::value); REQUIRE(itertest::IsMoveConstructibleOnly>::value); REQUIRE(itertest::IsMoveConstructibleOnly>::value); }