diff --git a/include/internal/catch_test_spec_parser.cpp b/include/internal/catch_test_spec_parser.cpp index 5cbbdeb7..718185fa 100644 --- a/include/internal/catch_test_spec_parser.cpp +++ b/include/internal/catch_test_spec_parser.cpp @@ -7,6 +7,7 @@ #include "catch_test_spec_parser.h" + namespace Catch { TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} @@ -18,6 +19,7 @@ namespace Catch { m_escapeChars.clear(); m_substring.reserve(m_arg.size()); m_patternName.reserve(m_arg.size()); + m_realPatternPos = 0; for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) visitChar( m_arg[m_pos] ); endMode(); @@ -32,6 +34,7 @@ namespace Catch { escape(); m_substring += c; m_patternName += c; + m_realPatternPos++; return; }else if((m_mode != EscapedName) && (c == ',') ) { endMode(); @@ -49,7 +52,10 @@ namespace Catch { break; case EscapedName: endMode(); - break; + m_substring += c; + m_patternName += c; + m_realPatternPos++; + return; default: case Tag: case QuotedName: @@ -59,8 +65,10 @@ namespace Catch { } m_substring += c; - if( !isControlChar( c ) ) + if( !isControlChar( c ) ) { m_patternName += c; + m_realPatternPos++; + } } // Two of the processing methods return true to signal the caller to return // without adding the given character to the current pattern strings @@ -119,7 +127,7 @@ namespace Catch { void TestSpecParser::escape() { saveLastMode(); m_mode = EscapedName; - m_escapeChars.push_back( m_pos ); + m_escapeChars.push_back(m_realPatternPos); } bool TestSpecParser::isControlChar( char c ) const { switch( m_mode ) { diff --git a/include/internal/catch_test_spec_parser.h b/include/internal/catch_test_spec_parser.h index 778da134..c80787c8 100644 --- a/include/internal/catch_test_spec_parser.h +++ b/include/internal/catch_test_spec_parser.h @@ -25,6 +25,7 @@ namespace Catch { 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; diff --git a/projects/CMakeLists.txt b/projects/CMakeLists.txt index b2c67a64..8d0f94d4 100644 --- a/projects/CMakeLists.txt +++ b/projects/CMakeLists.txt @@ -433,6 +433,12 @@ set_tests_properties(FilenameAsTagsTest PROPERTIES PASS_REGULAR_EXPRESSION "\\[# add_test(NAME EscapeSpecialCharactersInTestNames COMMAND $ "Test with special\\, characters \"in name") set_tests_properties(EscapeSpecialCharactersInTestNames PROPERTIES PASS_REGULAR_EXPRESSION "1 assertion in 1 test case") +add_test(NAME SpecialCharactersInTestNamesFromFile COMMAND $ "-f ${CATCH_DIR}/projects/SelfTest/Misc/special-characters-in-file.input") +set_tests_properties(SpecialCharactersInTestNamesFromFile PROPERTIES PASS_REGULAR_EXPRESSION "1 assertion in 1 test case") + +add_test(NAME RunningTestsFromFile COMMAND $ "-f ${CATCH_DIR}/projects/SelfTest/Misc/plain-old-tests.input") +set_tests_properties(RunningTestsFromFile PROPERTIES PASS_REGULAR_EXPRESSION "6 assertions in 2 test cases") + if (CATCH_USE_VALGRIND) add_test(NAME ValgrindRunTests COMMAND valgrind --leak-check=full --error-exitcode=1 $) diff --git a/projects/SelfTest/Misc/plain-old-tests.input b/projects/SelfTest/Misc/plain-old-tests.input new file mode 100644 index 00000000..ae6d9f1b --- /dev/null +++ b/projects/SelfTest/Misc/plain-old-tests.input @@ -0,0 +1,2 @@ +random SECTION tests +nested SECTION tests diff --git a/projects/SelfTest/Misc/special-characters-in-file.input b/projects/SelfTest/Misc/special-characters-in-file.input new file mode 100644 index 00000000..b68a6bfd --- /dev/null +++ b/projects/SelfTest/Misc/special-characters-in-file.input @@ -0,0 +1 @@ +Test with special\, characters \"in name