Imported Upstream version 3.25.0
[platform/upstream/cmake.git] / Source / cmCMakePresetsGraphReadJSONTestPresets.cxx
1 /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2    file Copyright.txt or https://cmake.org/licensing for details.  */
3 #include <cstddef>
4 #include <functional>
5 #include <map>
6 #include <memory>
7 #include <string>
8 #include <vector>
9
10 #include <cm/optional>
11 #include <cmext/string_view>
12
13 #include <cm3p/json/value.h>
14
15 #include "cmCMakePresetsGraph.h"
16 #include "cmCMakePresetsGraphInternal.h"
17 #include "cmJSONHelpers.h"
18
19 #include "CTest/cmCTestTypes.h"
20
21 namespace {
22 using ReadFileResult = cmCMakePresetsGraph::ReadFileResult;
23 using TestPreset = cmCMakePresetsGraph::TestPreset;
24 using JSONHelperBuilder = cmJSONHelperBuilder<ReadFileResult>;
25
26 ReadFileResult TestPresetOutputVerbosityHelper(
27   TestPreset::OutputOptions::VerbosityEnum& out, const Json::Value* value)
28 {
29   if (!value) {
30     out = TestPreset::OutputOptions::VerbosityEnum::Default;
31     return ReadFileResult::READ_OK;
32   }
33
34   if (!value->isString()) {
35     return ReadFileResult::INVALID_PRESET;
36   }
37
38   if (value->asString() == "default") {
39     out = TestPreset::OutputOptions::VerbosityEnum::Default;
40     return ReadFileResult::READ_OK;
41   }
42
43   if (value->asString() == "verbose") {
44     out = TestPreset::OutputOptions::VerbosityEnum::Verbose;
45     return ReadFileResult::READ_OK;
46   }
47
48   if (value->asString() == "extra") {
49     out = TestPreset::OutputOptions::VerbosityEnum::Extra;
50     return ReadFileResult::READ_OK;
51   }
52
53   return ReadFileResult::INVALID_PRESET;
54 }
55
56 auto const TestPresetOptionalOutputVerbosityHelper =
57   JSONHelperBuilder::Optional<TestPreset::OutputOptions::VerbosityEnum>(
58     ReadFileResult::READ_OK, TestPresetOutputVerbosityHelper);
59
60 ReadFileResult TestPresetOutputTruncationHelper(
61   cm::optional<cmCTestTypes::TruncationMode>& out, const Json::Value* value)
62 {
63   if (!value) {
64     out = cm::nullopt;
65     return ReadFileResult::READ_OK;
66   }
67
68   if (!value->isString()) {
69     return ReadFileResult::INVALID_PRESET;
70   }
71
72   if (value->asString() == "tail") {
73     out = cmCTestTypes::TruncationMode::Tail;
74     return ReadFileResult::READ_OK;
75   }
76
77   if (value->asString() == "middle") {
78     out = cmCTestTypes::TruncationMode::Middle;
79     return ReadFileResult::READ_OK;
80   }
81
82   if (value->asString() == "head") {
83     out = cmCTestTypes::TruncationMode::Head;
84     return ReadFileResult::READ_OK;
85   }
86
87   return ReadFileResult::INVALID_PRESET;
88 }
89
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));
125
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));
140
141 ReadFileResult TestPresetOptionalFilterIncludeIndexHelper(
142   cm::optional<TestPreset::IncludeOptions::IndexOptions>& out,
143   const Json::Value* value)
144 {
145   if (!value) {
146     out = cm::nullopt;
147     return ReadFileResult::READ_OK;
148   }
149
150   if (value->isString()) {
151     out.emplace();
152     out->IndexFile = value->asString();
153     return ReadFileResult::READ_OK;
154   }
155
156   if (value->isObject()) {
157     return TestPresetOptionalFilterIncludeIndexObjectHelper(out, value);
158   }
159
160   return ReadFileResult::INVALID_PRESET;
161 }
162
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));
176
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));
188
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));
200
201 ReadFileResult TestPresetExecutionShowOnlyHelper(
202   TestPreset::ExecutionOptions::ShowOnlyEnum& out, const Json::Value* value)
203 {
204   if (!value || !value->isString()) {
205     return ReadFileResult::INVALID_PRESET;
206   }
207
208   if (value->asString() == "human") {
209     out = TestPreset::ExecutionOptions::ShowOnlyEnum::Human;
210     return ReadFileResult::READ_OK;
211   }
212
213   if (value->asString() == "json-v1") {
214     out = TestPreset::ExecutionOptions::ShowOnlyEnum::JsonV1;
215     return ReadFileResult::READ_OK;
216   }
217
218   return ReadFileResult::INVALID_PRESET;
219 }
220
221 auto const TestPresetOptionalExecutionShowOnlyHelper =
222   JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::ShowOnlyEnum>(
223     ReadFileResult::READ_OK, TestPresetExecutionShowOnlyHelper);
224
225 ReadFileResult TestPresetExecutionModeHelper(
226   TestPreset::ExecutionOptions::RepeatOptions::ModeEnum& out,
227   const Json::Value* value)
228 {
229   if (!value) {
230     return ReadFileResult::READ_OK;
231   }
232
233   if (!value->isString()) {
234     return ReadFileResult::INVALID_PRESET;
235   }
236
237   if (value->asString() == "until-fail") {
238     out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilFail;
239     return ReadFileResult::READ_OK;
240   }
241
242   if (value->asString() == "until-pass") {
243     out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilPass;
244     return ReadFileResult::READ_OK;
245   }
246
247   if (value->asString() == "after-timeout") {
248     out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::AfterTimeout;
249     return ReadFileResult::READ_OK;
250   }
251
252   return ReadFileResult::INVALID_PRESET;
253 }
254
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));
264
265 ReadFileResult TestPresetExecutionNoTestsActionHelper(
266   TestPreset::ExecutionOptions::NoTestsActionEnum& out,
267   const Json::Value* value)
268 {
269   if (!value) {
270     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
271     return ReadFileResult::READ_OK;
272   }
273
274   if (!value->isString()) {
275     return ReadFileResult::INVALID_PRESET;
276   }
277
278   if (value->asString() == "default") {
279     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
280     return ReadFileResult::READ_OK;
281   }
282
283   if (value->asString() == "error") {
284     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Error;
285     return ReadFileResult::READ_OK;
286   }
287
288   if (value->asString() == "ignore") {
289     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Ignore;
290     return ReadFileResult::READ_OK;
291   }
292
293   return ReadFileResult::INVALID_PRESET;
294 }
295
296 auto const TestPresetOptionalExecutionNoTestsActionHelper =
297   JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::NoTestsActionEnum>(
298     ReadFileResult::READ_OK, TestPresetExecutionNoTestsActionHelper);
299
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));
329
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));
339
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,
347           false)
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),
353                           false)
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,
371           false)
372     .Bind("filter"_s, &TestPreset::Filter, TestPresetFilterHelper, false)
373     .Bind("execution"_s, &TestPreset::Execution, TestPresetExecutionHelper,
374           false)
375     .Bind("condition"_s, &TestPreset::ConditionEvaluator,
376           cmCMakePresetsGraphInternal::PresetConditionHelper, false);
377 }
378
379 namespace cmCMakePresetsGraphInternal {
380 cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
381   std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value)
382 {
383   static auto const helper = JSONHelperBuilder::Vector<TestPreset>(
384     ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
385     TestPresetHelper);
386
387   return helper(out, value);
388 }
389 }