Hegel 0.3.5
Property-based testing for C++
Loading...
Searching...
No Matches
builds.h
1#pragma once
2
3#include <tuple>
4
5#include "hegel/core.h"
6
7namespace hegel::generators {
8
11
35 template <typename T, typename... Gens> Generator<T> builds(Gens... gens) {
36 auto gen_tuple = std::make_tuple(std::move(gens)...);
37
38 return compose([gen_tuple](const TestCase& tc) -> T {
39 return std::apply([&tc](auto&... g) { return T(g.do_draw(tc)...); },
40 gen_tuple);
41 });
42 }
43
50 template <auto MemberPtr, typename Gen> struct Field {
51 static constexpr auto member_ptr = MemberPtr;
53 };
54
72 template <auto MemberPtr, typename Gen>
74 return Field<MemberPtr, Gen>{std::move(gen)};
75 }
76
101 template <typename T, typename... Fields>
102 Generator<T> builds_agg(Fields... fields) {
103 auto gen_tuple = std::make_tuple(std::move(fields)...);
104
105 return compose([gen_tuple](const TestCase& tc) mutable -> T {
106 T result{};
107 std::apply(
108 [&result, &tc](auto&... fs) {
109 ((result.*
110 (std::remove_reference_t<decltype(fs)>::member_ptr) =
111 fs.generator.do_draw(tc)),
112 ...);
113 },
114 gen_tuple);
115 return result;
116 });
117 }
118
120
121} // namespace hegel::generators
Handle to the currently-executing test case.
Definition test_case.h:34
The base class of all generators.
Definition core.h:157
Hegel generators.
Definition core.h:16
Generator< T > builds(Gens... gens)
Construct objects using positional constructor arguments.
Definition builds.h:35
Field< MemberPtr, Gen > field(Gen gen)
Create a field specification for builds_agg().
Definition builds.h:73
auto compose(F &&fn)
*‍/
Definition core.h:360
Generator< T > builds_agg(Fields... fields)
Construct aggregates using named field initialization.
Definition builds.h:102
Helper for named field initialization in builds_agg().
Definition builds.h:50
static constexpr auto member_ptr
The member pointer.
Definition builds.h:51
Gen generator
Generator for the field value.
Definition builds.h:52