/* * 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& 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 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 const& tags ) const { for( std::vector::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