/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
#ifndef cmCTestBuildAndTestHandler_h
#define cmCTestBuildAndTestHandler_h

#include "cmConfigure.h"  // IWYU pragma: keep

#include "cmCTestGenericHandler.h"
#include "cmDuration.h"

#include <sstream>
#include <stddef.h>
#include <string>
#include <vector>

class cmake;

/** \class cmCTestBuildAndTestHandler
 * \brief A class that handles ctest -S invocations
 *
 */
class cmCTestBuildAndTestHandler : public cmCTestGenericHandler
{
public:
    typedef cmCTestGenericHandler Superclass;

    /*
     * The main entry point for this class
     */
    int ProcessHandler() override;

    //! Set all the build and test arguments
    int ProcessCommandLineArguments(
        const std::string& currentArg, size_t& idx,
        const std::vector<std::string>& allArgs) override;

    /*
     * Get the output variable
     */
    const char* GetOutput();

    cmCTestBuildAndTestHandler();

    void Initialize() override;

protected:
    ///! Run CMake and build a test and then run it as a single test.
    int RunCMakeAndTest(std::string* output);
    int RunCMake(std::string* outstring, std::ostringstream& out,
                 std::string& cmakeOutString, cmake* cm);

    std::string Output;

    std::string              BuildGenerator;
    std::string              BuildGeneratorPlatform;
    std::string              BuildGeneratorToolset;
    std::vector<std::string> BuildOptions;
    bool                     BuildTwoConfig;
    std::string              BuildMakeProgram;
    std::string              ConfigSample;
    std::string              SourceDir;
    std::string              BinaryDir;
    std::string              BuildProject;
    std::string              TestCommand;
    bool                     BuildNoClean;
    std::string              BuildRunDir;
    std::string              ExecutableDirectory;
    std::vector<std::string> TestCommandArgs;
    std::vector<std::string> BuildTargets;
    bool                     BuildNoCMake;
    cmDuration               Timeout;
};

#endif
