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("outputJUnitFile"_s, &TestPreset::OutputOptions::OutputJUnitFile,
108 cmCMakePresetsGraphInternal::PresetStringHelper, false)
109 .Bind("labelSummary"_s, &TestPreset::OutputOptions::LabelSummary,
110 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
111 .Bind("subprojectSummary"_s,
112 &TestPreset::OutputOptions::SubprojectSummary,
113 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
114 .Bind("maxPassedTestOutputSize"_s,
115 &TestPreset::OutputOptions::MaxPassedTestOutputSize,
116 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
117 .Bind("maxFailedTestOutputSize"_s,
118 &TestPreset::OutputOptions::MaxFailedTestOutputSize,
119 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
120 .Bind("testOutputTruncation"_s,
121 &TestPreset::OutputOptions::TestOutputTruncation,
122 TestPresetOutputTruncationHelper, false)
123 .Bind("maxTestNameWidth"_s, &TestPreset::OutputOptions::MaxTestNameWidth,
124 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false));
126 auto const TestPresetOptionalFilterIncludeIndexObjectHelper =
127 JSONHelperBuilder::Optional<TestPreset::IncludeOptions::IndexOptions>(
128 ReadFileResult::READ_OK,
129 JSONHelperBuilder::Object<TestPreset::IncludeOptions::IndexOptions>(
130 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
131 .Bind("start"_s, &TestPreset::IncludeOptions::IndexOptions::Start,
132 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
133 .Bind("end"_s, &TestPreset::IncludeOptions::IndexOptions::End,
134 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
135 .Bind("stride"_s, &TestPreset::IncludeOptions::IndexOptions::Stride,
136 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
137 .Bind("specificTests"_s,
138 &TestPreset::IncludeOptions::IndexOptions::SpecificTests,
139 cmCMakePresetsGraphInternal::PresetVectorIntHelper, false));
141 ReadFileResult TestPresetOptionalFilterIncludeIndexHelper(
142 cm::optional<TestPreset::IncludeOptions::IndexOptions>& out,
143 const Json::Value* value)
147 return ReadFileResult::READ_OK;
150 if (value->isString()) {
152 out->IndexFile = value->asString();
153 return ReadFileResult::READ_OK;
156 if (value->isObject()) {
157 return TestPresetOptionalFilterIncludeIndexObjectHelper(out, value);
160 return ReadFileResult::INVALID_PRESET;
163 auto const TestPresetOptionalFilterIncludeHelper =
164 JSONHelperBuilder::Optional<TestPreset::IncludeOptions>(
165 ReadFileResult::READ_OK,
166 JSONHelperBuilder::Object<TestPreset::IncludeOptions>(
167 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
168 .Bind("name"_s, &TestPreset::IncludeOptions::Name,
169 cmCMakePresetsGraphInternal::PresetStringHelper, false)
170 .Bind("label"_s, &TestPreset::IncludeOptions::Label,
171 cmCMakePresetsGraphInternal::PresetStringHelper, false)
172 .Bind("index"_s, &TestPreset::IncludeOptions::Index,
173 TestPresetOptionalFilterIncludeIndexHelper, false)
174 .Bind("useUnion"_s, &TestPreset::IncludeOptions::UseUnion,
175 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false));
177 auto const TestPresetOptionalFilterExcludeFixturesHelper =
178 JSONHelperBuilder::Optional<TestPreset::ExcludeOptions::FixturesOptions>(
179 ReadFileResult::READ_OK,
180 JSONHelperBuilder::Object<TestPreset::ExcludeOptions::FixturesOptions>(
181 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
182 .Bind("any"_s, &TestPreset::ExcludeOptions::FixturesOptions::Any,
183 cmCMakePresetsGraphInternal::PresetStringHelper, false)
184 .Bind("setup"_s, &TestPreset::ExcludeOptions::FixturesOptions::Setup,
185 cmCMakePresetsGraphInternal::PresetStringHelper, false)
186 .Bind("cleanup"_s, &TestPreset::ExcludeOptions::FixturesOptions::Cleanup,
187 cmCMakePresetsGraphInternal::PresetStringHelper, false));
189 auto const TestPresetOptionalFilterExcludeHelper =
190 JSONHelperBuilder::Optional<TestPreset::ExcludeOptions>(
191 ReadFileResult::READ_OK,
192 JSONHelperBuilder::Object<TestPreset::ExcludeOptions>(
193 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
194 .Bind("name"_s, &TestPreset::ExcludeOptions::Name,
195 cmCMakePresetsGraphInternal::PresetStringHelper, false)
196 .Bind("label"_s, &TestPreset::ExcludeOptions::Label,
197 cmCMakePresetsGraphInternal::PresetStringHelper, false)
198 .Bind("fixtures"_s, &TestPreset::ExcludeOptions::Fixtures,
199 TestPresetOptionalFilterExcludeFixturesHelper, false));
201 ReadFileResult TestPresetExecutionShowOnlyHelper(
202 TestPreset::ExecutionOptions::ShowOnlyEnum& out, const Json::Value* value)
204 if (!value || !value->isString()) {
205 return ReadFileResult::INVALID_PRESET;
208 if (value->asString() == "human") {
209 out = TestPreset::ExecutionOptions::ShowOnlyEnum::Human;
210 return ReadFileResult::READ_OK;
213 if (value->asString() == "json-v1") {
214 out = TestPreset::ExecutionOptions::ShowOnlyEnum::JsonV1;
215 return ReadFileResult::READ_OK;
218 return ReadFileResult::INVALID_PRESET;
221 auto const TestPresetOptionalExecutionShowOnlyHelper =
222 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::ShowOnlyEnum>(
223 ReadFileResult::READ_OK, TestPresetExecutionShowOnlyHelper);
225 ReadFileResult TestPresetExecutionModeHelper(
226 TestPreset::ExecutionOptions::RepeatOptions::ModeEnum& out,
227 const Json::Value* value)
230 return ReadFileResult::READ_OK;
233 if (!value->isString()) {
234 return ReadFileResult::INVALID_PRESET;
237 if (value->asString() == "until-fail") {
238 out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilFail;
239 return ReadFileResult::READ_OK;
242 if (value->asString() == "until-pass") {
243 out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilPass;
244 return ReadFileResult::READ_OK;
247 if (value->asString() == "after-timeout") {
248 out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::AfterTimeout;
249 return ReadFileResult::READ_OK;
252 return ReadFileResult::INVALID_PRESET;
255 auto const TestPresetOptionalExecutionRepeatHelper =
256 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::RepeatOptions>(
257 ReadFileResult::READ_OK,
258 JSONHelperBuilder::Object<TestPreset::ExecutionOptions::RepeatOptions>(
259 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
260 .Bind("mode"_s, &TestPreset::ExecutionOptions::RepeatOptions::Mode,
261 TestPresetExecutionModeHelper, true)
262 .Bind("count"_s, &TestPreset::ExecutionOptions::RepeatOptions::Count,
263 cmCMakePresetsGraphInternal::PresetIntHelper, true));
265 ReadFileResult TestPresetExecutionNoTestsActionHelper(
266 TestPreset::ExecutionOptions::NoTestsActionEnum& out,
267 const Json::Value* value)
270 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
271 return ReadFileResult::READ_OK;
274 if (!value->isString()) {
275 return ReadFileResult::INVALID_PRESET;
278 if (value->asString() == "default") {
279 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
280 return ReadFileResult::READ_OK;
283 if (value->asString() == "error") {
284 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Error;
285 return ReadFileResult::READ_OK;
288 if (value->asString() == "ignore") {
289 out = TestPreset::ExecutionOptions::NoTestsActionEnum::Ignore;
290 return ReadFileResult::READ_OK;
293 return ReadFileResult::INVALID_PRESET;
296 auto const TestPresetOptionalExecutionNoTestsActionHelper =
297 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::NoTestsActionEnum>(
298 ReadFileResult::READ_OK, TestPresetExecutionNoTestsActionHelper);
300 auto const TestPresetExecutionHelper =
301 JSONHelperBuilder::Optional<TestPreset::ExecutionOptions>(
302 ReadFileResult::READ_OK,
303 JSONHelperBuilder::Object<TestPreset::ExecutionOptions>(
304 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
305 .Bind("stopOnFailure"_s, &TestPreset::ExecutionOptions::StopOnFailure,
306 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
307 .Bind("enableFailover"_s, &TestPreset::ExecutionOptions::EnableFailover,
308 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
309 .Bind("jobs"_s, &TestPreset::ExecutionOptions::Jobs,
310 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
311 .Bind("resourceSpecFile"_s,
312 &TestPreset::ExecutionOptions::ResourceSpecFile,
313 cmCMakePresetsGraphInternal::PresetStringHelper, false)
314 .Bind("testLoad"_s, &TestPreset::ExecutionOptions::TestLoad,
315 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
316 .Bind("showOnly"_s, &TestPreset::ExecutionOptions::ShowOnly,
317 TestPresetOptionalExecutionShowOnlyHelper, false)
318 .Bind("repeat"_s, &TestPreset::ExecutionOptions::Repeat,
319 TestPresetOptionalExecutionRepeatHelper, false)
320 .Bind("interactiveDebugging"_s,
321 &TestPreset::ExecutionOptions::InteractiveDebugging,
322 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
323 .Bind("scheduleRandom"_s, &TestPreset::ExecutionOptions::ScheduleRandom,
324 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
325 .Bind("timeout"_s, &TestPreset::ExecutionOptions::Timeout,
326 cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
327 .Bind("noTestsAction"_s, &TestPreset::ExecutionOptions::NoTestsAction,
328 TestPresetOptionalExecutionNoTestsActionHelper, false));
330 auto const TestPresetFilterHelper =
331 JSONHelperBuilder::Optional<TestPreset::FilterOptions>(
332 ReadFileResult::READ_OK,
333 JSONHelperBuilder::Object<TestPreset::FilterOptions>(
334 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
335 .Bind("include"_s, &TestPreset::FilterOptions::Include,
336 TestPresetOptionalFilterIncludeHelper, false)
337 .Bind("exclude"_s, &TestPreset::FilterOptions::Exclude,
338 TestPresetOptionalFilterExcludeHelper, false));
340 auto const TestPresetHelper =
341 JSONHelperBuilder::Object<TestPreset>(ReadFileResult::READ_OK,
342 ReadFileResult::INVALID_PRESET, false)
343 .Bind("name"_s, &TestPreset::Name,
344 cmCMakePresetsGraphInternal::PresetStringHelper)
345 .Bind("inherits"_s, &TestPreset::Inherits,
346 cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper,
348 .Bind("hidden"_s, &TestPreset::Hidden,
349 cmCMakePresetsGraphInternal::PresetBoolHelper, false)
350 .Bind<std::nullptr_t>("vendor"_s, nullptr,
351 cmCMakePresetsGraphInternal::VendorHelper(
352 ReadFileResult::INVALID_PRESET),
354 .Bind("displayName"_s, &TestPreset::DisplayName,
355 cmCMakePresetsGraphInternal::PresetStringHelper, false)
356 .Bind("description"_s, &TestPreset::Description,
357 cmCMakePresetsGraphInternal::PresetStringHelper, false)
358 .Bind("environment"_s, &TestPreset::Environment,
359 cmCMakePresetsGraphInternal::EnvironmentMapHelper, false)
360 .Bind("configurePreset"_s, &TestPreset::ConfigurePreset,
361 cmCMakePresetsGraphInternal::PresetStringHelper, false)
362 .Bind("inheritConfigureEnvironment"_s,
363 &TestPreset::InheritConfigureEnvironment,
364 cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
365 .Bind("configuration"_s, &TestPreset::Configuration,
366 cmCMakePresetsGraphInternal::PresetStringHelper, false)
367 .Bind("overwriteConfigurationFile"_s,
368 &TestPreset::OverwriteConfigurationFile,
369 cmCMakePresetsGraphInternal::PresetVectorStringHelper, false)
370 .Bind("output"_s, &TestPreset::Output, TestPresetOptionalOutputHelper,
372 .Bind("filter"_s, &TestPreset::Filter, TestPresetFilterHelper, false)
373 .Bind("execution"_s, &TestPreset::Execution, TestPresetExecutionHelper,
375 .Bind("condition"_s, &TestPreset::ConditionEvaluator,
376 cmCMakePresetsGraphInternal::PresetConditionHelper, false);
379 namespace cmCMakePresetsGraphInternal {
380 cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
381 std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value)
383 static auto const helper = JSONHelperBuilder::Vector<TestPreset>(
384 ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
387 return helper(out, value);