aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLexi Winter <lexi@le-fay.org>2025-07-01 21:40:28 +0100
committerLexi Winter <lexi@le-fay.org>2025-07-01 21:40:28 +0100
commit762fdfaa953b35ed4c402c74890c5c30155a5dab (patch)
treec2fcc4272d7d7739fdbfb45cadf4c9ba6a7581e3
parent85baf16dd366fb501dc522a0957ec680dc9478f0 (diff)
downloadnihil-762fdfaa953b35ed4c402c74890c5c30155a5dab.tar.gz
nihil-762fdfaa953b35ed4c402c74890c5c30155a5dab.tar.bz2
add some more generator tests
-rw-r--r--nihil.generator/generator.test.cc64
1 files changed, 52 insertions, 12 deletions
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<int> {
- co_yield 1;
- co_yield 2;
- co_yield 3;
- };
+ GIVEN ("A generator that yields values") {
+ auto fn = [&]() -> nihil::generator<int> {
+ co_yield 1;
+ co_yield 2;
+ };
- auto values = std::vector<int>();
- 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<int &> {
+ 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<int *> {
+ 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<int> {
+ auto fn = []() -> nihil::generator<int> {
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<int> {
co_yield 1;
@@ -49,3 +88,4 @@ TEST_CASE("generator: elements_of", "[generator]")
REQUIRE(values == std::vector{1, 2, 3});
}
+} // anonymous namespace