c07d380260fb6a8e15afb258d8fa27014b4329e1
[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("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));
123
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));
138
139 ReadFileResult TestPresetOptionalFilterIncludeIndexHelper(
140   cm::optional<TestPreset::IncludeOptions::IndexOptions>& out,
141   const Json::Value* value)
142 {
143   if (!value) {
144     out = cm::nullopt;
145     return ReadFileResult::READ_OK;
146   }
147
148   if (value->isString()) {
149     out.emplace();
150     out->IndexFile = value->asString();
151     return ReadFileResult::READ_OK;
152   }
153
154   if (value->isObject()) {
155     return TestPresetOptionalFilterIncludeIndexObjectHelper(out, value);
156   }
157
158   return ReadFileResult::INVALID_PRESET;
159 }
160
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));
174
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));
186
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));
198
199 ReadFileResult TestPresetExecutionShowOnlyHelper(
200   TestPreset::ExecutionOptions::ShowOnlyEnum& out, const Json::Value* value)
201 {
202   if (!value || !value->isString()) {
203     return ReadFileResult::INVALID_PRESET;
204   }
205
206   if (value->asString() == "human") {
207     out = TestPreset::ExecutionOptions::ShowOnlyEnum::Human;
208     return ReadFileResult::READ_OK;
209   }
210
211   if (value->asString() == "json-v1") {
212     out = TestPreset::ExecutionOptions::ShowOnlyEnum::JsonV1;
213     return ReadFileResult::READ_OK;
214   }
215
216   return ReadFileResult::INVALID_PRESET;
217 }
218
219 auto const TestPresetOptionalExecutionShowOnlyHelper =
220   JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::ShowOnlyEnum>(
221     ReadFileResult::READ_OK, TestPresetExecutionShowOnlyHelper);
222
223 ReadFileResult TestPresetExecutionModeHelper(
224   TestPreset::ExecutionOptions::RepeatOptions::ModeEnum& out,
225   const Json::Value* value)
226 {
227   if (!value) {
228     return ReadFileResult::READ_OK;
229   }
230
231   if (!value->isString()) {
232     return ReadFileResult::INVALID_PRESET;
233   }
234
235   if (value->asString() == "until-fail") {
236     out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilFail;
237     return ReadFileResult::READ_OK;
238   }
239
240   if (value->asString() == "until-pass") {
241     out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilPass;
242     return ReadFileResult::READ_OK;
243   }
244
245   if (value->asString() == "after-timeout") {
246     out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::AfterTimeout;
247     return ReadFileResult::READ_OK;
248   }
249
250   return ReadFileResult::INVALID_PRESET;
251 }
252
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));
262
263 ReadFileResult TestPresetExecutionNoTestsActionHelper(
264   TestPreset::ExecutionOptions::NoTestsActionEnum& out,
265   const Json::Value* value)
266 {
267   if (!value) {
268     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
269     return ReadFileResult::READ_OK;
270   }
271
272   if (!value->isString()) {
273     return ReadFileResult::INVALID_PRESET;
274   }
275
276   if (value->asString() == "default") {
277     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
278     return ReadFileResult::READ_OK;
279   }
280
281   if (value->asString() == "error") {
282     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Error;
283     return ReadFileResult::READ_OK;
284   }
285
286   if (value->asString() == "ignore") {
287     out = TestPreset::ExecutionOptions::NoTestsActionEnum::Ignore;
288     return ReadFileResult::READ_OK;
289   }
290
291   return ReadFileResult::INVALID_PRESET;
292 }
293
294 auto const TestPresetOptionalExecutionNoTestsActionHelper =
295   JSONHelperBuilder::Optional<TestPreset::ExecutionOptions::NoTestsActionEnum>(
296     ReadFileResult::READ_OK, TestPresetExecutionNoTestsActionHelper);
297
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));
327
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));
337
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,
345           false)
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),
351                           false)
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,
369           false)
370     .Bind("filter"_s, &TestPreset::Filter, TestPresetFilterHelper, false)
371     .Bind("execution"_s, &TestPreset::Execution, TestPresetExecutionHelper,
372           false)
373     .Bind("condition"_s, &TestPreset::ConditionEvaluator,
374           cmCMakePresetsGraphInternal::PresetConditionHelper, false);
375 }
376
377 namespace cmCMakePresetsGraphInternal {
378 cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
379   std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value)
380 {
381   static auto const helper = JSONHelperBuilder::Vector<TestPreset>(
382     ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
383     TestPresetHelper);
384
385   return helper(out, value);
386 }
387 }