Hegel 0.11.4
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 Mode {
103 };
104
108 enum class Backend {
116 };
117
121 class Database {
122 public:
124 enum class Kind {
129 };
130
133 static Database unset() { return {Kind::Unset, {}}; }
134
137 static Database disabled() { return {Kind::Disabled, {}}; }
138
142 static Database from_path(std::string path) {
143 return {Kind::Path, std::move(path)};
144 }
145
147 Kind kind() const { return kind_; }
148 const std::string& path() const { return path_; }
150
151 private:
152 Database(Kind k, std::string p) : kind_(k), path_(std::move(p)) {}
153 Kind kind_;
154 std::string path_;
155 };
156
158 namespace internal {
159 // True if a CI environment is detected, by probing the variables the
160 // common CI providers set. Used as the default for
161 // Settings::derandomize so runs are reproducible under CI.
162 inline bool in_ci() {
163 // expected == nullptr means "any value present satisfies it".
164 struct CiVar {
165 const char* name;
166 const char* expected;
167 };
168 static constexpr CiVar ci_vars[] = {
169 {"CI", nullptr},
170 {"TF_BUILD", "true"},
171 {"BUILDKITE", "true"},
172 {"CIRCLECI", "true"},
173 {"CIRRUS_CI", "true"},
174 {"CODEBUILD_BUILD_ID", nullptr},
175 {"GITHUB_ACTIONS", "true"},
176 {"GITLAB_CI", nullptr},
177 {"HEROKU_TEST_RUN_ID", nullptr},
178 {"TEAMCITY_VERSION", nullptr},
179 };
180 for (const CiVar& v : ci_vars) {
181 const char* value = std::getenv(v.name);
182 if (value == nullptr) {
183 continue;
184 }
185 if (v.expected == nullptr ||
186 std::strcmp(value, v.expected) == 0) {
187 return true;
188 }
189 }
190 return false;
191 }
192 } // namespace internal
194
198 struct Settings {
200 std::optional<uint64_t> test_cases;
201
204
206 std::optional<uint64_t> seed;
207
211 bool derandomize = internal::in_ci();
212
217
221 bool print_blob = true;
222
226 internal::in_ci() ? Database::disabled() : Database::unset();
227
230 std::optional<std::string> database_key;
231
233 std::vector<HealthCheck> suppress_health_check;
234
238 std::vector<Phase> phases = all_phases();
239
242
246
251 };
252} // namespace hegel
Configure the Hegel database.
Definition settings.h:121
static Database disabled()
Definition settings.h:137
static Database from_path(std::string path)
Definition settings.h:142
Kind
The configuration of the database. See the methods below.
Definition settings.h:124
@ Path
Use the given directory as the database.
Definition settings.h:128
@ Disabled
Disable the database.
Definition settings.h:127
@ Unset
Definition settings.h:125
static Database unset()
Definition settings.h:133
Main namespace.
Definition config.h:29
Mode
How much of a run the engine performs.
Definition settings.h:99
@ SingleTestCase
Definition settings.h:101
@ TestRun
Full property-test run. The default.
Definition settings.h:100
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:108
@ Auto
Definition settings.h:109
@ Urandom
Definition settings.h:113
@ Default
Definition settings.h:111
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:198
Mode mode
How much of a run to perform. Defaults to Mode::TestRun.
Definition settings.h:241
bool derandomize
Definition settings.h:211
bool print_blob
Definition settings.h:221
Backend backend
Definition settings.h:245
std::optional< uint64_t > seed
Explicit seed for the test.
Definition settings.h:206
std::vector< Phase > phases
Definition settings.h:238
std::optional< std::string > database_key
Definition settings.h:230
int64_t stateful_step_count
Definition settings.h:250
std::optional< uint64_t > test_cases
Number of test cases to run. Defaults to 100.
Definition settings.h:200
Verbosity verbosity
Verbosity level. Defaults to Verbosity::Normal.
Definition settings.h:203
Database database
Definition settings.h:225
std::vector< HealthCheck > suppress_health_check
Health checks to suppress for this test.
Definition settings.h:233
bool report_multiple_failures
Definition settings.h:216