mirror of
https://github.com/catchorg/Catch2.git
synced 2025-05-29 07:59:25 +00:00
Use new line wrapper to show test case list, with tags, in columns
This commit is contained in:
parent
9e8abc33e7
commit
15fd032608
8 changed files with 137 additions and 76 deletions
|
@ -9,7 +9,10 @@
|
|||
#define TWOBLUECUBES_CATCH_LIST_HPP_INCLUDED
|
||||
|
||||
#include "catch_commandline.hpp"
|
||||
#include "catch_line_wrap.h"
|
||||
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Catch {
|
||||
inline bool matchesFilters( const std::vector<TestCaseFilters>& filters, const TestCase& testCase ) {
|
||||
|
@ -20,47 +23,80 @@ namespace Catch {
|
|||
return false;
|
||||
return true;
|
||||
}
|
||||
inline void List( const ConfigData& config ) {
|
||||
|
||||
if( config.listSpec & List::Reports ) {
|
||||
std::cout << "Available reports:\n";
|
||||
IReporterRegistry::FactoryMap::const_iterator it = getRegistryHub().getReporterRegistry().getFactories().begin();
|
||||
IReporterRegistry::FactoryMap::const_iterator itEnd = getRegistryHub().getReporterRegistry().getFactories().end();
|
||||
for(; it != itEnd; ++it ) {
|
||||
// !TBD: consider listAs()
|
||||
std::cout << "\t" << it->first << "\n\t\t'" << it->second->getDescription() << "'\n";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
|
||||
inline void listTests( const ConfigData& config ) {
|
||||
if( config.filters.empty() )
|
||||
std::cout << "All available test cases:\n";
|
||||
else
|
||||
std::cout << "Matching test cases:\n";
|
||||
std::vector<TestCase> const& allTests = getRegistryHub().getTestCaseRegistry().getAllTests();
|
||||
std::vector<TestCase>::const_iterator it = allTests.begin(), itEnd = allTests.end();
|
||||
|
||||
// First pass - get max tags
|
||||
std::size_t maxTagLen = 0;
|
||||
std::size_t maxNameLen = 0;
|
||||
for(; it != itEnd; ++it ) {
|
||||
maxTagLen = (std::max)( it->getTestCaseInfo().tagsAsString.size(), maxTagLen );
|
||||
maxNameLen = (std::max)( it->getTestCaseInfo().name.size(), maxNameLen );
|
||||
}
|
||||
|
||||
if( config.listSpec & List::Tests ) {
|
||||
if( config.filters.empty() )
|
||||
std::cout << "All available test cases:\n";
|
||||
// Try to fit everything in. If not shrink tag column first, down to 30
|
||||
// then shrink name column until it all fits (strings will be wrapped within column)
|
||||
while( maxTagLen + maxNameLen > CATCH_CONFIG_CONSOLE_WIDTH-5 ) {
|
||||
if( maxTagLen > 30 )
|
||||
--maxTagLen;
|
||||
else
|
||||
std::cout << "Matching test cases:\n";
|
||||
std::vector<TestCase>::const_iterator it = getRegistryHub().getTestCaseRegistry().getAllTests().begin();
|
||||
std::vector<TestCase>::const_iterator itEnd = getRegistryHub().getTestCaseRegistry().getAllTests().end();
|
||||
std::size_t matchedTests = 0;
|
||||
for(; it != itEnd; ++it ) {
|
||||
if( matchesFilters( config.filters, *it ) ) {
|
||||
matchedTests++;
|
||||
// !TBD: consider listAs()
|
||||
std::cout << " " << it->getTestCaseInfo().name << "\n";
|
||||
if( ( config.listSpec & List::TestNames ) != List::TestNames )
|
||||
std::cout << " '" << it->getTestCaseInfo().description << "'\n";
|
||||
--maxNameLen;
|
||||
}
|
||||
|
||||
std::size_t matchedTests = 0;
|
||||
for( it = allTests.begin(); it != itEnd; ++it ) {
|
||||
if( matchesFilters( config.filters, *it ) ) {
|
||||
matchedTests++;
|
||||
// !TBD: consider listAs()
|
||||
LineWrapper nameWrapper;
|
||||
nameWrapper.setRight( maxNameLen ).setIndent( 2 ).wrap( it->getTestCaseInfo().name );
|
||||
|
||||
LineWrapper tagsWrapper;
|
||||
tagsWrapper.setRight( maxTagLen ).wrap( it->getTestCaseInfo().tagsAsString );
|
||||
|
||||
for( std::size_t i = 0; i < std::max( nameWrapper.size(), tagsWrapper.size() ); ++i ) {
|
||||
std::string nameCol;
|
||||
if( i < nameWrapper.size() )
|
||||
nameCol = nameWrapper[i];
|
||||
else
|
||||
nameCol = " ...";
|
||||
std::cout << nameCol << " " << std::string( maxNameLen - nameCol.size(), ' ' );
|
||||
if( i < tagsWrapper.size() )
|
||||
std::cout << tagsWrapper[i];
|
||||
std::cout << "\n";
|
||||
}
|
||||
}
|
||||
if( config.filters.empty() )
|
||||
std::cout << pluralise( matchedTests, "test case" ) << std::endl;
|
||||
else
|
||||
std::cout << pluralise( matchedTests, "matching test case" ) << std::endl;
|
||||
}
|
||||
|
||||
if( ( config.listSpec & List::All ) == 0 ) {
|
||||
std::ostringstream oss;
|
||||
oss << "Unknown list type";
|
||||
throw std::domain_error( oss.str() );
|
||||
if( config.filters.empty() )
|
||||
std::cout << pluralise( matchedTests, "test case" ) << std::endl;
|
||||
else
|
||||
std::cout << pluralise( matchedTests, "matching test case" ) << std::endl;
|
||||
}
|
||||
|
||||
inline void listReporters( const ConfigData& /*config*/ ) {
|
||||
std::cout << "Available reports:\n";
|
||||
IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories();
|
||||
IReporterRegistry::FactoryMap::const_iterator it = factories.begin(), itEnd = factories.end();
|
||||
for(; it != itEnd; ++it ) {
|
||||
// !TBD: consider listAs()
|
||||
std::cout << "\t" << it->first << "\n\t\t'" << it->second->getDescription() << "'\n";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
inline void list( const ConfigData& config ) {
|
||||
if( config.listSpec & List::Tests )
|
||||
listTests( config );
|
||||
else if( config.listSpec & List::Reports )
|
||||
listReporters( config );
|
||||
else
|
||||
throw std::logic_error( "Unknown list type" );
|
||||
}
|
||||
|
||||
} // end namespace Catch
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue