diff --git a/hoot-core-test/src/test/cpp/hoot/core/visitors/ApiTagTruncateVisitorTest.cpp b/hoot-core-test/src/test/cpp/hoot/core/visitors/ApiTagTruncateVisitorTest.cpp
index 8913241..942dd9a 100644
--- a/hoot-core-test/src/test/cpp/hoot/core/visitors/ApiTagTruncateVisitorTest.cpp
+++ b/hoot-core-test/src/test/cpp/hoot/core/visitors/ApiTagTruncateVisitorTest.cpp
@@ -22,12 +22,12 @@
* This will properly maintain the copyright information. DigitalGlobe
* copyrights will be updated automatically.
*
- * @copyright Copyright (C) 2019 DigitalGlobe (http://www.digitalglobe.com/)
+ * @copyright Copyright (C) 2019, 2020 DigitalGlobe (http://www.digitalglobe.com/)
*/
#include <hoot/core/TestUtils.h>
#include <hoot/core/elements/OsmMap.h>
-#include <hoot/core/elements/OsmUtils.h>
+#include <hoot/core/util/DateTimeUtils.h>
#include <hoot/core/util/UuidHelper.h>
#include <hoot/core/visitors/ApiTagTruncateVisitor.h>
#include <hoot/core/visitors/ElementIdsVisitor.h>
@@ -42,6 +42,7 @@ class ApiTagTruncateVisitorTest : public HootTestFixture
CPPUNIT_TEST(runDatesTest);
CPPUNIT_TEST(runListTest);
CPPUNIT_TEST(runTruncateTest);
+ CPPUNIT_TEST(runArabicTest);
CPPUNIT_TEST_SUITE_END();
public:
@@ -57,32 +58,22 @@ public:
QString value = UuidHelper::createUuid().toString();
tags["uuid"] = value;
- tags["note"] = "node1";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
+ NodePtr n1 = TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
tags.appendValue("uuid", UuidHelper::createUuid().toString());
- tags["note"] = "node2";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
+ NodePtr n2 = TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
QStringList uuids;
for (int i = 0; i < 5; ++i)
uuids.append(UuidHelper::createUuid().toString());
tags.appendValue("uuid", uuids);
- tags["note"] = "node3";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 2.0, 15.0, tags);
+ NodePtr n3 = TestUtils::createNode(map, Status::Unknown1, 0.0, 2.0, 15.0, tags);
ApiTagTruncateVisitor v;
map->visitRw(v);
HOOT_STR_EQUALS("Truncated tag key/value pairs for 2 elements", v.getCompletedStatusMessage());
- NodePtr n1 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node1")[0]);
- NodePtr n2 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node2")[0]);
- NodePtr n3 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node3")[0]);
-
CPPUNIT_ASSERT_EQUAL(38, n1->getTags()["uuid"].length());
CPPUNIT_ASSERT_EQUAL(38, n2->getTags()["uuid"].length());
CPPUNIT_ASSERT_EQUAL(38, n3->getTags()["uuid"].length());
@@ -92,108 +83,116 @@ public:
{
OsmMapPtr map(new OsmMap());
Tags tags;
- QString value = OsmUtils::toTimeString(0);
+ QString value = DateTimeUtils::toTimeString(0);
+ int dateLength = value.length();
tags.insert(MetadataTags::SourceDateTime(), value);
tags[MetadataTags::SourceDateTime()] = value;
- tags["note"] = "node1";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
+ NodePtr n1 = TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
- tags.appendValue(MetadataTags::SourceDateTime(), OsmUtils::toTimeString(0));
- tags["note"] = "node2";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
+ tags.appendValue(MetadataTags::SourceDateTime(), DateTimeUtils::toTimeString(0));
+ NodePtr n2 = TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
QStringList dates;
for (int i = 0; i < 30; ++i)
- dates.append(OsmUtils::toTimeString(0));
+ dates.append(DateTimeUtils::toTimeString(0));
tags.appendValue(MetadataTags::SourceIngestDateTime(), dates);
- tags["note"] = "node3";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 2.0, 15.0, tags);
+ NodePtr n3 = TestUtils::createNode(map, Status::Unknown1, 0.0, 2.0, 15.0, tags);
ApiTagTruncateVisitor v;
map->visitRw(v);
HOOT_STR_EQUALS("Truncated tag key/value pairs for 2 elements", v.getCompletedStatusMessage());
- NodePtr n1 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node1")[0]);
- NodePtr n2 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node2")[0]);
- NodePtr n3 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node3")[0]);
-
- CPPUNIT_ASSERT_EQUAL(20, n1->getTags()[MetadataTags::SourceDateTime()].length());
- CPPUNIT_ASSERT_EQUAL(20, n2->getTags()[MetadataTags::SourceDateTime()].length());
- CPPUNIT_ASSERT_EQUAL(20, n3->getTags()[MetadataTags::SourceIngestDateTime()].length());
+ CPPUNIT_ASSERT_EQUAL(dateLength, n1->getTags()[MetadataTags::SourceDateTime()].length());
+ CPPUNIT_ASSERT_EQUAL(dateLength, n2->getTags()[MetadataTags::SourceDateTime()].length());
+ CPPUNIT_ASSERT_EQUAL(dateLength, n3->getTags()[MetadataTags::SourceIngestDateTime()].length());
}
void runListTest()
{
+ int max = ConfigOptions().getMaxTagLength();
OsmMapPtr map(new OsmMap());
Tags tags;
QString value = "Some random text goes here that is going into a list.";
+ int length = value.length();
tags["some_key"] = value;
- tags["note"] = "node1";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
+ NodePtr n1 = TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
tags.appendValue("some_key", value);
- tags["note"] = "node2";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
+ NodePtr n2 = TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
- QStringList dates;
- for (int i = 0; i < 5; ++i)
- dates.append(value);
- tags.appendValue("some_key", dates);
- tags["note"] = "node3";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 2.0, 15.0, tags);
+ QStringList values;
+ int iterations = (max - 1) / (length + 1);
+ for (int i = 0; i <= iterations; ++i)
+ values.append(value);
+ tags.appendValue("some_key", values);
+ NodePtr n3 = TestUtils::createNode(map, Status::Unknown1, 0.0, 2.0, 15.0, tags);
ApiTagTruncateVisitor v;
map->visitRw(v);
HOOT_STR_EQUALS("Truncated tag key/value pairs for 1 elements", v.getCompletedStatusMessage());
- NodePtr n1 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node1")[0]);
- NodePtr n2 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node2")[0]);
- NodePtr n3 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node3")[0]);
-
- // value.length() == 53
- CPPUNIT_ASSERT_EQUAL(53, n1->getTags()["some_key"].length());
- CPPUNIT_ASSERT_EQUAL(107, n2->getTags()["some_key"].length());
- CPPUNIT_ASSERT_EQUAL(215, n3->getTags()["some_key"].length());
+ CPPUNIT_ASSERT_EQUAL(length, n1->getTags()["some_key"].length());
+ CPPUNIT_ASSERT_EQUAL(length * 2 + 1, n2->getTags()["some_key"].length());
+ CPPUNIT_ASSERT_EQUAL((length * iterations) + (iterations - 1), n3->getTags()["some_key"].length());
}
void runTruncateTest()
{
+ int max = ConfigOptions().getMaxTagLength();
OsmMapPtr map(new OsmMap());
Tags tags;
- QString value(250, 'B');
+
+ int length = max - 5;
+ QString value(length, 'B');
tags["some_key"] = value;
- tags["note"] = "node1";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
+ NodePtr n1 = TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
- QString valueTooLong(400, 'C');
+ int tooLong = max * 2;
+ QString valueTooLong(tooLong, 'C');
tags["some_key"] = valueTooLong;
- tags["note"] = "node2";
- TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
+ NodePtr n2 = TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
ApiTagTruncateVisitor v;
map->visitRw(v);
HOOT_STR_EQUALS("Truncated tag key/value pairs for 1 elements", v.getCompletedStatusMessage());
- NodePtr n1 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node1")[0]);
- NodePtr n2 =
- map->getNode(ElementIdsVisitor::findElementsByTag(map, ElementType::Node, "note", "node2")[0]);
+ CPPUNIT_ASSERT_EQUAL(length, n1->getTags()["some_key"].length());
+ CPPUNIT_ASSERT_EQUAL(max, n2->getTags()["some_key"].length());
+ }
- CPPUNIT_ASSERT_EQUAL(250, n1->getTags()["some_key"].length());
- CPPUNIT_ASSERT_EQUAL(255, n2->getTags()["some_key"].length());
+ void runArabicTest()
+ {
+ OsmMapPtr map(new OsmMap());
+ Tags tags;
+
+ tags["name"] = ""This & that" or other stuff.";
+ NodePtr n1 = TestUtils::createNode(map, Status::Unknown1, 0.0, 0.0, 15.0, tags);
+
+ tags["name"] = "ﻉیﻡﺍﺮﺗ ﺏﺎﻏی ﻥیﻥ یﺉﺭی - ﻢﺤﻟ ﻖﺒﻟی ﻊﻣﺍﺮﺗ ﺏﺎﻏ";
+ NodePtr n2 = TestUtils::createNode(map, Status::Unknown1, 0.0, 1.0, 15.0, tags);
+
+ // Length of the following text is 266 and should be truncated
+ tags["name"] = "ﻊﻣﺍﺮﺗ ﺏﺎﻏ "ﺹﺎﺤﺑ ﺩیﻭﺎﻧ ﻢﺤﻣﺩ ﻊﻟی ﻡیﺭﺯﺍ" ﺩﺭ ﺖﺑﺭیﺯ کﻩ ﺮﺿﺍ ﺵﺎﻫ ﺐﻫ ﺐﻫﺎﻨﻫ ﻕﺎﺟﺍﺭیﻩ ﺯﺩﺎﺋی ﺂﻧ ﺭﺍ ﺖﺧﺭیﺏ کﺭﺩ ﻭ ﻎﻣ ﺎﻧگیﺰﺗﺭ ﺂﻧ کﻩ ﺰﻧﺩﺎﻧ کﻥﻮﻧی ﺖﺑﺭیﺯ ﺭﻭی ﻭیﺭﺎﻨﻫ ﻪﻣیﻥ ﺱﺎﺨﺘﻣﺎﻧ ﺐﻧﺍ ﺵﺪﻫ ﺎﺴﺗ Təbrizin tarixi Sahib Divan sarayi ki Qacarların izlərini itirmək amacilə sökülmüşdür";
+ NodePtr n3 = TestUtils::createNode(map, Status::Unknown1, 1.0, 1.0, 15.0, tags);
+
+ ApiTagTruncateVisitor v;
+ Settings s;
+ s.set(ConfigOptions().getMaxTagLengthKey(), 255);
+ v.setConfiguration(s);
+ map->visitRw(v);
+
+ HOOT_STR_EQUALS(""This & that" or other stuff.", n1->getTags()["name"]);
+ HOOT_STR_EQUALS("ﻉیﻡﺍﺮﺗ ﺏﺎﻏی ﻥیﻥ یﺉﺭی - ﻢﺤﻟ ﻖﺒﻟی ﻊﻣﺍﺮﺗ ﺏﺎﻏ", n2->getTags()["name"]);
+ HOOT_STR_EQUALS("ﻊﻣﺍﺮﺗ ﺏﺎﻏ "ﺹﺎﺤﺑ ﺩیﻭﺎﻧ ﻢﺤﻣﺩ ﻊﻟی ﻡیﺭﺯﺍ" ﺩﺭ ﺖﺑﺭیﺯ کﻩ ﺮﺿﺍ ﺵﺎﻫ ﺐﻫ ﺐﻫﺎﻨﻫ ﻕﺎﺟﺍﺭیﻩ ﺯﺩﺎﺋی ﺂﻧ ﺭﺍ ﺖﺧﺭیﺏ کﺭﺩ ﻭ ﻎﻣ ﺎﻧگیﺰﺗﺭ ﺂﻧ کﻩ ﺰﻧﺩﺎﻧ کﻥﻮﻧی ﺖﺑﺭیﺯ ﺭﻭی ﻭیﺭﺎﻨﻫ ﻪﻣیﻥ ﺱﺎﺨﺘﻣﺎﻧ ﺐﻧﺍ ﺵﺪﻫ ﺎﺴﺗ Təbrizin tarixi Sahib Divan sarayi ki Qacarların izlərini itirmək amacilə s",
+ n3->getTags()["name"]);
}
+
};
//CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(ApiTagTruncateVisitorTest, "current");