From 789444c7e9641a9cec1fd2e17094d955677caeac Mon Sep 17 00:00:00 2001 From: vng Date: Thu, 9 Jul 2015 16:22:07 +0300 Subject: [PATCH] [generator] Do not store multiple names for one language code. --- .../multilang_utf8_string_test.cpp | 26 ++++++++++++++++++ coding/multilang_utf8_string.cpp | 17 ++++++++++++ generator/generator_tests/osm_type_test.cpp | 27 +++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/coding/coding_tests/multilang_utf8_string_test.cpp b/coding/coding_tests/multilang_utf8_string_test.cpp index de8942fb15..6934a6660e 100644 --- a/coding/coding_tests/multilang_utf8_string_test.cpp +++ b/coding/coding_tests/multilang_utf8_string_test.cpp @@ -77,3 +77,29 @@ UNIT_TEST(MultilangString_ForEach) LangChecker doClass; s.ForEachRef(doClass); } + +UNIT_TEST(MultilangString_Unique) +{ + StringUtf8Multilang s; + string cmp; + + s.AddString(0, "xxx"); + TEST(s.GetString(0, cmp), ()); + TEST_EQUAL(cmp, "xxx", ()); + + s.AddString(1, "yyy"); + TEST(s.GetString(1, cmp), ()); + TEST_EQUAL(cmp, "yyy", ()); + + s.AddString(0, "xxxxxx"); + TEST(s.GetString(0, cmp), ()); + TEST_EQUAL(cmp, "xxxxxx", ()); + TEST(s.GetString(1, cmp), ()); + TEST_EQUAL(cmp, "yyy", ()); + + s.AddString(0, "x"); + TEST(s.GetString(0, cmp), ()); + TEST_EQUAL(cmp, "x", ()); + TEST(s.GetString(1, cmp), ()); + TEST_EQUAL(cmp, "yyy", ()); +} diff --git a/coding/multilang_utf8_string.cpp b/coding/multilang_utf8_string.cpp index 4a766cf35f..7ce1325830 100644 --- a/coding/multilang_utf8_string.cpp +++ b/coding/multilang_utf8_string.cpp @@ -56,6 +56,23 @@ size_t StringUtf8Multilang::GetNextIndex(size_t i) const void StringUtf8Multilang::AddString(int8_t lang, string const & utf8s) { + size_t i = 0; + size_t const sz = m_s.size(); + + while (i < sz) + { + size_t const next = GetNextIndex(i); + + if ((m_s[i] & 0x3F) == lang) + { + ++i; + m_s.replace(i, next - i, utf8s); + return; + } + + i = next; + } + m_s.push_back(lang | 0x80); m_s.insert(m_s.end(), utf8s.begin(), utf8s.end()); } diff --git a/generator/generator_tests/osm_type_test.cpp b/generator/generator_tests/osm_type_test.cpp index 942ff81e03..c8f09d732e 100644 --- a/generator/generator_tests/osm_type_test.cpp +++ b/generator/generator_tests/osm_type_test.cpp @@ -617,3 +617,30 @@ UNIT_TEST(OsmType_Boundary) TEST(params.IsTypeExist(GetType({"boundary", "administrative", "2"})), ()); TEST(params.IsTypeExist(GetType({"boundary", "administrative", "6"})), ()); } + +UNIT_TEST(OsmType_Dibrugarh) +{ + char const * arr[][2] = { + { "AND_a_c", "10001373" }, + { "addr:city", "Dibrugarh" }, + { "addr:housenumber", "hotel vishal" }, + { "addr:postcode", "786001" }, + { "addr:street", "Marwari Patty,Puja Ghat" }, + { "name", "Dibrugarh" }, + { "phone", "03732320016" }, + { "place", "city" }, + { "website", "http://www.hotelvishal.in" }, + }; + + XMLElement e; + FillXmlElement(arr, ARRAY_SIZE(arr), &e); + + FeatureParams params; + ftype::GetNameAndType(&e, params); + + TEST_EQUAL(params.m_Types.size(), 1, (params)); + TEST(params.IsTypeExist(GetType({"place", "city"})), (params)); + string name; + TEST(params.name.GetString(StringUtf8Multilang::DEFAULT_CODE, name), (params)); + TEST_EQUAL(name, "Dibrugarh", (params)); +}