You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
361 lines
15 KiB
361 lines
15 KiB
3 years ago
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
||
|
#include <cstddef>
|
||
|
#include <functional>
|
||
|
#include <map>
|
||
|
#include <memory>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
#include <cm/optional>
|
||
|
#include <cmext/string_view>
|
||
|
|
||
|
#include <cm3p/json/value.h>
|
||
|
|
||
|
#include "cmCMakePresetsGraph.h"
|
||
|
#include "cmCMakePresetsGraphInternal.h"
|
||
|
#include "cmJSONHelpers.h"
|
||
|
|
||
|
namespace {
|
||
|
using ReadFileResult = cmCMakePresetsGraph::ReadFileResult;
|
||
|
using TestPreset = cmCMakePresetsGraph::TestPreset;
|
||
|
|
||
|
ReadFileResult TestPresetOutputVerbosityHelper(
|
||
|
TestPreset::OutputOptions::VerbosityEnum& out, const Json::Value* value)
|
||
|
{
|
||
|
if (!value) {
|
||
|
out = TestPreset::OutputOptions::VerbosityEnum::Default;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (!value->isString()) {
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "default") {
|
||
|
out = TestPreset::OutputOptions::VerbosityEnum::Default;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "verbose") {
|
||
|
out = TestPreset::OutputOptions::VerbosityEnum::Verbose;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "extra") {
|
||
|
out = TestPreset::OutputOptions::VerbosityEnum::Extra;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
auto const TestPresetOptionalOutputVerbosityHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::OutputOptions::VerbosityEnum,
|
||
|
ReadFileResult>(ReadFileResult::READ_OK,
|
||
|
TestPresetOutputVerbosityHelper);
|
||
|
|
||
|
auto const TestPresetOptionalOutputHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::OutputOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::OutputOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
|
||
|
.Bind("shortProgress"_s, &TestPreset::OutputOptions::ShortProgress,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("verbosity"_s, &TestPreset::OutputOptions::Verbosity,
|
||
|
TestPresetOptionalOutputVerbosityHelper, false)
|
||
|
.Bind("debug"_s, &TestPreset::OutputOptions::Debug,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("outputOnFailure"_s, &TestPreset::OutputOptions::OutputOnFailure,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("quiet"_s, &TestPreset::OutputOptions::Quiet,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("outputLogFile"_s, &TestPreset::OutputOptions::OutputLogFile,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("labelSummary"_s, &TestPreset::OutputOptions::LabelSummary,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("subprojectSummary"_s,
|
||
|
&TestPreset::OutputOptions::SubprojectSummary,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("maxPassedTestOutputSize"_s,
|
||
|
&TestPreset::OutputOptions::MaxPassedTestOutputSize,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("maxFailedTestOutputSize"_s,
|
||
|
&TestPreset::OutputOptions::MaxFailedTestOutputSize,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("maxTestNameWidth"_s, &TestPreset::OutputOptions::MaxTestNameWidth,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false));
|
||
|
|
||
|
auto const TestPresetOptionalFilterIncludeIndexObjectHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::IncludeOptions::IndexOptions,
|
||
|
ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::IncludeOptions::IndexOptions,
|
||
|
ReadFileResult>(ReadFileResult::READ_OK,
|
||
|
ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("start"_s, &TestPreset::IncludeOptions::IndexOptions::Start,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("end"_s, &TestPreset::IncludeOptions::IndexOptions::End,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("stride"_s, &TestPreset::IncludeOptions::IndexOptions::Stride,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("specificTests"_s,
|
||
|
&TestPreset::IncludeOptions::IndexOptions::SpecificTests,
|
||
|
cmCMakePresetsGraphInternal::PresetVectorIntHelper, false));
|
||
|
|
||
|
ReadFileResult TestPresetOptionalFilterIncludeIndexHelper(
|
||
|
cm::optional<TestPreset::IncludeOptions::IndexOptions>& out,
|
||
|
const Json::Value* value)
|
||
|
{
|
||
|
if (!value) {
|
||
|
out = cm::nullopt;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->isString()) {
|
||
|
out.emplace();
|
||
|
out->IndexFile = value->asString();
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->isObject()) {
|
||
|
return TestPresetOptionalFilterIncludeIndexObjectHelper(out, value);
|
||
|
}
|
||
|
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
auto const TestPresetOptionalFilterIncludeHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::IncludeOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::IncludeOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("name"_s, &TestPreset::IncludeOptions::Name,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("label"_s, &TestPreset::IncludeOptions::Label,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("index"_s, &TestPreset::IncludeOptions::Index,
|
||
|
TestPresetOptionalFilterIncludeIndexHelper, false)
|
||
|
.Bind("useUnion"_s, &TestPreset::IncludeOptions::UseUnion,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false));
|
||
|
|
||
|
auto const TestPresetOptionalFilterExcludeFixturesHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::ExcludeOptions::FixturesOptions,
|
||
|
ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::ExcludeOptions::FixturesOptions,
|
||
|
ReadFileResult>(ReadFileResult::READ_OK,
|
||
|
ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("any"_s, &TestPreset::ExcludeOptions::FixturesOptions::Any,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("setup"_s, &TestPreset::ExcludeOptions::FixturesOptions::Setup,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("cleanup"_s, &TestPreset::ExcludeOptions::FixturesOptions::Cleanup,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false));
|
||
|
|
||
|
auto const TestPresetOptionalFilterExcludeHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::ExcludeOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::ExcludeOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("name"_s, &TestPreset::ExcludeOptions::Name,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("label"_s, &TestPreset::ExcludeOptions::Label,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("fixtures"_s, &TestPreset::ExcludeOptions::Fixtures,
|
||
|
TestPresetOptionalFilterExcludeFixturesHelper, false));
|
||
|
|
||
|
ReadFileResult TestPresetExecutionShowOnlyHelper(
|
||
|
TestPreset::ExecutionOptions::ShowOnlyEnum& out, const Json::Value* value)
|
||
|
{
|
||
|
if (!value || !value->isString()) {
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "human") {
|
||
|
out = TestPreset::ExecutionOptions::ShowOnlyEnum::Human;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "json-v1") {
|
||
|
out = TestPreset::ExecutionOptions::ShowOnlyEnum::JsonV1;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
auto const TestPresetOptionalExecutionShowOnlyHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::ExecutionOptions::ShowOnlyEnum,
|
||
|
ReadFileResult>(ReadFileResult::READ_OK,
|
||
|
TestPresetExecutionShowOnlyHelper);
|
||
|
|
||
|
ReadFileResult TestPresetExecutionModeHelper(
|
||
|
TestPreset::ExecutionOptions::RepeatOptions::ModeEnum& out,
|
||
|
const Json::Value* value)
|
||
|
{
|
||
|
if (!value) {
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (!value->isString()) {
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "until-fail") {
|
||
|
out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilFail;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "until-pass") {
|
||
|
out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::UntilPass;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "after-timeout") {
|
||
|
out = TestPreset::ExecutionOptions::RepeatOptions::ModeEnum::AfterTimeout;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
auto const TestPresetOptionalExecutionRepeatHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::ExecutionOptions::RepeatOptions,
|
||
|
ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::ExecutionOptions::RepeatOptions,
|
||
|
ReadFileResult>(ReadFileResult::READ_OK,
|
||
|
ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("mode"_s, &TestPreset::ExecutionOptions::RepeatOptions::Mode,
|
||
|
TestPresetExecutionModeHelper, true)
|
||
|
.Bind("count"_s, &TestPreset::ExecutionOptions::RepeatOptions::Count,
|
||
|
cmCMakePresetsGraphInternal::PresetIntHelper, true));
|
||
|
|
||
|
ReadFileResult TestPresetExecutionNoTestsActionHelper(
|
||
|
TestPreset::ExecutionOptions::NoTestsActionEnum& out,
|
||
|
const Json::Value* value)
|
||
|
{
|
||
|
if (!value) {
|
||
|
out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (!value->isString()) {
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "default") {
|
||
|
out = TestPreset::ExecutionOptions::NoTestsActionEnum::Default;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "error") {
|
||
|
out = TestPreset::ExecutionOptions::NoTestsActionEnum::Error;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
if (value->asString() == "ignore") {
|
||
|
out = TestPreset::ExecutionOptions::NoTestsActionEnum::Ignore;
|
||
|
return ReadFileResult::READ_OK;
|
||
|
}
|
||
|
|
||
|
return ReadFileResult::INVALID_PRESET;
|
||
|
}
|
||
|
|
||
|
auto const TestPresetOptionalExecutionNoTestsActionHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::ExecutionOptions::NoTestsActionEnum,
|
||
|
ReadFileResult>(ReadFileResult::READ_OK,
|
||
|
TestPresetExecutionNoTestsActionHelper);
|
||
|
|
||
|
auto const TestPresetExecutionHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::ExecutionOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::ExecutionOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("stopOnFailure"_s, &TestPreset::ExecutionOptions::StopOnFailure,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("enableFailover"_s, &TestPreset::ExecutionOptions::EnableFailover,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("jobs"_s, &TestPreset::ExecutionOptions::Jobs,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("resourceSpecFile"_s,
|
||
|
&TestPreset::ExecutionOptions::ResourceSpecFile,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("testLoad"_s, &TestPreset::ExecutionOptions::TestLoad,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("showOnly"_s, &TestPreset::ExecutionOptions::ShowOnly,
|
||
|
TestPresetOptionalExecutionShowOnlyHelper, false)
|
||
|
.Bind("repeat"_s, &TestPreset::ExecutionOptions::Repeat,
|
||
|
TestPresetOptionalExecutionRepeatHelper, false)
|
||
|
.Bind("interactiveDebugging"_s,
|
||
|
&TestPreset::ExecutionOptions::InteractiveDebugging,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("scheduleRandom"_s, &TestPreset::ExecutionOptions::ScheduleRandom,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("timeout"_s, &TestPreset::ExecutionOptions::Timeout,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalIntHelper, false)
|
||
|
.Bind("noTestsAction"_s, &TestPreset::ExecutionOptions::NoTestsAction,
|
||
|
TestPresetOptionalExecutionNoTestsActionHelper, false));
|
||
|
|
||
|
auto const TestPresetFilterHelper =
|
||
|
cmJSONOptionalHelper<TestPreset::FilterOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK,
|
||
|
cmJSONObjectHelper<TestPreset::FilterOptions, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET)
|
||
|
.Bind("include"_s, &TestPreset::FilterOptions::Include,
|
||
|
TestPresetOptionalFilterIncludeHelper, false)
|
||
|
.Bind("exclude"_s, &TestPreset::FilterOptions::Exclude,
|
||
|
TestPresetOptionalFilterExcludeHelper, false));
|
||
|
|
||
|
auto const TestPresetHelper =
|
||
|
cmJSONObjectHelper<TestPreset, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESET, false)
|
||
|
.Bind("name"_s, &TestPreset::Name,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper)
|
||
|
.Bind("inherits"_s, &TestPreset::Inherits,
|
||
|
cmCMakePresetsGraphInternal::PresetVectorOneOrMoreStringHelper,
|
||
|
false)
|
||
|
.Bind("hidden"_s, &TestPreset::Hidden,
|
||
|
cmCMakePresetsGraphInternal::PresetBoolHelper, false)
|
||
|
.Bind<std::nullptr_t>("vendor"_s, nullptr,
|
||
|
cmCMakePresetsGraphInternal::VendorHelper(
|
||
|
ReadFileResult::INVALID_PRESET),
|
||
|
false)
|
||
|
.Bind("displayName"_s, &TestPreset::DisplayName,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("description"_s, &TestPreset::Description,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("environment"_s, &TestPreset::Environment,
|
||
|
cmCMakePresetsGraphInternal::EnvironmentMapHelper, false)
|
||
|
.Bind("configurePreset"_s, &TestPreset::ConfigurePreset,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("inheritConfigureEnvironment"_s,
|
||
|
&TestPreset::InheritConfigureEnvironment,
|
||
|
cmCMakePresetsGraphInternal::PresetOptionalBoolHelper, false)
|
||
|
.Bind("configuration"_s, &TestPreset::Configuration,
|
||
|
cmCMakePresetsGraphInternal::PresetStringHelper, false)
|
||
|
.Bind("overwriteConfigurationFile"_s,
|
||
|
&TestPreset::OverwriteConfigurationFile,
|
||
|
cmCMakePresetsGraphInternal::PresetVectorStringHelper, false)
|
||
|
.Bind("output"_s, &TestPreset::Output, TestPresetOptionalOutputHelper,
|
||
|
false)
|
||
|
.Bind("filter"_s, &TestPreset::Filter, TestPresetFilterHelper, false)
|
||
|
.Bind("execution"_s, &TestPreset::Execution, TestPresetExecutionHelper,
|
||
|
false)
|
||
|
.Bind("condition"_s, &TestPreset::ConditionEvaluator,
|
||
|
cmCMakePresetsGraphInternal::PresetConditionHelper, false);
|
||
|
}
|
||
|
|
||
|
namespace cmCMakePresetsGraphInternal {
|
||
|
cmCMakePresetsGraph::ReadFileResult TestPresetsHelper(
|
||
|
std::vector<cmCMakePresetsGraph::TestPreset>& out, const Json::Value* value)
|
||
|
{
|
||
|
static auto const helper = cmJSONVectorHelper<TestPreset, ReadFileResult>(
|
||
|
ReadFileResult::READ_OK, ReadFileResult::INVALID_PRESETS,
|
||
|
TestPresetHelper);
|
||
|
|
||
|
return helper(out, value);
|
||
|
}
|
||
|
}
|