mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Refactored last usages of old tag parser and removed all the, now redundant, tag parsing code
This commit is contained in:
		| @@ -25,7 +25,6 @@ | ||||
| #include "catch_assertionresult.hpp" | ||||
| #include "catch_expressionresult_builder.hpp" | ||||
| #include "catch_test_case_info.hpp" | ||||
| #include "catch_tags.hpp" | ||||
| #include "catch_test_spec.hpp" | ||||
| #include "catch_version.hpp" | ||||
| #include "catch_message.hpp" | ||||
|   | ||||
| @@ -1,109 +0,0 @@ | ||||
| /* | ||||
|  *  Created by Phil on 2/12/2013. | ||||
|  *  Copyright 2013 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_TAGS_H_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_TAGS_H_INCLUDED | ||||
|  | ||||
| #include "catch_common.h" | ||||
|  | ||||
| #include <string> | ||||
| #include <set> | ||||
| #include <map> | ||||
| #include <vector> | ||||
|  | ||||
| #ifdef __clang__ | ||||
| #pragma clang diagnostic ignored "-Wpadded" | ||||
| #endif | ||||
|  | ||||
| namespace Catch { | ||||
|     class TagParser { | ||||
|     public: | ||||
|         virtual ~TagParser(); | ||||
|  | ||||
|         void parse( std::string const& str ); | ||||
|  | ||||
|     protected: | ||||
|         virtual void acceptTag( std::string const& tag ) = 0; | ||||
|         virtual void acceptChar( char c ) = 0; | ||||
|         virtual void endParse() {} | ||||
|  | ||||
|     private: | ||||
|     }; | ||||
|  | ||||
|     class TagExtracter : public TagParser { | ||||
|     public: | ||||
|  | ||||
|         TagExtracter( std::set<std::string>& tags ); | ||||
|         virtual ~TagExtracter(); | ||||
|  | ||||
|         void parse( std::string& description ); | ||||
|  | ||||
|     private: | ||||
|         virtual void acceptTag( std::string const& tag ); | ||||
|         virtual void acceptChar( char c ); | ||||
|  | ||||
|         TagExtracter& operator=(TagExtracter const&); | ||||
|  | ||||
|         std::set<std::string>& m_tags; | ||||
|         std::string m_remainder; | ||||
|     }; | ||||
|  | ||||
|     class Tag { | ||||
|     public: | ||||
|         Tag(); | ||||
|         Tag( std::string const& name, bool isNegated ); | ||||
|         std::string getName() const; | ||||
|         bool isNegated() const; | ||||
|         bool operator ! () const; | ||||
|  | ||||
|     private: | ||||
|         std::string m_name; | ||||
|         bool m_isNegated; | ||||
|     }; | ||||
|  | ||||
|     class TagSet { | ||||
|         typedef std::map<std::string, Tag> TagMap; | ||||
|     public: | ||||
|         void add( Tag const& tag ); | ||||
|         bool empty() const; | ||||
|         bool matches( std::set<std::string> const& tags ) const; | ||||
|  | ||||
|     private: | ||||
|         TagMap m_tags; | ||||
|     }; | ||||
|  | ||||
|  | ||||
|     class TagExpression { | ||||
|     public: | ||||
|         bool matches( std::set<std::string> const& tags ) const; | ||||
|  | ||||
|     private: | ||||
|         friend class TagExpressionParser; | ||||
|  | ||||
|         std::vector<TagSet> m_tagSets; | ||||
|     }; | ||||
|  | ||||
|     class TagExpressionParser : public TagParser { | ||||
|     public: | ||||
|         TagExpressionParser( TagExpression& exp ); | ||||
|         ~TagExpressionParser(); | ||||
|  | ||||
|     private: | ||||
|         virtual void acceptTag( std::string const& tag ); | ||||
|         virtual void acceptChar( char c ); | ||||
|         virtual void endParse(); | ||||
|  | ||||
|         TagExpressionParser& operator=(TagExpressionParser const&); | ||||
|  | ||||
|         bool m_isNegated; | ||||
|         TagSet m_currentTagSet; | ||||
|         TagExpression& m_exp; | ||||
|     }; | ||||
|  | ||||
| } // end namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED | ||||
| @@ -1,137 +0,0 @@ | ||||
| /* | ||||
|  *  Created by Phil on 14/08/2012. | ||||
|  *  Copyright 2012 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_TAGS_HPP_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED | ||||
|  | ||||
| #include "catch_tags.h" | ||||
|  | ||||
| namespace Catch { | ||||
|     TagParser::~TagParser() {} | ||||
|  | ||||
|     void TagParser::parse( std::string const& str ) { | ||||
|         std::size_t pos = 0; | ||||
|         while( pos < str.size() ) { | ||||
|             char c = str[pos]; | ||||
|             if( c == '[' ) { | ||||
|                 std::size_t end = str.find_first_of( ']', pos ); | ||||
|                 if( end != std::string::npos ) { | ||||
|                     acceptTag( str.substr( pos+1, end-pos-1 ) ); | ||||
|                     pos = end+1; | ||||
|                 } | ||||
|                 else { | ||||
|                     acceptChar( c ); | ||||
|                     pos++; | ||||
|                 } | ||||
|             } | ||||
|             else { | ||||
|                 acceptChar( c ); | ||||
|                 pos++; | ||||
|             } | ||||
|         } | ||||
|         endParse(); | ||||
|     } | ||||
|  | ||||
|     TagExtracter::TagExtracter( std::set<std::string>& tags ) | ||||
|     :   m_tags( tags ) | ||||
|     {} | ||||
|  | ||||
|     TagExtracter::~TagExtracter() {} | ||||
|  | ||||
|     void TagExtracter::parse( std::string& description ) { | ||||
|         TagParser::parse( description ); | ||||
|         description = m_remainder; | ||||
|     } | ||||
|  | ||||
|     void TagExtracter::acceptTag( std::string const& tag ) { | ||||
|         m_tags.insert( toLower( tag ) ); | ||||
|     } | ||||
|     void TagExtracter::acceptChar( char c ) { | ||||
|         m_remainder += c; | ||||
|     } | ||||
|  | ||||
|     Tag::Tag() : m_isNegated( false ) {} | ||||
|     Tag::Tag( std::string const& name, bool isNegated ) | ||||
|     :   m_name( name ), | ||||
|         m_isNegated( isNegated ) | ||||
|     {} | ||||
|  | ||||
|     std::string Tag::getName() const { | ||||
|         return m_name; | ||||
|     } | ||||
|     bool Tag::isNegated() const { | ||||
|         return m_isNegated; | ||||
|     } | ||||
|  | ||||
|     bool Tag::operator ! () const { | ||||
|         return m_name.empty(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     void TagSet::add( Tag const& tag ) { | ||||
|         m_tags.insert( std::make_pair( toLower( tag.getName() ), tag ) ); | ||||
|     } | ||||
|  | ||||
|     bool TagSet::empty() const { | ||||
|         return m_tags.empty(); | ||||
|     } | ||||
|  | ||||
|     bool TagSet::matches( std::set<std::string> const& tags ) const { | ||||
|         for(    TagMap::const_iterator | ||||
|                     it = m_tags.begin(), itEnd = m_tags.end(); | ||||
|                 it != itEnd; | ||||
|                 ++it ) { | ||||
|             bool found = tags.find( it->first ) != tags.end(); | ||||
|             if( found == it->second.isNegated() ) | ||||
|                 return false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     bool TagExpression::matches( std::set<std::string> const& tags ) const { | ||||
|         for(    std::vector<TagSet>::const_iterator | ||||
|                     it = m_tagSets.begin(), itEnd = m_tagSets.end(); | ||||
|                 it != itEnd; | ||||
|                 ++it ) | ||||
|             if( it->matches( tags ) ) | ||||
|                 return true; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     TagExpressionParser::TagExpressionParser( TagExpression& exp ) | ||||
|     :   m_isNegated( false ), | ||||
|         m_exp( exp ) | ||||
|     {} | ||||
|  | ||||
|     TagExpressionParser::~TagExpressionParser() {} | ||||
|  | ||||
|     void TagExpressionParser::acceptTag( std::string const& tag ) { | ||||
|         m_currentTagSet.add( Tag( tag, m_isNegated ) ); | ||||
|         m_isNegated = false; | ||||
|     } | ||||
|  | ||||
|     void TagExpressionParser::acceptChar( char c ) { | ||||
|         switch( c ) { | ||||
|             case '~': | ||||
|                 m_isNegated = true; | ||||
|                 break; | ||||
|             case ',': | ||||
|                 m_exp.m_tagSets.push_back( m_currentTagSet ); | ||||
|                 m_currentTagSet = TagSet(); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void TagExpressionParser::endParse() { | ||||
|         if( !m_currentTagSet.empty() ) | ||||
|             m_exp.m_tagSets.push_back( m_currentTagSet ); | ||||
|     } | ||||
|  | ||||
| } // end namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_TAGS_HPP_INCLUDED | ||||
| @@ -57,9 +57,6 @@ namespace Catch { | ||||
|  | ||||
|         bool isHidden() const; | ||||
|         bool throws() const; | ||||
|         bool hasTag( std::string const& tag ) const; | ||||
|         bool matchesTags( std::string const& tagPattern ) const; | ||||
|         std::set<std::string> const& getTags() const; | ||||
|  | ||||
|         void swap( TestCase& other ); | ||||
|         bool operator == ( TestCase const& other ) const; | ||||
|   | ||||
| @@ -11,7 +11,6 @@ | ||||
| #include "catch_test_spec.hpp" | ||||
| #include "catch_test_case_info.h" | ||||
| #include "catch_interfaces_testcase.h" | ||||
| #include "catch_tags.h" | ||||
| #include "catch_common.h" | ||||
|  | ||||
| namespace Catch { | ||||
| @@ -25,25 +24,12 @@ namespace Catch { | ||||
|     inline bool isReservedTag( std::string const& tag ) { | ||||
|         return !isSpecialTag( tag ) && tag.size() > 0 && !isalnum( tag[0] ); | ||||
|     } | ||||
|  | ||||
|     TestCase makeTestCase(  ITestCase* _testCase, | ||||
|                             std::string const& _className, | ||||
|                             std::string const& _name, | ||||
|                             std::string const& _descOrTags, | ||||
|                             SourceLineInfo const& _lineInfo ) | ||||
|     { | ||||
|         std::string desc = _descOrTags; | ||||
|         bool isHidden( startsWith( _name, "./" ) ); // Legacy support | ||||
|         std::set<std::string> tags; | ||||
|         TagExtracter( tags ).parse( desc ); | ||||
|         for( std::set<std::string>::const_iterator it = tags.begin(), itEnd = tags.end(); | ||||
|                 it != itEnd; | ||||
|                 ++it ) | ||||
|             if( isReservedTag( *it ) ) { | ||||
|     inline void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { | ||||
|         if( isReservedTag( tag ) ) { | ||||
|             { | ||||
|                 Colour colourGuard( Colour::Red ); | ||||
|                 std::cerr | ||||
|                         << "Tag name [" << *it << "] not allowed.\n" | ||||
|                     << "Tag name [" << tag << "] not allowed.\n" | ||||
|                     << "Tag names starting with non alpha-numeric characters are reserved\n"; | ||||
|             } | ||||
|             { | ||||
| @@ -52,14 +38,46 @@ namespace Catch { | ||||
|             } | ||||
|             exit(1); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|         if( tags.find( "hide" ) != tags.end() || tags.find( "." ) != tags.end() ) | ||||
|             isHidden = true; | ||||
|     TestCase makeTestCase(  ITestCase* _testCase, | ||||
|                             std::string const& _className, | ||||
|                             std::string const& _name, | ||||
|                             std::string const& _descOrTags, | ||||
|                             SourceLineInfo const& _lineInfo ) | ||||
|     { | ||||
|         bool isHidden( startsWith( _name, "./" ) ); // Legacy support | ||||
|  | ||||
|         if( isHidden ) { | ||||
|         // Parse out tags | ||||
|         std::set<std::string> tags; | ||||
|         std::string desc, tag; | ||||
|         bool inTag = false; | ||||
|         for( std::size_t i = 0; i < _descOrTags.size(); ++i ) { | ||||
|             char c = _descOrTags[i]; | ||||
|             if( !inTag ) { | ||||
|                 if( c == '[' ) | ||||
|                     inTag = true; | ||||
|                 else | ||||
|                     desc += c; | ||||
|             } | ||||
|             else { | ||||
|                 if( c == ']' ) { | ||||
|                     enforceNotReservedTag( tag, _lineInfo ); | ||||
|  | ||||
|                     inTag = false; | ||||
|                     if( tag == "hide" || tag == "." ) { | ||||
|                         tags.insert( "hide" ); | ||||
|                         tags.insert( "." ); | ||||
|                     } | ||||
|                     else { | ||||
|                         tags.insert( tag ); | ||||
|                     } | ||||
|                     tag.clear(); | ||||
|                 } | ||||
|                 else | ||||
|                     tag += c; | ||||
|             } | ||||
|         } | ||||
|         TestCaseInfo info( _name, _className, desc, tags, isHidden, _lineInfo ); | ||||
|         return TestCase( _testCase, info ); | ||||
|     } | ||||
| @@ -122,18 +140,6 @@ namespace Catch { | ||||
|         return TestCaseInfo::throws; | ||||
|     } | ||||
|  | ||||
|     bool TestCase::hasTag( std::string const& tag ) const { | ||||
|         return tags.find( toLower( tag ) ) != tags.end(); | ||||
|     } | ||||
|     bool TestCase::matchesTags( std::string const& tagPattern ) const { | ||||
|         TagExpression exp; | ||||
|         TagExpressionParser( exp ).parse( tagPattern ); | ||||
|         return exp.matches( tags ); | ||||
|     } | ||||
|     std::set<std::string> const& TestCase::getTags() const { | ||||
|         return tags; | ||||
|     } | ||||
|  | ||||
|     void TestCase::swap( TestCase& other ) { | ||||
|         test.swap( other.test ); | ||||
|         className.swap( other.className ); | ||||
|   | ||||
| @@ -1,2 +0,0 @@ | ||||
| // This file is only here to verify (to the extent possible) the self sufficiency of the header | ||||
| #include "catch_tags.h" | ||||
| @@ -8,7 +8,6 @@ | ||||
|  | ||||
| /* Begin PBXBuildFile section */ | ||||
| 		2656C2211925E7330040DB02 /* catch_test_spec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2656C2201925E7330040DB02 /* catch_test_spec.cpp */; }; | ||||
| 		2656C2251925EC870040DB02 /* catch_tags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2656C2241925EC870040DB02 /* catch_tags.cpp */; }; | ||||
| 		266B06B816F3A60A004ED264 /* VariadicMacrosTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */; }; | ||||
| 		266ECD74170F3C620030D735 /* BDDTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 266ECD73170F3C620030D735 /* BDDTests.cpp */; }; | ||||
| 		26847E5F16BBADB40043B9C1 /* catch_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26847E5D16BBADB40043B9C1 /* catch_message.cpp */; }; | ||||
| @@ -68,9 +67,6 @@ | ||||
| 		263FD06117AF8DF200988A20 /* catch_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_timer.h; sourceTree = "<group>"; }; | ||||
| 		2656C21F1925E5100040DB02 /* catch_test_spec_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_test_spec_parser.hpp; sourceTree = "<group>"; }; | ||||
| 		2656C2201925E7330040DB02 /* catch_test_spec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_test_spec.cpp; path = ../../../SelfTest/SurrogateCpps/catch_test_spec.cpp; sourceTree = "<group>"; }; | ||||
| 		2656C2221925EC6F0040DB02 /* catch_tags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = catch_tags.h; sourceTree = "<group>"; }; | ||||
| 		2656C2231925EC6F0040DB02 /* catch_tags.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_tags.hpp; sourceTree = "<group>"; }; | ||||
| 		2656C2241925EC870040DB02 /* catch_tags.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = catch_tags.cpp; path = ../../../SelfTest/SurrogateCpps/catch_tags.cpp; sourceTree = "<group>"; }; | ||||
| 		266B06B616F3A60A004ED264 /* VariadicMacrosTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VariadicMacrosTests.cpp; path = ../../../SelfTest/VariadicMacrosTests.cpp; sourceTree = "<group>"; }; | ||||
| 		266ECD73170F3C620030D735 /* BDDTests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BDDTests.cpp; path = ../../../SelfTest/BDDTests.cpp; sourceTree = "<group>"; }; | ||||
| 		266ECD8C1713614B0030D735 /* catch_legacy_reporter_adapter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = catch_legacy_reporter_adapter.hpp; sourceTree = "<group>"; }; | ||||
| @@ -304,7 +300,6 @@ | ||||
| 		4A8E4DCF160A34E200194CBD /* SurrogateCpps */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				2656C2241925EC870040DB02 /* catch_tags.cpp */, | ||||
| 				2656C2201925E7330040DB02 /* catch_test_spec.cpp */, | ||||
| 				4AEE031F16142F910071E950 /* catch_common.cpp */, | ||||
| 				4AEE032216142FC70071E950 /* catch_debugger.cpp */, | ||||
| @@ -387,8 +382,6 @@ | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				261488FA184C81130041FBEB /* catch_test_spec.hpp */, | ||||
| 				2656C2221925EC6F0040DB02 /* catch_tags.h */, | ||||
| 				2656C2231925EC6F0040DB02 /* catch_tags.hpp */, | ||||
| 				2656C21F1925E5100040DB02 /* catch_test_spec_parser.hpp */, | ||||
| 				4A6D0C4A149B3E3D00DB3EAA /* catch_config.hpp */, | ||||
| 				4A6D0C51149B3E3D00DB3EAA /* catch_context.h */, | ||||
| @@ -521,7 +514,6 @@ | ||||
| 				4A6D0C3F149B3D9E00DB3EAA /* TrickyTests.cpp in Sources */, | ||||
| 				4AEE032016142F910071E950 /* catch_common.cpp in Sources */, | ||||
| 				4AEE032316142FC70071E950 /* catch_debugger.cpp in Sources */, | ||||
| 				2656C2251925EC870040DB02 /* catch_tags.cpp in Sources */, | ||||
| 				4AEE032516142FF10071E950 /* catch_stream.cpp in Sources */, | ||||
| 				4AEE0328161434FD0071E950 /* catch_xmlwriter.cpp in Sources */, | ||||
| 				4A45DA2416161EF9004F8D6B /* catch_console_colour.cpp in Sources */, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Nash
					Phil Nash