Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Zolotarev <alex@maps.me>2015-11-27 10:16:26 +0300
committerAlex Zolotarev <alex@maps.me>2015-11-28 15:00:13 +0300
commitb4b10b3e7d2bd804ad43b63268f5df62fa413c1c (patch)
treef3e8112d7c1ef60305e3ce059af8188ce1cfd60c /indexer
parentafae5a24f866080b196f53c0d8641fbfde8e023e (diff)
Fixed Metadata interface and implementation, added missing unit tests.
Diffstat (limited to 'indexer')
-rw-r--r--indexer/feature.cpp2
-rw-r--r--indexer/feature_meta.hpp31
-rw-r--r--indexer/indexer_tests/feature_metadata_test.cpp36
3 files changed, 57 insertions, 12 deletions
diff --git a/indexer/feature.cpp b/indexer/feature.cpp
index d46961bdf0..434d6e0611 100644
--- a/indexer/feature.cpp
+++ b/indexer/feature.cpp
@@ -144,7 +144,7 @@ void FeatureType::ParseMetadata() const
m_pLoader->ParseMetadata();
if (HasInternet())
- m_metadata.Add(Metadata::FMD_INTERNET, "wlan");
+ m_metadata.Set(Metadata::FMD_INTERNET, "wlan");
m_bMetadataParsed = true;
}
diff --git a/indexer/feature_meta.hpp b/indexer/feature_meta.hpp
index 363f899ded..3a082f32eb 100644
--- a/indexer/feature_meta.hpp
+++ b/indexer/feature_meta.hpp
@@ -42,14 +42,28 @@ namespace feature
static_assert(FMD_COUNT <= 255, "Meta types count is limited to one byte.");
- bool Add(EType type, string const & s)
+ /// Empty value drops (clears) corresponding type.
+ void Set(EType type, string const & value)
{
- string & val = m_metadata[type];
- if (val.empty())
- val = s;
+ auto found = m_metadata.find(type);
+ if (found == m_metadata.end())
+ {
+ if (!value.empty())
+ m_metadata[type] = value;
+ }
else
- val = val + ", " + s;
- return true;
+ {
+ if (value.empty())
+ m_metadata.erase(found);
+ else
+ found->second = value;
+ }
+ }
+
+ /// Synonym of Set(type, "").
+ void Drop(EType type)
+ {
+ Set(type, "");
}
string Get(EType type) const
@@ -69,11 +83,6 @@ namespace feature
return types;
}
- void Drop(EType type)
- {
- m_metadata.erase(type);
- }
-
inline bool Empty() const { return m_metadata.empty(); }
inline size_t Size() const { return m_metadata.size(); }
diff --git a/indexer/indexer_tests/feature_metadata_test.cpp b/indexer/indexer_tests/feature_metadata_test.cpp
index b61a17df5c..38647b56ce 100644
--- a/indexer/indexer_tests/feature_metadata_test.cpp
+++ b/indexer/indexer_tests/feature_metadata_test.cpp
@@ -9,6 +9,42 @@
using feature::Metadata;
+UNIT_TEST(Feature_Metadata_GetSet)
+{
+ Metadata m;
+ Metadata::EType const type = Metadata::FMD_ELE;
+ // Absent types should return empty values.
+ TEST_EQUAL(m.Get(type), "", ());
+ m.Set(type, "12345");
+ TEST_EQUAL(m.Get(type), "12345", ());
+ TEST_EQUAL(m.Size(), 1, ());
+ // Same types should replace old metadata values.
+ m.Set(type, "5678");
+ TEST_EQUAL(m.Get(type), "5678", ());
+ // Empty values should drop fields.
+ m.Set(type, "");
+ TEST_EQUAL(m.Get(type), "", ());
+ TEST_EQUAL(m.Size(), 0, ());
+ TEST(m.Empty(), ());
+}
+
+static map<Metadata::EType, string> const kPairs = { {Metadata::FMD_ELE, "12345"},
+ {Metadata::FMD_CUISINE, "greek;mediterranean"},
+ {Metadata::FMD_EMAIL, "cool@email.at"} };
+
+UNIT_TEST(Feature_Metadata_PresentTypes)
+{
+ Metadata m;
+ for (auto const & value : kPairs)
+ m.Set(value.first, value.second);
+ TEST_EQUAL(m.Size(), kPairs.size(), ());
+
+ auto const types = m.GetPresentTypes();
+ TEST_EQUAL(types.size(), m.Size(), ());
+ for (auto const & type : types)
+ TEST_EQUAL(m.Get(type), kPairs.find(type)->second, ());
+}
+
UNIT_TEST(Feature_Serialization)
{
Metadata original;