From 762fdfaa953b35ed4c402c74890c5c30155a5dab Mon Sep 17 00:00:00 2001 From: Lexi Winter Date: Tue, 1 Jul 2025 21:40:28 +0100 Subject: add some more generator tests --- nihil.generator/generator.test.cc | 64 +++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 12 deletions(-) (limited to 'nihil.generator/generator.test.cc') diff --git a/nihil.generator/generator.test.cc b/nihil.generator/generator.test.cc index 59a2c45..1782dfb 100644 --- a/nihil.generator/generator.test.cc +++ b/nihil.generator/generator.test.cc @@ -5,23 +5,62 @@ import nihil.std; import nihil.generator; -TEST_CASE("generator: basic", "[generator]") +namespace { +inline auto constexpr test_tags = "[nihil][nihil.generator]"; + +SCENARIO("A generator that yields values", test_tags) { - auto fn = [] () -> nihil::generator { - co_yield 1; - co_yield 2; - co_yield 3; - }; + GIVEN ("A generator that yields values") { + auto fn = [&]() -> nihil::generator { + co_yield 1; + co_yield 2; + }; - auto values = std::vector(); - std::ranges::copy(fn(), std::back_inserter(values)); + THEN ("The generator yields the original values") { + REQUIRE(std::ranges::equal(fn(), std::vector{1, 2})); + } + } +} - REQUIRE(values == std::vector{1, 2, 3}); +SCENARIO("A generator that yields references", test_tags) +{ + GIVEN ("A generator that yields references") { + auto one = 1, two = 2; + auto fn = [&]() -> nihil::generator { + co_yield one; + co_yield two; + }; + auto range = fn(); + + THEN ("The references refer to the original values") { + auto it = std::ranges::begin(range); + REQUIRE(&*it == &one); + ++it; + REQUIRE(&*it == &two); + ++it; + REQUIRE(it == std::ranges::end(range)); + } + } +} + +SCENARIO("A generator that yields pointers", test_tags) +{ + GIVEN ("A generator that yields pointers") { + auto one = 1, two = 2; + auto fn = [&]() -> nihil::generator { + co_yield &one; + co_yield &two; + }; + + THEN ("The pointers point to the original values") { + REQUIRE(std::ranges::equal(fn(), std::vector{&one, &two})); + } + } } -TEST_CASE("generator: exceptions", "[generator]") +TEST_CASE("generator: exceptions", "[generator]") { - auto fn = [] () -> nihil::generator { + auto fn = []() -> nihil::generator { co_yield 1; throw std::runtime_error("test"); }; @@ -32,7 +71,7 @@ TEST_CASE("generator: exceptions", "[generator]") REQUIRE_THROWS_AS(it++, std::runtime_error); } -TEST_CASE("generator: elements_of", "[generator]") +TEST_CASE("generator: elements_of", "[generator]") { auto fn1 = [] -> nihil::generator { co_yield 1; @@ -49,3 +88,4 @@ TEST_CASE("generator: elements_of", "[generator]") REQUIRE(values == std::vector{1, 2, 3}); } +} // anonymous namespace -- cgit v1.2.3