summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/common/Utils.cpp13
-rw-r--r--src/core/common/Utils.hpp5
-rw-r--r--src/core/model/Node.cpp2
-rw-r--r--test/core/common/UtilsTest.cpp39
4 files changed, 48 insertions, 11 deletions
diff --git a/src/core/common/Utils.cpp b/src/core/common/Utils.cpp
index fc8ee00..f8b53c6 100644
--- a/src/core/common/Utils.cpp
+++ b/src/core/common/Utils.cpp
@@ -37,22 +37,27 @@ bool Utils::isIdentifier(const std::string &name)
}
first = false;
}
- return true;
+ return !first;
}
-bool Utils::isNamespaceIdentifier(const std::string &name)
+bool Utils::isIdentifierOrEmpty(const std::string &name)
+{
+ return name.empty() || isIdentifier(name);
+}
+
+bool Utils::isNamespacedIdentifier(const std::string &name)
{
bool first = true;
for (char c : name) {
if (first && !isIdentifierStartCharacter(c)) {
return false;
}
- if (!first && (!isIdentifierCharacter(c) || c == ':')) {
+ if (!first && (!isIdentifierCharacter(c) && c != ':')) {
return false;
}
first = (c == ':');
}
- return true;
+ return !first;
}
bool Utils::hasNonWhitepaceChar(const std::string &s)
diff --git a/src/core/common/Utils.hpp b/src/core/common/Utils.hpp
index b5cd178..b5a54fc 100644
--- a/src/core/common/Utils.hpp
+++ b/src/core/common/Utils.hpp
@@ -86,6 +86,11 @@ public:
static bool isIdentifier(const std::string &name);
/**
+ * Returns true if the given string is an identifier or an empty string.
+ */
+ static bool isIdentifierOrEmpty(const std::string &name);
+
+ /**
* Returns true if the given string is in
* \code{.txt}
* ([A-Za-z][A-Za-z0-9_-]*)(:[A-Za-z][A-Za-z0-9_-]*)*
diff --git a/src/core/model/Node.cpp b/src/core/model/Node.cpp
index 39ee2e4..ce15cad 100644
--- a/src/core/model/Node.cpp
+++ b/src/core/model/Node.cpp
@@ -448,7 +448,7 @@ bool Node::doValidate(Logger &logger) const { return true; }
bool Node::validateName(Logger &logger) const
{
- if (!Utils::isIdentifier(name)) {
+ if (!Utils::isIdentifierOrEmpty(name)) {
logger.error(type()->name + std::string(" name \"") + name +
std::string("\" is not a valid identifier"),
this);
diff --git a/test/core/common/UtilsTest.cpp b/test/core/common/UtilsTest.cpp
index a4bf4b2..7801296 100644
--- a/test/core/common/UtilsTest.cpp
+++ b/test/core/common/UtilsTest.cpp
@@ -24,14 +24,40 @@ namespace ousia {
TEST(Utils, isIdentifier)
{
- ASSERT_TRUE(Utils::isIdentifier("test"));
- ASSERT_TRUE(Utils::isIdentifier("t0-_est"));
- ASSERT_FALSE(Utils::isIdentifier("_t0-_EST"));
- ASSERT_FALSE(Utils::isIdentifier("-t0-_EST"));
- ASSERT_FALSE(Utils::isIdentifier("0t-_EST"));
- ASSERT_FALSE(Utils::isIdentifier("invalid key"));
+ EXPECT_TRUE(Utils::isIdentifier("test"));
+ EXPECT_TRUE(Utils::isIdentifier("t0-_est"));
+ EXPECT_FALSE(Utils::isIdentifier("_t0-_EST"));
+ EXPECT_FALSE(Utils::isIdentifier("-t0-_EST"));
+ EXPECT_FALSE(Utils::isIdentifier("0t-_EST"));
+ EXPECT_FALSE(Utils::isIdentifier("_A"));
+ EXPECT_FALSE(Utils::isIdentifier("invalid key"));
+ EXPECT_FALSE(Utils::isIdentifier(""));
}
+
+TEST(Utils, isNamespacedIdentifier)
+{
+ EXPECT_TRUE(Utils::isNamespacedIdentifier("test"));
+ EXPECT_TRUE(Utils::isNamespacedIdentifier("t0-_est"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("_t0-_EST"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("-t0-_EST"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("0t-_EST"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("invalid key"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("_A"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier(""));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier(":"));
+ EXPECT_TRUE(Utils::isNamespacedIdentifier("test:a"));
+ 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:_A"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("test::a"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier(":test"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("t0-_est:_t0-_EST"));
+ EXPECT_FALSE(Utils::isNamespacedIdentifier("t0-_est: b"));
+}
+
+
TEST(Utils, split)
{
ASSERT_EQ(std::vector<std::string>({"ab"}), Utils::split("ab", '.'));
@@ -82,5 +108,6 @@ TEST(Utils, endsWith)
ASSERT_TRUE(Utils::endsWith("foobar", "bar"));
ASSERT_TRUE(Utils::endsWith("foo", ""));
}
+
}