mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-23 05:46:11 +01:00
Generate help from options objects
This commit is contained in:
parent
eb775aa7af
commit
e7db40034c
@ -147,17 +147,12 @@ namespace Catch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline void showUsage( std::ostream& os ) {
|
inline void showUsage( std::ostream& os ) {
|
||||||
os << "\t-?, -h, --help\n"
|
AllOptions options;
|
||||||
<< "\t-l, --list [all | tests | reporters [xml]]\n"
|
for( AllOptions::const_iterator it = options.begin(); it != options.end(); ++it ) {
|
||||||
<< "\t-t, --test <testspec> [<testspec>...]\n"
|
OptionParser& opt = **it;
|
||||||
<< "\t-r, --reporter <reporter name>\n"
|
os << " " << opt.optionNames() << " " << opt.argsSynopsis() << "\n";
|
||||||
<< "\t-o, --out <file name>|<%stream name>\n"
|
}
|
||||||
<< "\t-s, --success\n"
|
os << "For more detail usage please see: https://github.com/philsquared/Catch/wiki/Command-line" << std::endl;
|
||||||
<< "\t-b, --break\n"
|
|
||||||
<< "\t-n, --name <name>\n"
|
|
||||||
<< "\t-a, --abort [#]\n"
|
|
||||||
<< "\t-nt, --nothrow\n\n"
|
|
||||||
<< "For more detail usage please see: https://github.com/philsquared/Catch/wiki/Command-line" << std::endl;
|
|
||||||
}
|
}
|
||||||
inline void showHelp( std::string exeName ) {
|
inline void showHelp( std::string exeName ) {
|
||||||
std::string::size_type pos = exeName.find_last_of( "/\\" );
|
std::string::size_type pos = exeName.find_last_of( "/\\" );
|
||||||
@ -174,9 +169,7 @@ namespace Catch {
|
|||||||
try {
|
try {
|
||||||
CommandParser parser( argc, argv );
|
CommandParser parser( argc, argv );
|
||||||
|
|
||||||
AllOptions options;
|
if( Command cmd = Options::HelpOptionParser().find( parser ) ) {
|
||||||
|
|
||||||
if( Command cmd = parser.find( "-h", "-?", "--help" ) ) {
|
|
||||||
if( cmd.argsCount() != 0 )
|
if( cmd.argsCount() != 0 )
|
||||||
cmd.raiseError( "Does not accept arguments" );
|
cmd.raiseError( "Does not accept arguments" );
|
||||||
|
|
||||||
@ -185,6 +178,8 @@ namespace Catch {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AllOptions options;
|
||||||
|
|
||||||
options.parseIntoConfig( parser, config.data() );
|
options.parseIntoConfig( parser, config.data() );
|
||||||
}
|
}
|
||||||
catch( std::exception& ex ) {
|
catch( std::exception& ex ) {
|
||||||
|
@ -96,18 +96,21 @@ namespace Catch {
|
|||||||
char const * const * m_argv;
|
char const * const * m_argv;
|
||||||
};
|
};
|
||||||
|
|
||||||
class OptionParser : public IShared {
|
class OptionParser : public SharedImpl<IShared> {
|
||||||
public:
|
public:
|
||||||
virtual ~OptionParser() {}
|
virtual ~OptionParser() {}
|
||||||
|
|
||||||
void parseIntoConfig( CommandParser parser, ConfigData& config ) {
|
Command find( const CommandParser& parser ) const {
|
||||||
Command cmd;
|
Command cmd;
|
||||||
for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
|
for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
|
||||||
it != m_optionNames.end();
|
it != m_optionNames.end();
|
||||||
++it )
|
++it )
|
||||||
cmd += parser.find( *it );
|
cmd += parser.find( *it );
|
||||||
|
return cmd;
|
||||||
|
}
|
||||||
|
|
||||||
if( cmd )
|
void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
|
||||||
|
if( Command cmd = find( parser ) )
|
||||||
parseIntoConfig( cmd, config );
|
parseIntoConfig( cmd, config );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,12 +118,50 @@ namespace Catch {
|
|||||||
virtual std::string argsSynopsis() const = 0;
|
virtual std::string argsSynopsis() const = 0;
|
||||||
virtual std::string optionSummary() const = 0;
|
virtual std::string optionSummary() const = 0;
|
||||||
|
|
||||||
|
std::string optionNames() const {
|
||||||
|
std::string names;
|
||||||
|
for( std::vector<std::string>::const_iterator it = m_optionNames.begin();
|
||||||
|
it != m_optionNames.end();
|
||||||
|
++it ) {
|
||||||
|
if( !it->empty() ) {
|
||||||
|
if( !names.empty() )
|
||||||
|
names += ", ";
|
||||||
|
names += *it;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
names = "[" + names;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( names[0] == '[' )
|
||||||
|
names += "]";
|
||||||
|
return names;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector<std::string> m_optionNames;
|
std::vector<std::string> m_optionNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Options {
|
namespace Options {
|
||||||
|
|
||||||
|
class HelpOptionParser : public OptionParser {
|
||||||
|
public:
|
||||||
|
HelpOptionParser() {
|
||||||
|
m_optionNames.push_back( "-?" );
|
||||||
|
m_optionNames.push_back( "-h" );
|
||||||
|
m_optionNames.push_back( "--help" );
|
||||||
|
}
|
||||||
|
virtual std::string argsSynopsis() const {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
virtual std::string optionSummary() const {
|
||||||
|
return "Shows this usage summary";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void parseIntoConfig( const Command&, ConfigData& ) {
|
||||||
|
// Does not affect config
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class TestCaseOptionParser : public OptionParser {
|
class TestCaseOptionParser : public OptionParser {
|
||||||
public:
|
public:
|
||||||
TestCaseOptionParser() {
|
TestCaseOptionParser() {
|
||||||
@ -164,7 +205,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--list" );
|
m_optionNames.push_back( "--list" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "[all | tests | reporters [xml]]";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -203,7 +244,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--reporter" );
|
m_optionNames.push_back( "--reporter" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "<reporter name>";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -223,7 +264,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--out" );
|
m_optionNames.push_back( "--out" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "<file name>|<%stream name>";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -246,7 +287,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--success" );
|
m_optionNames.push_back( "--success" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -266,7 +307,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--break" );
|
m_optionNames.push_back( "--break" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -286,7 +327,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--name" );
|
m_optionNames.push_back( "--name" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "<name>";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -306,7 +347,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--abort" );
|
m_optionNames.push_back( "--abort" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "[#]";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -334,7 +375,7 @@ namespace Catch {
|
|||||||
m_optionNames.push_back( "--nothrow" );
|
m_optionNames.push_back( "--nothrow" );
|
||||||
}
|
}
|
||||||
virtual std::string argsSynopsis() const {
|
virtual std::string argsSynopsis() const {
|
||||||
return "!TBD";
|
return "";
|
||||||
}
|
}
|
||||||
virtual std::string optionSummary() const {
|
virtual std::string optionSummary() const {
|
||||||
return "!TBD";
|
return "!TBD";
|
||||||
@ -356,15 +397,16 @@ namespace Catch {
|
|||||||
typedef Parsers::const_iterator iterator;
|
typedef Parsers::const_iterator iterator;
|
||||||
|
|
||||||
AllOptions() {
|
AllOptions() {
|
||||||
add<Options::AbortOptionParser>();
|
|
||||||
add<Options::DebugBreakOptionParser>();
|
|
||||||
add<Options::ListOptionParser>();
|
|
||||||
add<Options::NameOptionParser>();
|
|
||||||
add<Options::NoThrowOptionParser>();
|
|
||||||
add<Options::OutputOptionParser>();
|
|
||||||
add<Options::ReporterOptionParser>();
|
|
||||||
add<Options::SuccesssOptionParser>();
|
|
||||||
add<Options::TestCaseOptionParser>();
|
add<Options::TestCaseOptionParser>();
|
||||||
|
add<Options::ListOptionParser>();
|
||||||
|
add<Options::ReporterOptionParser>();
|
||||||
|
add<Options::OutputOptionParser>();
|
||||||
|
add<Options::SuccesssOptionParser>();
|
||||||
|
add<Options::DebugBreakOptionParser>();
|
||||||
|
add<Options::NameOptionParser>();
|
||||||
|
add<Options::AbortOptionParser>();
|
||||||
|
add<Options::NoThrowOptionParser>();
|
||||||
|
add<Options::HelpOptionParser>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
|
void parseIntoConfig( const CommandParser& parser, ConfigData& config ) {
|
||||||
@ -382,7 +424,7 @@ namespace Catch {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void add() {
|
void add() {
|
||||||
m_parsers.push_back( new SharedImpl<T>() );
|
m_parsers.push_back( new T() );
|
||||||
}
|
}
|
||||||
Parsers m_parsers;
|
Parsers m_parsers;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user