catch2/include/internal/catch_commandline.hpp

168 lines
7.2 KiB
C++
Raw Normal View History

2010-11-10 00:24:00 +01:00
/*
* Created by Phil on 02/11/2010.
* Copyright 2010 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
#define TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED
2011-01-01 01:29:58 +01:00
#include "catch_config.hpp"
2012-08-23 21:08:50 +02:00
#include "catch_common.h"
#include "catch_clara.h"
2010-11-10 00:24:00 +01:00
#include <fstream>
2017-02-12 13:34:55 +01:00
#include <ctime>
2012-05-16 00:58:23 +02:00
namespace Catch {
2017-06-13 00:04:24 +02:00
inline clara::Parser makeCommandLineParser( ConfigData& config ) {
using namespace clara;
auto const setWarning = [&]( std::string const& warning ) {
if( warning != "NoAssertions" )
return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" );
config.warnings = static_cast<WarnAbout::What>( config.warnings | WarnAbout::NoAssertions );
return ParserResult::ok( ParseResultType::Matched );
};
2017-06-13 00:04:24 +02:00
auto const loadTestNamesFromFile = [&]( std::string const& filename ) {
std::ifstream f( filename.c_str() );
if( !f.is_open() )
return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" );
2017-06-13 00:04:24 +02:00
std::string line;
while( std::getline( f, line ) ) {
line = trim(line);
if( !line.empty() && !startsWith( line, '#' ) ) {
if( !startsWith( line, '"' ) )
line = '"' + line + '"';
config.testsOrTags.push_back( line + ',' );
}
}
return ParserResult::ok( ParseResultType::Matched );
};
auto const setTestOrder = [&]( std::string const& order ) {
if( startsWith( "declared", order ) )
config.runOrder = RunTests::InDeclarationOrder;
else if( startsWith( "lexical", order ) )
config.runOrder = RunTests::InLexicographicalOrder;
else if( startsWith( "random", order ) )
config.runOrder = RunTests::InRandomOrder;
else
return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" );
return ParserResult::ok( ParseResultType::Matched );
2017-06-13 00:04:24 +02:00
};
auto const setRngSeed = [&]( std::string const& seed ) {
if( seed != "time" )
return clara::detail::convertInto( seed, config.rngSeed );
config.rngSeed = static_cast<unsigned int>( std::time(0) );
return ParserResult::ok( ParseResultType::Matched );
};
auto const setColourUsage = [&]( std::string const& useColour ) {
auto mode = toLower( useColour );
2017-06-13 00:04:24 +02:00
if( mode == "yes" )
config.useColour = UseColour::Yes;
else if( mode == "no" )
config.useColour = UseColour::No;
else if( mode == "auto" )
config.useColour = UseColour::Auto;
else
return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" );
return ParserResult::ok( ParseResultType::Matched );
};
auto const setVerbosity = [&]( std::string const& verbosity ) {
auto lcVerbosity = toLower( verbosity );
if( lcVerbosity == "quiet" )
config.verbosity = Verbosity::Quiet;
else if( lcVerbosity == "normal" )
config.verbosity = Verbosity::Normal;
else if( lcVerbosity == "high" )
config.verbosity = Verbosity::High;
else
return ParserResult::runtimeError( "Unrecognised verbosity, '" + verbosity + "'" );
return ParserResult::ok( ParseResultType::Matched );
};
2017-06-13 00:04:24 +02:00
auto cli
2017-06-13 00:04:24 +02:00
= ExeName( config.processName )
+ Help( config.showHelp )
+ Opt( config.listTests )
2017-06-13 00:04:24 +02:00
["-l"]["--list-tests"]
( "list all/matching test cases" )
+ Opt( config.listTags )
2017-06-13 00:04:24 +02:00
["-t"]["--list-tags"]
( "list all/matching tags" )
+ Opt( config.showSuccessfulTests )
2017-06-13 00:04:24 +02:00
["-s"]["--success"]
( "include successful tests in output" )
+ Opt( config.shouldDebugBreak )
2017-06-13 00:04:24 +02:00
["-b"]["--break"]
( "break into debugger on failure" )
+ Opt( config.noThrow )
2017-06-13 00:04:24 +02:00
["-e"]["--nothrow"]
( "skip exception tests" )
+ Opt( config.showInvisibles )
2017-06-13 00:04:24 +02:00
["-i"]["--invisibles"]
( "show invisibles (tabs, newlines)" )
+ Opt( config.outputFilename, "filename" )
2017-06-13 00:04:24 +02:00
["-o"]["--out"]
( "output filename" )
+ Opt( config.reporterNames, "name" )
2017-06-13 00:04:24 +02:00
["-r"]["--reporter"]
( "reporter to use (defaults to console)" )
+ Opt( config.name, "name" )
2017-06-13 00:04:24 +02:00
["-n"]["--name"]
( "suite name" )
+ Opt( [&]( bool ){ config.abortAfter = 1; } )
2017-06-13 00:04:24 +02:00
["-a"]["--abort"]
( "abort at first failure" )
+ Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" )
2017-06-13 00:04:24 +02:00
["-x"]["--abortx"]
( "abort after x failures" )
+ Opt( setWarning, "warning name" )
2017-06-13 00:04:24 +02:00
["-w"]["--warn"]
( "enable warnings" )
+ Opt( [&]( bool ) { config.showDurations = ShowDurations::Always; } )
2017-06-13 00:04:24 +02:00
["-d"]["--durations"]
( "show test durations" )
+ Opt( loadTestNamesFromFile, "filename" )
2017-06-13 00:04:24 +02:00
["-f"]["--input-file"]
( "load test names to run from a file" )
+ Opt( config.filenamesAsTags )
2017-06-13 00:04:24 +02:00
["-#"]["--filenames-as-tags"]
( "adds a tag for the filename" )
+ Opt( config.sectionsToRun, "section name" )
2017-06-13 00:04:24 +02:00
["-c"]["--section"]
( "specify section to run" )
+ Opt( setVerbosity, "quiet|normal|high" )
["-v"]["--verbosity"]
( "set output verbosity" )
+ Opt( config.listTestNamesOnly )
2017-06-13 00:04:24 +02:00
["--list-test-names-only"]
( "list all/matching test cases names only" )
+ Opt( config.listReporters )
2017-06-13 00:04:24 +02:00
["--list-reporters"]
( "list all reporters" )
+ Opt( setTestOrder, "decl|lex|rand" )
2017-06-13 00:04:24 +02:00
["--order"]
( "test case order (defaults to decl)" )
+ Opt( setRngSeed, "'time'|number" )
2017-06-13 00:04:24 +02:00
["--rng-seed"]
( "set a specific seed for random numbers" )
+ Opt( setColourUsage, "yes|no" )
2017-06-13 00:04:24 +02:00
["--use-colour"]
( "should output be colourised" )
+ Arg( config.testsOrTags, "test name|pattern|tags" )
2017-06-13 00:04:24 +02:00
( "which test or tests to use" );
return cli;
}
2010-11-10 00:24:00 +01:00
} // end namespace Catch
#endif // TWOBLUECUBES_CATCH_COMMANDLINE_HPP_INCLUDED