79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  *  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
 | |
| 
 | |
| #ifdef __clang__
 | |
| #pragma clang diagnostic push
 | |
| #pragma clang diagnostic ignored "-Wpadded"
 | |
| #endif
 | |
| 
 | |
| #include "catch_test_spec.h"
 | |
| #include "catch_string_manip.h"
 | |
| #include "catch_interfaces_tag_alias_registry.h"
 | |
| 
 | |
| namespace Catch {
 | |
| 
 | |
|     class TestSpecParser {
 | |
|         enum Mode{ None, Name, QuotedName, Tag, EscapedName };
 | |
|         Mode m_mode = None;
 | |
|         Mode lastMode = None;
 | |
|         bool m_exclusion = false;
 | |
|         std::size_t m_pos = 0;
 | |
|         std::size_t m_realPatternPos = 0;
 | |
|         std::string m_arg;
 | |
|         std::string m_substring;
 | |
|         std::string m_patternName;
 | |
|         std::vector<std::size_t> m_escapeChars;
 | |
|         TestSpec::Filter m_currentFilter;
 | |
|         TestSpec m_testSpec;
 | |
|         ITagAliasRegistry const* m_tagAliases = nullptr;
 | |
| 
 | |
|     public:
 | |
|         TestSpecParser( ITagAliasRegistry const& tagAliases );
 | |
| 
 | |
|         TestSpecParser& parse( std::string const& arg );
 | |
|         TestSpec testSpec();
 | |
| 
 | |
|     private:
 | |
|         bool visitChar( char c );
 | |
|         void startNewMode( Mode mode );
 | |
|         bool processNoneChar( char c );
 | |
|         void processNameChar( char c );
 | |
|         bool processOtherChar( char c );
 | |
|         void endMode();
 | |
|         void escape();
 | |
|         bool isControlChar( char c ) const;
 | |
|         void saveLastMode();
 | |
|         void revertBackToLastMode();
 | |
|         void addFilter();
 | |
|         bool separate();
 | |
| 
 | |
|         // Handles common preprocessing of the pattern for name/tag patterns
 | |
|         std::string preprocessPattern();
 | |
|         // Adds the current pattern as a test name
 | |
|         void addNamePattern();
 | |
|         // Adds the current pattern as a tag
 | |
|         void addTagPattern();
 | |
| 
 | |
|         inline void addCharToPattern(char c) {
 | |
|             m_substring += c;
 | |
|             m_patternName += c;
 | |
|             m_realPatternPos++;
 | |
|         }
 | |
| 
 | |
|     };
 | |
|     TestSpec parseTestSpec( std::string const& arg );
 | |
| 
 | |
| } // namespace Catch
 | |
| 
 | |
| #ifdef __clang__
 | |
| #pragma clang diagnostic pop
 | |
| #endif
 | |
| 
 | |
| #endif // TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED
 |