1 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 file Copyright.txt or https://cmake.org/licensing for details. */
10 #include <cm/optional>
11 #include <cmext/string_view>
13 #include <cm3p/json/value.h>
15 #include "cmCMakePresetsGraph.h"
16 #include "cmCMakePresetsGraphInternal.h"
17 #include "cmJSONHelpers.h"
19 #include "CTest/cmCTestTypes.h"
22 using ReadFileResult = cmCMakePresetsGraph::ReadFileResult;
23 using TestPreset = cmCMakePresetsGraph::TestPreset;
24 using JSONHelperBuilder = cmJSONHelperBuilder<ReadFileResult>;
26 ReadFileResult TestPresetOutputVerbosityHelper(
27 TestPreset::OutputOptions::VerbosityEnum& out, const Json::Value* value)
30 out = TestPreset::OutputOptions::VerbosityEnum::Default;
31 return ReadFileResult::READ_OK;
34 if (!value->isString()) {
35 return ReadFileResult::INVALID_PRESET;
38 if (value->asString() == "default") {
39 out = TestPreset::OutputOptions::VerbosityEnum::Default;
40 return ReadFileResult::READ_OK;
43 if (value->asString() == "verbose") {
44 out = TestPreset::OutputOptions::VerbosityEnum::Verbose;
45 return ReadFileResult::READ_OK;
48 if (value->asString() == "extra") {
49 out = TestPreset::OutputOptions::VerbosityEnum::Extra;
50 return ReadFileResult::READ_OK;
53 return ReadFileResult::INVALID_PRESET;
56 auto const TestPresetOptionalOutputVerbosityHelper =
57 JSONHelperBuilder::Optional<TestPreset::OutputOptions::VerbosityEnum>(
58 ReadFileResult::READ_OK, TestPresetOutputVerbosityHelper);
60 ReadFileResult TestPresetOutputTruncationHelper(
61 cm::optional<cmCTestTypes::TruncationMode>& out, const Json::Value* value)
65 return ReadFileResult::READ_OK;
68 if (!value->isString()) {
69 return ReadFileResult::INVALID_PRESET;
72 if (value->asString() == "tail") {
73 out = cmCTestTypes::TruncationMode::Tail;
74 return ReadFileResult::READ_OK;
77 if (value->asString() == "middle") {
78 out = cmCTestTypes::TruncationMode::Middle;
79 return ReadFileResult::READ_OK;
82 if (value->asString() == "head") {
83 out = cmCTestTypes::TruncationMode::Head;
84 return ReadFileResult::READ_OK;
87 return ReadFileResult::INVALID_PRESET;
90 auto const TestPresetOptionalOutputHelper =
91 JSONHelperBuilder::Optional<TestPreset::OutputOptions>(
92 ReadFileResult::READ_OK,
93 JSONHelperBuilder::Object<TestPreset::OutputOptions>(
94 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
95 .Bind("shortProgress"_s, &TestPreset::OutputOptions::ShortProgress,
96 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
97 .Bind("verbosity"_s, &TestPreset::OutputOptions::Verbosity,
98 TestPresetOptionalOutputVerbosityHelper, false)
99 .Bind("debug"_s, &TestPreset::OutputOptions::Debug,
100 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
101 .Bind("outputOnFailure"_s, &TestPreset::OutputOptions::OutputOnFailure,
102 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
103 .Bind("quiet"_s, &TestPreset::OutputOptions::Quiet,
104 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
105 .Bind("outputLogFile"_s, &TestPreset::OutputOptions::OutputLogFile,
106 cmCMakePresetsGraphInternal::PresetStringHelper, false)
107 .Bind("labelSummary"_s, &TestPreset::OutputOptions::LabelSummary,
108 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
109 .Bind("subprojectSummary"_s,
110 &TestPreset::OutputOptions::SubprojectSummary,
111 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
112 .Bind("maxPassedTestOutputSize"_s,
113 &TestPreset::OutputOptions::MaxPassedTestOutputSize,
114 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
115 .Bind("maxFailedTestOutputSize"_s,
116 &TestPreset::OutputOptions::MaxFailedTestOutputSize,
117 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
118 .Bind("testOutputTruncation"_s,
119 &TestPreset::OutputOptions::TestOutputTruncation,
120 TestPresetOutputTruncationHelper, false)
121 .Bind("maxTestNameWidth"_s, &TestPreset::OutputOptions::MaxTestNameWidth,
122 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false));
124 auto const TestPresetOptionalFilterIncludeIndexObjectHelper =
125 JSONHelperBuilder::Optional<TestPreset::IncludeOptions::IndexOptions>(
126 ReadFileResult::READ_OK,
127 JSONHelperBuilder::Object<TestPreset::IncludeOptions::IndexOptions>(
128 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
129 .Bind("start"_s, &TestPreset::IncludeOptions::IndexOptions::Start,
130 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
131 .Bind("end"_s, &TestPreset::IncludeOptions::IndexOptions::End,
132 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
133 .Bind("stride"_s, &TestPreset::IncludeOptions::IndexOptions::Stride,
134 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
135 .Bind("specificTests"_s,
136 &TestPreset::IncludeOptions::IndexOptions::SpecificTests,
137 cmCMakePresetsGraphInternal::PresetVectorIntHelper, false));
139 ReadFileResult TestPresetOptionalFilterIncludeIndexHelper(
140 cm::optional<TestPreset::IncludeOptions::IndexOptions>& out,
141 const Json::Value* value)
145 return ReadFileResult::READ_OK;
148 if (value->isString()) {
150 out->IndexFile = value->asString();
151 return ReadFileResult::READ_OK;
154 if (value->isObject()) {
155 return TestPresetOptionalFilterIncludeIndexObjectHelper(out, value);
158 return ReadFileResult::INVALID_PRESET;
161 auto const TestPresetOptionalFilterIncludeHelper =
162 JSONHelperBuilder::Optional<TestPreset::IncludeOptions>(
163 ReadFileResult::READ_OK,
164 JSONHelperBuilder::Object<TestPreset::IncludeOptions>(
165 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
166 .Bind("name"_s, &TestPreset::IncludeOptions::Name,
167 cmCMakePresetsGraphInternal::PresetStringHelper, false)
168 .Bind("label"_s, &TestPreset::IncludeOptions::Label,
169 cmCMakePresetsGraphInternal::PresetStringHelper, false)
170 .Bind("index"_s, &TestPreset::IncludeOptions::Index,
171 TestPresetOptionalFilterIncludeIndexHelper, false)
172 .Bind("useUnion"_s, &TestPreset::IncludeOptions::UseUnion,
173 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false));
175 auto const TestPresetOptionalFilterExcludeFixturesHelper =
176 JSONHelperBuilder::Optional<TestPreset::ExcludeOptions::FixturesOptions>(
177 ReadFileResult::READ_OK,
178 JSONHelperBuilder::Object<TestPreset::ExcludeOptions::FixturesOptions>(
179 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
180 .Bind("any"_s, &TestPreset::ExcludeOptions::FixturesOptions::Any,
181 cmCMakePresetsGraphInternal::PresetStringHelper, false)
182 .Bind("setup"_s, &TestPreset::ExcludeOptions::FixturesOptions::Setup,
183 cmCMakePresetsGraphInternal::PresetStringHelper, false)
184 .Bind("cleanup"_s, &TestPreset::ExcludeOptions::FixturesOptions::Cleanup,
185 cmCMakePresetsGraphInternal::PresetStringHelper, false));
187 auto const TestPresetOptionalFilterExcludeHelper =
188 JSONHelperBuilder::Optional<TestPreset::ExcludeOptions>(
189 ReadFileResult::READ_OK,
190 JSONHelperBuilder::Object<TestPreset::ExcludeOptions>(
191 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
192 .Bind("name"_s, &TestPreset::ExcludeOptions::Name,
193 cmCMakePresetsGraphInternal::PresetStringHelper, false)
194 .Bind("label"_s, &TestPreset::ExcludeOptions::Label,
195 cmCMakePresetsGraphInternal::PresetStringHelper, false)
196 .Bind("fixtures"_s, &TestPreset::ExcludeOptions::Fixtures,
197 TestPresetOptionalFilterExcludeFixturesHelper, false));
199 ReadFileResult TestPresetExecutionShowOnlyHelper(
200 TestPreset::ExecutionOptions::ShowOnlyEnum& out, const Json::Value* value)
202 if (!value || !value->isString()) {
203 return ReadFileResult::INVALID_PRESET;
206 if (value->asString() == "human") {
207 out = TestPreset::ExecutionOptions::ShowOnlyEnum::Human;
208 return ReadFileResult::READ_OK;
211 if (value->asString() == "json-v1") {
212 out = TestPreset::ExecutionOptions::ShowOnlyEnum::JsonV1;
213 return ReadFileResult::READ_OK;
216 return ReadFileResult::INVALID_PRESET;
219 auto const TestPresetOptionalExecutionShowOnlyHelper =
220 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::ShowOnlyEnum>(
221 ReadFileResult::READ_OK, TestPresetExecutionShowOnlyHelper);
223 ReadFileResult TestPresetExecutionModeHelper(
224 TestPreset::ExecutionOptions::RepeatOptions::ModeEnum& out,
225 const Json::Value* value)
228 return ReadFileResult::READ_OK;
231 if (!value->isString()) {
232 return ReadFileResult::INVALID_PRESET;
235 if (value->asString() == "until-fail") {
236 out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilFail;
237 return ReadFileResult::READ_OK;
240 if (value->asString() == "until-pass") {
241 out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilPass;
242 return ReadFileResult::READ_OK;
245 if (value->asString() == "after-timeout") {
246 out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::AfterTimeout;
247 return ReadFileResult::READ_OK;
250 return ReadFileResult::INVALID_PRESET;
253 auto const TestPresetOptionalExecutionRepeatHelper =
254 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::RepeatOptions>(
255 ReadFileResult::READ_OK,
256 JSONHelperBuilder::Object<TestPreset::ExecutionOptions::RepeatOptions>(
257 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
258 .Bind("mode"_s, &TestPreset::ExecutionOptions::RepeatOptions::Mode,
259 TestPresetExecutionModeHelper, true)
260 .Bind("count"_s, &TestPreset::ExecutionOptions::RepeatOptions::Count,
261 cmCMakePresetsGraphInternal::PresetIntHelper, true));
263 ReadFileResult TestPresetExecutionNoTestsActionHelper(
264 TestPreset::ExecutionOptions::NoTestsActionEnum& out,
265 const Json::Value* value)
268 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
269 return ReadFileResult::READ_OK;
272 if (!value->isString()) {
273 return ReadFileResult::INVALID_PRESET;
276 if (value->asString() == "default") {
277 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
278 return ReadFileResult::READ_OK;
281 if (value->asString() == "error") {
282 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Error;
283 return ReadFileResult::READ_OK;
286 if (value->asString() == "ignore") {
287 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Ignore;
288 return ReadFileResult::READ_OK;
291 return ReadFileResult::INVALID_PRESET;
294 auto const TestPresetOptionalExecutionNoTestsActionHelper =
295 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::NoTestsActionEnum>(
296 ReadFileResult::READ_OK, TestPresetExecutionNoTestsActionHelper);
298 auto const TestPresetExecutionHelper =
299 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions>(
300 ReadFileResult::READ_OK,
301 JSONHelperBuilder::Object<TestPreset::ExecutionOptions>(
302 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
303 .Bind("stopOnFailure"_s, &TestPreset::ExecutionOptions::StopOnFailure,
304 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
305 .Bind("enableFailover"_s, &TestPreset::ExecutionOptions::EnableFailover,
306 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
307 .Bind("jobs"_s, &TestPreset::ExecutionOptions::Jobs,
308 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
309 .Bind("resourceSpecFile"_s,
310 &TestPreset::ExecutionOptions::ResourceSpecFile,
311 cmCMakePresetsGraphInternal::PresetStringHelper, false)
312 .Bind("testLoad"_s, &TestPreset::ExecutionOptions::TestLoad,
313 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
314 .Bind("showOnly"_s, &TestPreset::ExecutionOptions::ShowOnly,
315 TestPresetOptionalExecutionShowOnlyHelper, false)
316 .Bind("repeat"_s, &TestPreset::ExecutionOptions::Repeat,
317 TestPresetOptionalExecutionRepeatHelper, false)
318 .Bind("interactiveDebugging"_s,
319 &TestPreset::ExecutionOptions::InteractiveDebugging,
320 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
321 .Bind("scheduleRandom"_s, &TestPreset::ExecutionOptions::ScheduleRandom,
322 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
323 .Bind("timeout"_s, &TestPreset::ExecutionOptions::Timeout,
324 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
325 .Bind("noTestsAction"_s, &TestPreset::ExecutionOptions::NoTestsAction,
326 TestPresetOptionalExecutionNoTestsActionHelper, false));
328 auto const TestPresetFilterHelper =
329 JSONHelperBuilder::Optional<TestPreset::FilterOptions>(
330 ReadFileResult::READ_OK,
331 JSONHelperBuilder::Object<TestPreset::FilterOptions>(
332 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
333 .Bind("include"_s, &TestPreset::FilterOptions::Include,
334 TestPresetOptionalFilterIncludeHelper, false)
335 .Bind("exclude"_s, &TestPreset::FilterOptions::Exclude,
336 TestPresetOptionalFilterExcludeHelper, false));
338 auto const TestPresetHelper =
339 JSONHelperBuilder::Object<TestPreset>(ReadFileResult::READ_OK,
340 ReadFileResult::INVALID_PRESET, false)
341 .Bind("name"_s, &TestPreset::Name,
342 cmCMakePresetsGraphInternal::PresetStringHelper)
343 .Bind("inherits"_s, &TestPreset::Inherits,
344 cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper,
346 .Bind("hidden"_s, &TestPreset::Hidden,
347 cmCMakePresetsGraphInternal::PresetBoolHelper, false)
348 .Bind<std::nullptr_t>("vendor"_s, nullptr,
349 cmCMakePresetsGraphInternal::VendorHelper(
350 ReadFileResult::INVALID_PRESET),
352 .Bind("displayName"_s, &TestPreset::DisplayName,
353 cmCMakePresetsGraphInternal::PresetStringHelper, false)
354 .Bind("description"_s, &TestPreset::Description,
355 cmCMakePresetsGraphInternal::PresetStringHelper, false)
356 .Bind("environment"_s, &TestPreset::Environment,
357 cmCMakePresetsGraphInternal::EnvironmentMapHelper, false)
358 .Bind("configurePreset"_s, &TestPreset::ConfigurePreset,
359 cmCMakePresetsGraphInternal::PresetStringHelper, false)
360 .Bind("inheritConfigureEnvironment"_s,
361 &TestPreset::InheritConfigureEnvironment,
362 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
363 .Bind("configuration"_s, &TestPreset::Configuration,
364 cmCMakePresetsGraphInternal::PresetStringHelper, false)
365 .Bind("overwriteConfigurationFile"_s,
366 &TestPreset::OverwriteConfigurationFile,
367 cmCMakePresetsGraphInternal::PresetVectorStringHelper, false)
368 .Bind("output"_s, &TestPreset::Output, TestPresetOptionalOutputHelper,
370 .Bind("filter"_s, &TestPreset::Filter, TestPresetFilterHelper, false)
371 .Bind("execution"_s, &TestPreset::Execution, TestPresetExecutionHelper,
373 .Bind("condition"_s, &TestPreset::ConditionEvaluator,
374 cmCMakePresetsGraphInternal::PresetConditionHelper, false);
377 namespace cmCMakePresetsGraphInternal {
378 cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
379 std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value)
381 static auto const helper = JSONHelperBuilder::Vector<TestPreset>(
382 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
385 return helper(out, value);