Hegel 0.13.1
Property-based testing for C++
Loading...
Searching...
No Matches
settings.h
1#pragma once
2
3#include <cstdint>
4#include <cstdlib>
5#include <cstring>
6#include <optional>
7#include <string>
8#include <vector>
9
10namespace hegel {
20
26 inline const char* verbosity_to_string(Verbosity v) {
27 switch (v) {
29 return "quiet";
31 return "verbose";
33 return "debug";
35 default:
36 return "normal";
37 }
38 }
39
49
51 inline const char* health_check_to_string(HealthCheck c) {
52 switch (c) {
54 return "filter_too_much";
56 return "too_slow";
58 return "test_cases_too_large";
60 return "large_initial_test_case";
61 }
62 return "";
63 }
65
75
86
91 inline std::vector<Phase> all_phases() {
94 }
95
99 enum class Backend {
107 };
108
112 class Database {
113 public:
115 enum class Kind {
120 };
121
124 static Database unset() { return {Kind::Unset, {}}; }
125
128 static Database disabled() { return {Kind::Disabled, {}}; }
129
133 static Database from_path(std::string path) {
134 return {Kind::Path, std::move(path)};
135 }
136
138 Kind kind() const { return kind_; }
139 const std::string& path() const { return path_; }
141
142 private:
143 Database(Kind k, std::string p) : kind_(k), path_(std::move(p)) {}
144 Kind kind_;
145 std::string path_;
146 };
147
149 namespace internal {
150 // True if a CI environment is detected, by probing the variables the
151 // common CI providers set. Used as the default for
152 // Settings::derandomize so runs are reproducible under CI.
153 inline bool in_ci() {
154 // expected == nullptr means "any value present satisfies it".
155 struct CiVar {
156 const char* name;
157 const char* expected;
158 };
159 static constexpr CiVar ci_vars[] = {
160 {"CI", nullptr},
161 {"TF_BUILD", "true"},
162 {"BUILDKITE", "true"},
163 {"CIRCLECI", "true"},
164 {"CIRRUS_CI", "true"},
165 {"CODEBUILD_BUILD_ID", nullptr},
166 {"GITHUB_ACTIONS", "true"},
167 {"GITLAB_CI", nullptr},
168 {"HEROKU_TEST_RUN_ID", nullptr},
169 {"TEAMCITY_VERSION", nullptr},
170 };
171 for (const CiVar& v : ci_vars) {
172 const char* value = std::getenv(v.name);
173 if (value == nullptr) {
174 continue;
175 }
176 if (v.expected == nullptr ||
177 std::strcmp(value, v.expected) == 0) {
178 return true;
179 }
180 }
181 return false;
182 }
183 } // namespace internal
185
196 struct Settings {
199 std::optional<uint64_t> test_cases;
200
203
205 std::optional<uint64_t> seed;
206
210 bool derandomize = internal::in_ci();
211
216
220 bool print_blob = true;
221
225 internal::in_ci() ? Database::disabled() : Database::unset();
226
229 std::optional<std::string> database_key;
230
233 std::vector<HealthCheck> suppress_health_check;
234
238 std::vector<Phase> phases = all_phases();
239
243
249 };
250} // namespace hegel
Configure the Hegel database.
Definition settings.h:112
static Database disabled()
Definition settings.h:128
static Database from_path(std::string path)
Definition settings.h:133
Kind
The configuration of the database. See the methods below.
Definition settings.h:115
@ Path
Use the given directory as the database.
Definition settings.h:119
@ Disabled
Disable the database.
Definition settings.h:118
@ Unset
Definition settings.h:116
static Database unset()
Definition settings.h:124
Main namespace.
Definition config.h:29
const char * verbosity_to_string(Verbosity v)
Convert Verbosity enum to command-line string.
Definition settings.h:26
Backend
Source of randomness the engine draws from.
Definition settings.h:99
@ Auto
Definition settings.h:100
@ Urandom
Definition settings.h:104
@ Default
Definition settings.h:102
HealthCheck
Health checks.
Definition settings.h:43
@ TestCasesTooLarge
Generated test cases are too large.
Definition settings.h:46
@ TooSlow
Test cases are running too slowly.
Definition settings.h:45
@ FilterTooMuch
Test filters out too many generated examples.
Definition settings.h:44
@ LargeInitialTestCase
First generated test case is unusually large.
Definition settings.h:47
std::vector< HealthCheck > all_health_checks()
All health checks, suitable for full suppression.
Definition settings.h:70
Verbosity
Verbosity levels.
Definition settings.h:14
@ Quiet
Minimal output (used by TUI).
Definition settings.h:15
@ Normal
Default - standard test output.
Definition settings.h:16
@ Debug
Maximum verbosity + engine-side shrinker tracing.
Definition settings.h:18
@ Verbose
More detailed output.
Definition settings.h:17
std::vector< Phase > all_phases()
All phases, the default for Settings::phases.
Definition settings.h:91
Phase
Phases of a property-test run.
Definition settings.h:79
@ Shrink
Shrink failing examples toward minimal counterexamples.
Definition settings.h:84
@ Generate
Randomly generate fresh test cases.
Definition settings.h:82
@ Explicit
Run hard-coded explicit examples.
Definition settings.h:80
@ Target
Hill-climb toward observed target scores.
Definition settings.h:83
@ Reuse
Replay counterexamples persisted in the database.
Definition settings.h:81
Configuration options for hegel::test().
Definition settings.h:196
bool derandomize
Definition settings.h:210
bool print_blob
Definition settings.h:220
Backend backend
Definition settings.h:242
std::optional< uint64_t > seed
Explicit seed for the test.
Definition settings.h:205
std::vector< Phase > phases
Definition settings.h:238
std::optional< std::string > database_key
Definition settings.h:229
int64_t stateful_step_count
Definition settings.h:248
std::optional< uint64_t > test_cases
Definition settings.h:199
Verbosity verbosity
Verbosity level. Defaults to Verbosity::Normal.
Definition settings.h:202
Database database
Definition settings.h:224
std::vector< HealthCheck > suppress_health_check
Definition settings.h:233
bool report_multiple_failures
Definition settings.h:215