1 /* 2 * Created by Phil on 15/5/2013. 3 * Copyright 2014 Two Blue Cubes Ltd. All rights reserved. 4 * 5 * Distributed under the Boost Software License, Version 1.0. (See accompanying 6 * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 #ifndef TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED 9 #define TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED 10 11 #ifdef __clang__ 12 #pragma clang diagnostic push 13 #pragma clang diagnostic ignored "-Wpadded" 14 #endif 15 16 #include "catch_test_spec.h" 17 #include "catch_string_manip.h" 18 #include "catch_interfaces_tag_alias_registry.h" 19 20 namespace Catch { 21 22 class TestSpecParser { 23 enum Mode{ None, Name, QuotedName, Tag, EscapedName }; 24 Mode m_mode = None; 25 bool m_exclusion = false; 26 std::size_t m_start = std::string::npos, m_pos = 0; 27 std::string m_arg; 28 std::vector<std::size_t> m_escapeChars; 29 TestSpec::Filter m_currentFilter; 30 TestSpec m_testSpec; 31 ITagAliasRegistry const* m_tagAliases = nullptr; 32 33 public: 34 TestSpecParser( ITagAliasRegistry const& tagAliases ); 35 36 TestSpecParser& parse( std::string const& arg ); 37 TestSpec testSpec(); 38 39 private: 40 void visitChar( char c ); 41 void startNewMode( Mode mode, std::size_t start ); 42 void escape(); 43 std::string subString() const; 44 45 template<typename T> 46 void addPattern() { 47 std::string token = subString(); 48 for( std::size_t i = 0; i < m_escapeChars.size(); ++i ) 49 token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); 50 m_escapeChars.clear(); 51 if( startsWith( token, "exclude:" ) ) { 52 m_exclusion = true; 53 token = token.substr( 8 ); 54 } 55 if( !token.empty() ) { 56 TestSpec::PatternPtr pattern = std::make_shared<T>( token ); 57 if( m_exclusion ) 58 pattern = std::make_shared<TestSpec::ExcludedPattern>( pattern ); 59 m_currentFilter.m_patterns.push_back( pattern ); 60 } 61 m_exclusion = false; 62 m_mode = None; 63 } 64 65 void addFilter(); 66 }; 67 TestSpec parseTestSpec( std::string const& arg ); 68 69 } // namespace Catch 70 71 #ifdef __clang__ 72 #pragma clang diagnostic pop 73 #endif 74 75 #endif // TWOBLUECUBES_CATCH_TEST_SPEC_PARSER_HPP_INCLUDED 76