| /* |
| * 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 |