Added libidentify support, including option for waiting for keypress on exit (and/ or start)

This commit is contained in:
Phil Nash 2017-08-11 19:55:55 +01:00
parent f06ed856d8
commit 917a51da6b
4 changed files with 65 additions and 17 deletions

View File

@ -22,6 +22,7 @@
#include <fstream> #include <fstream>
#include <cstdlib> #include <cstdlib>
#include <limits> #include <limits>
#include <iomanip>
namespace Catch { namespace Catch {
@ -121,6 +122,13 @@ namespace Catch {
<< m_cli << std::endl << m_cli << std::endl
<< "For more detailed usage please see the project docs\n" << std::endl; << "For more detailed usage please see the project docs\n" << std::endl;
} }
void libIdentify() {
Catch::cout()
<< std::left << std::setw(16) << "description: " << "A Catch test executable\n"
<< std::left << std::setw(16) << "category: " << "testframework\n"
<< std::left << std::setw(16) << "framework: " << "Catch Test\n"
<< std::left << std::setw(16) << "version: " << libraryVersion() << std::endl;
}
int applyCommandLine( int argc, char* argv[] ) { int applyCommandLine( int argc, char* argv[] ) {
auto result = m_cli.parse( clara::Args( argc, argv ) ); auto result = m_cli.parse( clara::Args( argc, argv ) );
@ -137,6 +145,8 @@ namespace Catch {
if( m_configData.showHelp ) if( m_configData.showHelp )
showHelp(); showHelp();
if( m_configData.libIdentify )
libIdentify();
m_config.reset(); m_config.reset();
return 0; return 0;
} }
@ -189,9 +199,36 @@ namespace Catch {
return returnCode; return returnCode;
} }
#endif #endif
int run() { int run() {
if( m_configData.showHelp ) if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) {
Catch::cout() << "...waiting for enter/ return before starting" << std::endl;
std::getchar();
}
int exitCode = runInternal();
if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) {
Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode << std::endl;
std::getchar();
}
return exitCode;
}
clara::Parser const& cli() const {
return m_cli;
}
void cli( clara::Parser const& newParser ) {
m_cli = newParser;
}
ConfigData& configData() {
return m_configData;
}
Config& config() {
if( !m_config )
m_config = std::make_shared<Config>( m_configData );
return *m_config;
}
private:
int runInternal() {
if( m_configData.showHelp || m_configData.libIdentify )
return 0; return 0;
try try
@ -215,21 +252,6 @@ namespace Catch {
} }
} }
clara::Parser const& cli() const {
return m_cli;
}
void cli( clara::Parser const& newParser ) {
m_cli = newParser;
}
ConfigData& configData() {
return m_configData;
}
Config& config() {
if( !m_config )
m_config = std::make_shared<Config>( m_configData );
return *m_config;
}
private:
clara::Parser m_cli; clara::Parser m_cli;
ConfigData m_configData; ConfigData m_configData;
std::shared_ptr<Config> m_config; std::shared_ptr<Config> m_config;

View File

@ -71,6 +71,18 @@ namespace Catch {
return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" ); return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" );
return ParserResult::ok( ParseResultType::Matched ); return ParserResult::ok( ParseResultType::Matched );
}; };
auto const setWaitForKeypress = [&]( std::string const& keypress ) {
auto keypressLc = toLower( keypress );
if( keypressLc == "start" )
config.waitForKeypress = WaitForKeypress::BeforeStart;
else if( keypressLc == "exit" )
config.waitForKeypress = WaitForKeypress::BeforeExit;
else if( keypressLc == "both" )
config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;
else
return ParserResult::runtimeError( "keypress argument must be one of: start, exit or both. '" + keypress + "' not recognised" );
return ParserResult::ok( ParseResultType::Matched );
};
auto const setVerbosity = [&]( std::string const& verbosity ) { auto const setVerbosity = [&]( std::string const& verbosity ) {
auto lcVerbosity = toLower( verbosity ); auto lcVerbosity = toLower( verbosity );
if( lcVerbosity == "quiet" ) if( lcVerbosity == "quiet" )
@ -153,6 +165,12 @@ namespace Catch {
+ Opt( setColourUsage, "yes|no" ) + Opt( setColourUsage, "yes|no" )
["--use-colour"] ["--use-colour"]
( "should output be colourised" ) ( "should output be colourised" )
+ Opt( config.libIdentify )
["--libidentify"]
( "report name and version according to libidentify standard" )
+ Opt( setWaitForKeypress, "start|exit|both" )
["--wait-for-keypress"]
( "waits for a keypress before exiting" )
+ Opt( config.benchmarkResolutionMultiple, "multiplier" ) + Opt( config.benchmarkResolutionMultiple, "multiplier" )
["--benchmark-resolution-multiple"] ["--benchmark-resolution-multiple"]
( "multiple of clock resolution to run benchmarks" ) ( "multiple of clock resolution to run benchmarks" )

View File

@ -35,6 +35,7 @@ namespace Catch {
bool showHelp = false; bool showHelp = false;
bool showInvisibles = false; bool showInvisibles = false;
bool filenamesAsTags = false; bool filenamesAsTags = false;
bool libIdentify = false;
int abortAfter = -1; int abortAfter = -1;
unsigned int rngSeed = 0; unsigned int rngSeed = 0;
@ -45,6 +46,7 @@ namespace Catch {
ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter; ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;
RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder; RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;
UseColour::YesOrNo useColour = UseColour::Auto; UseColour::YesOrNo useColour = UseColour::Auto;
WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;
std::string outputFilename; std::string outputFilename;
std::string name; std::string name;

View File

@ -43,6 +43,12 @@ namespace Catch {
Yes, Yes,
No No
}; }; }; };
struct WaitForKeypress { enum When {
Never,
BeforeStart = 1,
BeforeExit = 2,
BeforeStartAndExit = BeforeStart | BeforeExit
}; };
class TestSpec; class TestSpec;