| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #pragma once | |
| #include "cmConfigure.h" // IWYU pragma: keep | |
| #include <memory> | |
| #include <string> | |
| #include <type_traits> | |
| #include <vector> | |
| #include <cm/optional> | |
| #include <cmext/string_view> | |
| #include "cmArgumentParser.h" | |
| #include "cmArgumentParserTypes.h" | |
| #include "cmCMakePresetsGraph.h" | |
| #include "cmCTestHandlerCommand.h" | |
| class cmExecutionStatus; | |
| class cmCTestTestHandler; | |
| class cmMakefile; | |
| class cmCTestTestCommand : public cmCTestHandlerCommand | |
| { | |
| public: | |
| using cmCTestHandlerCommand::cmCTestHandlerCommand; | |
| cmCTestTestCommand(cmCTestTestCommand const& other) | |
| : cmCTestHandlerCommand(other) | |
| { | |
| } | |
| cmCTestTestCommand& operator=(cmCTestTestCommand const& other) | |
| { | |
| cmCTestHandlerCommand::operator=(other); | |
| return *this; | |
| } | |
| protected: | |
| struct TestArguments : HandlerArguments | |
| { | |
| std::string Start; | |
| std::string End; | |
| std::string Stride; | |
| std::string Exclude; | |
| std::string Include; | |
| ArgumentParser::NonEmpty<std::vector<std::string>> ExcludeLabel; | |
| ArgumentParser::NonEmpty<std::vector<std::string>> IncludeLabel; | |
| std::string IncludeTestsFromFile; | |
| std::string ExcludeTestsFromFile; | |
| std::string ExcludeFixture; | |
| std::string ExcludeFixtureSetup; | |
| std::string ExcludeFixtureCleanup; | |
| cm::optional<ArgumentParser::Maybe<std::string>> ParallelLevel; | |
| std::string Repeat; | |
| std::string ScheduleRandom; | |
| std::string ScheduleRandomSeed; | |
| std::string StopTime; | |
| std::string TestLoad; | |
| std::string ResourceSpecFile; | |
| std::string OutputJUnit; | |
| std::string CoverageTool; | |
| bool StopOnFailure = false; | |
| std::string Preset; | |
| std::string PresetsFile; | |
| }; | |
| bool ExecuteHandlerCommand(TestArguments& args, | |
| cmExecutionStatus& status) const; | |
| template <typename Args> | |
| static auto MakeTestParser() -> cmArgumentParser<Args> | |
| { | |
| static_assert(std::is_base_of<TestArguments, Args>::value, ""); | |
| return cmArgumentParser<Args>{ MakeHandlerParser<Args>() } | |
| .Bind("START"_s, &TestArguments::Start) | |
| .Bind("END"_s, &TestArguments::End) | |
| .Bind("STRIDE"_s, &TestArguments::Stride) | |
| .Bind("EXCLUDE"_s, &TestArguments::Exclude) | |
| .Bind("INCLUDE"_s, &TestArguments::Include) | |
| .Bind("EXCLUDE_LABEL"_s, &TestArguments::ExcludeLabel) | |
| .Bind("INCLUDE_LABEL"_s, &TestArguments::IncludeLabel) | |
| .Bind("EXCLUDE_FROM_FILE"_s, &TestArguments::ExcludeTestsFromFile) | |
| .Bind("INCLUDE_FROM_FILE"_s, &TestArguments::IncludeTestsFromFile) | |
| .Bind("EXCLUDE_FIXTURE"_s, &TestArguments::ExcludeFixture) | |
| .Bind("EXCLUDE_FIXTURE_SETUP"_s, &TestArguments::ExcludeFixtureSetup) | |
| .Bind("EXCLUDE_FIXTURE_CLEANUP"_s, &TestArguments::ExcludeFixtureCleanup) | |
| .Bind("PARALLEL_LEVEL"_s, &TestArguments::ParallelLevel) | |
| .Bind("REPEAT"_s, &TestArguments::Repeat) | |
| .Bind("SCHEDULE_RANDOM"_s, &TestArguments::ScheduleRandom) | |
| .Bind("SCHEDULE_RANDOM_SEED"_s, &TestArguments::ScheduleRandomSeed) | |
| .Bind("STOP_TIME"_s, &TestArguments::StopTime) | |
| .Bind("TEST_LOAD"_s, &TestArguments::TestLoad) | |
| .Bind("RESOURCE_SPEC_FILE"_s, &TestArguments::ResourceSpecFile) | |
| .Bind("STOP_ON_FAILURE"_s, &TestArguments::StopOnFailure) | |
| .Bind("COVERAGE_TOOL"_s, &TestArguments::CoverageTool) | |
| .Bind("OUTPUT_JUNIT"_s, &TestArguments::OutputJUnit) | |
| .Bind("PRESET"_s, &TestArguments::Preset) | |
| .Bind("PRESETS_FILE"_s, &TestArguments::PresetsFile); | |
| } | |
| private: | |
| std::string GetName() const override { return "ctest_test"; } | |
| struct ResolvedTestPreset | |
| { | |
| std::string SourceDirectory; | |
| std::string PresetsFile; | |
| std::string EffectivePreset; | |
| std::unique_ptr<cmCMakePresetsGraph> PresetsGraph; | |
| cmCMakePresetsGraph::TestPreset const* ExpandedPreset = nullptr; | |
| }; | |
| cm::optional<ResolvedTestPreset> ResolveTestPreset( | |
| cmMakefile& mf, std::string const& presetArg, | |
| std::string const& presetsFileArg, cmExecutionStatus& status) const; | |
| // Set by ExecuteHandlerCommand() (resolves the preset once, up | |
| // front) and consumed by InitializeHandler() to avoid parsing the presets | |
| // file (and emitting error messages, etc.) more than once. | |
| mutable cm::optional<cm::optional<ResolvedTestPreset>> | |
| CachedPresetResolution; | |
| virtual std::unique_ptr<cmCTestTestHandler> InitializeActualHandler( | |
| HandlerArguments& arguments, cmExecutionStatus& status) const; | |
| std::unique_ptr<cmCTestGenericHandler> InitializeHandler( | |
| HandlerArguments& arguments, cmExecutionStatus& status) const override; | |
| bool InitialPass(std::vector<std::string> const& args, | |
| cmExecutionStatus& status) const override; | |
| }; |