| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Created by Martin on 19/07/2017. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  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)
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 11:24:33 +01:00
										 |  |  | #include "catch_test_spec.h"
 | 
					
						
							| 
									
										
										
										
											2017-07-25 21:57:35 +02:00
										 |  |  | #include "catch_string_manip.h"
 | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | #include "catch_interfaces_config.h"
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 22:31:27 +02:00
										 |  |  | #include <algorithm>
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <vector>
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  |     TestSpec::Pattern::Pattern( std::string const& name ) | 
					
						
							|  |  |  |     : m_name( name ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 16:51:33 +02:00
										 |  |  |     TestSpec::Pattern::~Pattern() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  |     std::string const& TestSpec::Pattern::name() const { | 
					
						
							|  |  |  |         return m_name; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString ) | 
					
						
							|  |  |  |     : Pattern( filterString ) | 
					
						
							|  |  |  |     , m_wildcardPattern( toLower( name ), CaseSensitive::No ) | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     {} | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const { | 
					
						
							| 
									
										
										
										
											2019-09-09 11:30:45 +02:00
										 |  |  |         return m_wildcardPattern.matches( testCase.name ); | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString ) | 
					
						
							|  |  |  |     : Pattern( filterString ) | 
					
						
							|  |  |  |     , m_tag( toLower( tag ) ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const { | 
					
						
							| 
									
										
										
										
											2017-07-27 22:31:27 +02:00
										 |  |  |         return std::find(begin(testCase.lcaseTags), | 
					
						
							|  |  |  |                          end(testCase.lcaseTags), | 
					
						
							|  |  |  |                          m_tag) != end(testCase.lcaseTags); | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) | 
					
						
							|  |  |  |     : Pattern( underlyingPattern->name() ) | 
					
						
							|  |  |  |     , m_underlyingPattern( underlyingPattern ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { | 
					
						
							|  |  |  |         return !m_underlyingPattern->matches( testCase ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const { | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  |         return std::all_of( m_patterns.begin(), m_patterns.end(), [&]( PatternPtr const& p ){ return p->matches( testCase ); } ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::string TestSpec::Filter::name() const { | 
					
						
							|  |  |  |         std::string name; | 
					
						
							|  |  |  |         for( auto const& p : m_patterns ) | 
					
						
							|  |  |  |             name += p->name(); | 
					
						
							|  |  |  |         return name; | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     bool TestSpec::hasFilters() const { | 
					
						
							|  |  |  |         return !m_filters.empty(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     bool TestSpec::matches( TestCaseInfo const& testCase ) const { | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  |         return std::any_of( m_filters.begin(), m_filters.end(), [&]( Filter const& f ){ return f.matches( testCase ); } ); | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     TestSpec::Matches TestSpec::matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Matches matches( m_filters.size() ); | 
					
						
							|  |  |  |         std::transform( m_filters.begin(), m_filters.end(), matches.begin(), [&]( Filter const& filter ){ | 
					
						
							|  |  |  |             std::vector<TestCase const*> currentMatches; | 
					
						
							|  |  |  |             for( auto const& test : testCases ) | 
					
						
							|  |  |  |                 if( isThrowSafe( test, config ) && filter.matches( test ) ) | 
					
						
							|  |  |  |                     currentMatches.emplace_back( &test ); | 
					
						
							|  |  |  |             return FilterMatch{ filter.name(), currentMatches }; | 
					
						
							|  |  |  |         } ); | 
					
						
							|  |  |  |         return matches; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-10-19 16:50:46 +03:00
										 |  |  |      | 
					
						
							|  |  |  |     const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{ | 
					
						
							|  |  |  |         return  (m_invalidArgs); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-08-06 20:51:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  | } |