mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-26 15:26:11 +01:00
Clara: support for binary functions
This commit is contained in:
parent
d44f2cf40f
commit
3dde25be7d
@ -149,6 +149,24 @@ namespace Clara {
|
|||||||
void (*function)( C& );
|
void (*function)( C& );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename C, typename T>
|
||||||
|
struct BoundBinaryFunction : IArgFunction<C>{
|
||||||
|
BoundBinaryFunction( void (*_function)( C&, T ) ) : function( _function ) {}
|
||||||
|
virtual void set( C& obj, std::string const& stringValue ) const {
|
||||||
|
typename RemoveConstRef<T>::type value;
|
||||||
|
convertInto( stringValue, value );
|
||||||
|
function( obj, value );
|
||||||
|
}
|
||||||
|
virtual void setFlag( C& obj ) const {
|
||||||
|
typename RemoveConstRef<T>::type value;
|
||||||
|
convertInto( true, value );
|
||||||
|
function( obj, value );
|
||||||
|
}
|
||||||
|
virtual bool takesArg() const { return !IsBool<T>::value; }
|
||||||
|
virtual IArgFunction<C>* clone() const { return new BoundBinaryFunction( *this ); }
|
||||||
|
void (*function)( C&, T );
|
||||||
|
};
|
||||||
|
|
||||||
template<typename C, typename M>
|
template<typename C, typename M>
|
||||||
BoundArgFunction<C> makeBoundField( M C::* _member ) {
|
BoundArgFunction<C> makeBoundField( M C::* _member ) {
|
||||||
return BoundArgFunction<C>( new BoundDataMember<C,M>( _member ) );
|
return BoundArgFunction<C>( new BoundDataMember<C,M>( _member ) );
|
||||||
@ -165,6 +183,10 @@ namespace Clara {
|
|||||||
BoundArgFunction<C> makeBoundField( void (*_function)( C& ) ) {
|
BoundArgFunction<C> makeBoundField( void (*_function)( C& ) ) {
|
||||||
return BoundArgFunction<C>( new BoundUnaryFunction<C>( _function ) );
|
return BoundArgFunction<C>( new BoundUnaryFunction<C>( _function ) );
|
||||||
}
|
}
|
||||||
|
template<typename C, typename T>
|
||||||
|
BoundArgFunction<C> makeBoundField( void (*_function)( C&, T ) ) {
|
||||||
|
return BoundArgFunction<C>( new BoundBinaryFunction<C, T>( _function ) );
|
||||||
|
}
|
||||||
} // namespace Detail
|
} // namespace Detail
|
||||||
|
|
||||||
struct Parser {
|
struct Parser {
|
||||||
@ -564,12 +586,15 @@ struct Config {
|
|||||||
std::vector<std::string> testsOrTags;
|
std::vector<std::string> testsOrTags;
|
||||||
|
|
||||||
// void abortAfterFirst() { abortAfter = 1; }
|
// void abortAfterFirst() { abortAfter = 1; }
|
||||||
void abortAfterX( int x ) { abortAfter = x; }
|
// void abortAfterX( int x ) { abortAfter = x; }
|
||||||
void addWarning( std::string const& _warning ) { warnings.push_back( _warning ); }
|
// void addWarning( std::string const& _warning ) { warnings.push_back( _warning ); }
|
||||||
void addTestOrTags( std::string const& _testSpec ) { testsOrTags.push_back( _testSpec ); }
|
// void addTestOrTags( std::string const& _testSpec ) { testsOrTags.push_back( _testSpec ); }
|
||||||
};
|
};
|
||||||
|
|
||||||
inline void abortAfterFirst( Config& config ) { config.abortAfter = 1; }
|
inline void abortAfterFirst( Config& config ) { config.abortAfter = 1; }
|
||||||
|
inline void abortAfterX( Config& config, int x ) { config.abortAfter = x; }
|
||||||
|
inline void addWarning( Config& config, std::string const& _warning ) { config.warnings.push_back( _warning ); }
|
||||||
|
inline void addTestOrTags( Config& config, std::string const& _testSpec ) { config.testsOrTags.push_back( _testSpec ); }
|
||||||
|
|
||||||
|
|
||||||
SCENARIO( "New Catch commandline interface", "[cli]" ) {
|
SCENARIO( "New Catch commandline interface", "[cli]" ) {
|
||||||
@ -631,19 +656,19 @@ SCENARIO( "New Catch commandline interface", "[cli]" ) {
|
|||||||
.shortOpt( "a")
|
.shortOpt( "a")
|
||||||
.longOpt( "abort" );
|
.longOpt( "abort" );
|
||||||
|
|
||||||
cli.bind( &Config::abortAfterX )
|
cli.bind( &abortAfterX )
|
||||||
.describe( "abort after x failures" )
|
.describe( "abort after x failures" )
|
||||||
.shortOpt( "x")
|
.shortOpt( "x")
|
||||||
.longOpt( "abortx" )
|
.longOpt( "abortx" )
|
||||||
.argName( "number of failures" );
|
.argName( "number of failures" );
|
||||||
|
|
||||||
cli.bind( &Config::addWarning )
|
cli.bind( &addWarning )
|
||||||
.describe( "enables warnings" )
|
.describe( "enables warnings" )
|
||||||
.shortOpt( "w")
|
.shortOpt( "w")
|
||||||
.longOpt( "warn" )
|
.longOpt( "warn" )
|
||||||
.argName( "warning name" );
|
.argName( "warning name" );
|
||||||
|
|
||||||
cli.bind( &Config::addTestOrTags )
|
cli.bind( &addTestOrTags )
|
||||||
.describe( "which test or tests to use" )
|
.describe( "which test or tests to use" )
|
||||||
.argName( "test name, pattern or tags" );
|
.argName( "test name, pattern or tags" );
|
||||||
|
|
||||||
@ -676,6 +701,14 @@ SCENARIO( "New Catch commandline interface", "[cli]" ) {
|
|||||||
|
|
||||||
REQUIRE( config.abortAfter == 1 );
|
REQUIRE( config.abortAfter == 1 );
|
||||||
}
|
}
|
||||||
|
WHEN( "A flag is set via a unary method" ) {
|
||||||
|
CHECK( config.abortAfter == 0 );
|
||||||
|
|
||||||
|
const char* argv[] = { "test", "-x", "2" };
|
||||||
|
parseInto( cli, argv, config );
|
||||||
|
|
||||||
|
REQUIRE( config.abortAfter == 2 );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user