| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  Created by Phil on 15/5/2013. | 
					
						
							|  |  |  |  *  Copyright 2014 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_TEST_SPEC_PARSER_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 18:24:07 +01:00
										 |  |  | #ifdef __clang__
 | 
					
						
							|  |  |  | #pragma clang diagnostic push
 | 
					
						
							|  |  |  | #pragma clang diagnostic ignored "-Wpadded"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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"
 | 
					
						
							| 
									
										
										
										
											2014-06-30 07:33:17 +01:00
										 |  |  | #include "catch_interfaces_tag_alias_registry.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Catch { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class TestSpecParser { | 
					
						
							| 
									
										
										
										
											2017-01-11 16:24:00 +00:00
										 |  |  |         enum Mode{ None, Name, QuotedName, Tag, EscapedName }; | 
					
						
							| 
									
										
										
										
											2017-07-20 00:27:28 +02:00
										 |  |  |         Mode m_mode = None; | 
					
						
							|  |  |  |         bool m_exclusion = false; | 
					
						
							|  |  |  |         std::size_t m_start = std::string::npos, m_pos = 0; | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |         std::string m_arg; | 
					
						
							| 
									
										
										
										
											2017-01-11 16:24:00 +00:00
										 |  |  |         std::vector<std::size_t> m_escapeChars; | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |         TestSpec::Filter m_currentFilter; | 
					
						
							| 
									
										
										
										
											2014-05-16 18:24:07 +01:00
										 |  |  |         TestSpec m_testSpec; | 
					
						
							| 
									
										
										
										
											2017-07-20 00:27:28 +02:00
										 |  |  |         ITagAliasRegistry const* m_tagAliases = nullptr; | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     public: | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |         TestSpecParser( ITagAliasRegistry const& tagAliases ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TestSpecParser& parse( std::string const& arg ); | 
					
						
							|  |  |  |         TestSpec testSpec(); | 
					
						
							| 
									
										
										
										
											2014-06-30 07:33:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |     private: | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |         void visitChar( char c ); | 
					
						
							|  |  |  |         void startNewMode( Mode mode, std::size_t start ); | 
					
						
							|  |  |  |         void escape(); | 
					
						
							|  |  |  |         std::string subString() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |         template<typename T> | 
					
						
							|  |  |  |         void addPattern() { | 
					
						
							|  |  |  |             std::string token = subString(); | 
					
						
							| 
									
										
										
										
											2017-09-18 17:13:17 +01:00
										 |  |  |             for( std::size_t i = 0; i < m_escapeChars.size(); ++i ) | 
					
						
							| 
									
										
										
										
											2017-02-22 07:49:38 +00:00
										 |  |  |                 token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); | 
					
						
							| 
									
										
										
										
											2017-01-11 16:24:00 +00:00
										 |  |  |             m_escapeChars.clear(); | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |             if( startsWith( token, "exclude:" ) ) { | 
					
						
							|  |  |  |                 m_exclusion = true; | 
					
						
							|  |  |  |                 token = token.substr( 8 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             if( !token.empty() ) { | 
					
						
							| 
									
										
										
										
											2017-04-25 21:01:40 +01:00
										 |  |  |                 TestSpec::PatternPtr pattern = std::make_shared<T>( token ); | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |                 if( m_exclusion ) | 
					
						
							| 
									
										
										
										
											2017-04-25 21:01:40 +01:00
										 |  |  |                     pattern = std::make_shared<TestSpec::ExcludedPattern>( pattern ); | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |                 m_currentFilter.m_patterns.push_back( pattern ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             m_exclusion = false; | 
					
						
							|  |  |  |             m_mode = None; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         void addFilter(); | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-07-19 10:13:47 +02:00
										 |  |  |     TestSpec parseTestSpec( std::string const& arg ); | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | } // namespace Catch
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 18:24:07 +01:00
										 |  |  | #ifdef __clang__
 | 
					
						
							|  |  |  | #pragma clang diagnostic pop
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-16 07:23:31 +01:00
										 |  |  | #endif // TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
 |