Hegel 0.13.3
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
124
128 class Database {
129 public:
131 enum class Kind {
136 };
137
140 static Database unset() { return {Kind::Unset, {}}; }
141
144 static Database disabled() { return {Kind::Disabled, {}}; }
145
149 static Database from_path(std::string path) {
150 return {Kind::Path, std::move(path)};
151 }
152
154 Kind kind() const { return kind_; }
155 const std::string& path() const { return path_; }
157
158 private:
159 Database(Kind k, std::string p) : kind_(k), path_(std::move(p)) {}
160 Kind kind_;
161 std::string path_;
162 };
163
165 namespace internal {
166 // True if a CI environment is detected, by probing the variables the
167 // common CI providers set. Used as the default for
168 // Settings::derandomize so runs are reproducible under CI.
169 inline bool in_ci() {
170 // expected == nullptr means "any value present satisfies it".
171 struct CiVar {
172 const char* name;
173 const char* expected;
174 };
175 static constexpr CiVar ci_vars[] = {
176 {"CI", nullptr},
177 {"TF_BUILD", "true"},
178 {"BUILDKITE", "true"},
179 {"CIRCLECI", "true"},
180 {"CIRRUS_CI", "true"},
181 {"CODEBUILD_BUILD_ID", nullptr},
182 {"GITHUB_ACTIONS", "true"},
183 {"GITLAB_CI", nullptr},
184 {"HEROKU_TEST_RUN_ID", nullptr},
185 {"TEAMCITY_VERSION", nullptr},
186 };
187 for (const CiVar& v : ci_vars) {
188 const char* value = std::getenv(v.name);
189 if (value == nullptr) {
190 continue;
191 }
192 if (v.expected == nullptr ||
193 std::strcmp(value, v.expected) == 0) {
194 return true;
195 }
196 }
197 return false;
198 }
199 } // namespace internal
201
212 struct Settings {
215 std::optional<uint64_t> test_cases;
216
219
221 std::optional<uint64_t> seed;
222
226 bool derandomize = internal::in_ci();
227
232
239
245
249 bool print_blob = true;
250
254 internal::in_ci() ? Database::disabled() : Database::unset();
255
258 std::optional<std::string> database_key;
259
262 std::vector<HealthCheck> suppress_health_check;
263
267 std::vector<Phase> phases = all_phases();
268
272
278 };
279} // namespace hegel
Configure the Hegel database.
Definition settings.h:128
static Database disabled()
Definition settings.h:144
static Database from_path(std::string path)
Definition settings.h:149
Kind
The configuration of the database. See the methods below.
Definition settings.h:131
@ Path
Use the given directory as the database.
Definition settings.h:135
@ Disabled
Disable the database.
Definition settings.h:134
@ Unset
Definition settings.h:132
static Database unset()
Definition settings.h:140
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
NondeterminismStrictness
How a run reacts when it detects nondeterministic test behavior: a test whose structure or outcome ch...
Definition settings.h:114
@ Quiet
Definition settings.h:115
@ Warn
Definition settings.h:119
@ Error
Definition settings.h:121
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:212
bool derandomize
Definition settings.h:226
bool print_blob
Definition settings.h:249
Backend backend
Definition settings.h:271
std::optional< uint64_t > seed
Explicit seed for the test.
Definition settings.h:221
std::vector< Phase > phases
Definition settings.h:267
std::optional< std::string > database_key
Definition settings.h:258
int64_t stateful_step_count
Definition settings.h:277
std::optional< uint64_t > test_cases
Definition settings.h:215
NondeterminismStrictness nondeterminism_strictness
Definition settings.h:243
Verbosity verbosity
Verbosity level. Defaults to Verbosity::Normal.
Definition settings.h:218
Database database
Definition settings.h:253
std::vector< HealthCheck > suppress_health_check
Definition settings.h:262
bool report_multiple_failures
Definition settings.h:231
bool stop_on_first_failure
Definition settings.h:238