diff options
-rw-r--r-- | src/core/common/Utils.cpp | 8 | ||||
-rw-r--r-- | src/core/common/Utils.hpp | 3 | ||||
-rw-r--r-- | test/core/common/UtilsTest.cpp | 2 | ||||
-rw-r--r-- | test/core/parser/stack/StackTest.cpp | 10 |
4 files changed, 17 insertions, 6 deletions
diff --git a/src/core/common/Utils.cpp b/src/core/common/Utils.cpp index 67920c2..f665db5 100644 --- a/src/core/common/Utils.cpp +++ b/src/core/common/Utils.cpp @@ -47,16 +47,18 @@ bool Utils::isIdentifierOrEmpty(const std::string &name) bool Utils::isNamespacedIdentifier(const std::string &name) { bool first = true; - for (char c : name) { + for (size_t i = 0; i < name.size(); i++) { + const char c = name[i]; if (first && !isIdentifierStartCharacter(c)) { return false; } - if (!first && (!isIdentifierCharacter(c) && c != ':')) { + if (!first && (!(isIdentifierCharacter(c) || c == ':') || + (c == ':' && !isIdentifierEndCharacter(name[i - 1])))) { return false; } first = (c == ':'); } - return !first; + return !first && isIdentifierEndCharacter(name.back()); } bool Utils::hasNonWhitepaceChar(const std::string &s) diff --git a/src/core/common/Utils.hpp b/src/core/common/Utils.hpp index c3b49a0..16bc5a1 100644 --- a/src/core/common/Utils.hpp +++ b/src/core/common/Utils.hpp @@ -101,7 +101,8 @@ public: /** * Returns true if the given string is in * \code{.txt} - * ([A-Za-z][A-Za-z0-9_-]*)(:[A-Za-z][A-Za-z0-9_-]*)* + * ([A-Za-z]([A-Za-z0-9_-][A-Za-z0-9])?) + * (:[A-Za-z]([A-Za-z0-9_-][A-Za-z0-9])?)* * \endCode * * @param name is the string that should be tested. diff --git a/test/core/common/UtilsTest.cpp b/test/core/common/UtilsTest.cpp index f1a9af3..1f42f60 100644 --- a/test/core/common/UtilsTest.cpp +++ b/test/core/common/UtilsTest.cpp @@ -51,7 +51,9 @@ TEST(Utils, isNamespacedIdentifier) EXPECT_TRUE(Utils::isNamespacedIdentifier("t0-_est:b")); EXPECT_TRUE(Utils::isNamespacedIdentifier("test:test")); EXPECT_TRUE(Utils::isNamespacedIdentifier("t0-_est:t0-_est")); + EXPECT_FALSE(Utils::isNamespacedIdentifier("test_")); EXPECT_FALSE(Utils::isNamespacedIdentifier("test:_A")); + EXPECT_FALSE(Utils::isNamespacedIdentifier("test_:A")); EXPECT_FALSE(Utils::isNamespacedIdentifier("test::a")); EXPECT_FALSE(Utils::isNamespacedIdentifier(":test")); EXPECT_FALSE(Utils::isNamespacedIdentifier("t0-_est:_t0-_EST")); diff --git a/test/core/parser/stack/StackTest.cpp b/test/core/parser/stack/StackTest.cpp index ff13713..194746e 100644 --- a/test/core/parser/stack/StackTest.cpp +++ b/test/core/parser/stack/StackTest.cpp @@ -408,13 +408,13 @@ TEST(Stack, invalidCommandName) s.fieldEnd(); tracker.expect(1, 0, 1, 1, 0); // scc, ec, fsc, fec, dc, sac, stc, etc - s.commandStart("a_", {}); + s.commandStart("b", {}); tracker.expect(2, 1, 1, 1, 0); // scc, ec, fsc, fec, dc, sac, stc, etc s.fieldStart(true); s.fieldEnd(); tracker.expect(2, 1, 2, 2, 0); // scc, ec, fsc, fec, dc, sac, stc, etc - s.commandStart("a_:b", {}); + s.commandStart("a:b", {}); tracker.expect(3, 2, 2, 2, 0); // scc, ec, fsc, fec, dc, sac, stc, etc s.fieldStart(true); s.fieldEnd(); @@ -423,6 +423,12 @@ TEST(Stack, invalidCommandName) ASSERT_THROW(s.commandStart("_a", {}), LoggableException); tracker.expect(3, 3, 3, 3, 0); // scc, ec, fsc, fec, dc, sac, stc, etc + ASSERT_THROW(s.commandStart("a_", {}), LoggableException); + tracker.expect(3, 3, 3, 3, 0); // scc, ec, fsc, fec, dc, sac, stc, etc + + ASSERT_THROW(s.commandStart("a_:b", {}), LoggableException); + tracker.expect(3, 3, 3, 3, 0); // scc, ec, fsc, fec, dc, sac, stc, etc + ASSERT_THROW(s.commandStart("a:", {}), LoggableException); tracker.expect(3, 3, 3, 3, 0); // scc, ec, fsc, fec, dc, sac, stc, etc |