diff --git a/3party/jansson/myjansson.hpp b/3party/jansson/myjansson.hpp index 634996c365..f2d57085d9 100644 --- a/3party/jansson/myjansson.hpp +++ b/3party/jansson/myjansson.hpp @@ -5,7 +5,7 @@ #include "base/exception.hpp" #include "base/string_utils.hpp" -#include +#include "3party/jansson/src/jansson.h" #include "std/vector.hpp" diff --git a/indexer/indexer_tests/osm_editor_test.cpp b/indexer/indexer_tests/osm_editor_test.cpp index 9f505f9f37..c19032ccb2 100644 --- a/indexer/indexer_tests/osm_editor_test.cpp +++ b/indexer/indexer_tests/osm_editor_test.cpp @@ -70,16 +70,25 @@ void FillEditableMapObject(osm::Editor const & editor, FeatureType const & ft, o emo.SetEditableProperties(editor.GetEditableProperties(ft)); } -void EditFeature(FeatureType const & ft) +template +void EditFeature(FeatureType const & ft, TFn && fn) { auto & editor = osm::Editor::Instance(); osm::EditableMapObject emo; FillEditableMapObject(editor, ft, emo); - emo.SetBuildingLevels("1"); + fn(emo); TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::SavedSuccessfully, ()); } +void SetBuildingLevelsToOne(FeatureType const & ft) +{ + EditFeature(ft, [](osm::EditableMapObject & emo) + { + emo.SetBuildingLevels("1"); // change something + }); +} + void CreateCafeAtPoint(m2::PointD const & point, MwmSet::MwmId const & mwmId, osm::EditableMapObject &emo) { auto & editor = osm::Editor::Instance(); @@ -88,6 +97,45 @@ void CreateCafeAtPoint(m2::PointD const & point, MwmSet::MwmId const & mwmId, os emo.SetHouseNumber("12"); TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::SavedSuccessfully, ()); } + +void GenerateUploadedFeature(MwmSet::MwmId const & mwmId, + osm::EditableMapObject const & emo, + pugi::xml_document & out) +{ + auto & editor = osm::Editor::Instance(); + + pugi::xml_node root = out.append_child("mapsme"); + root.append_attribute("format_version") = 1; + + pugi::xml_node mwmNode = root.append_child("mwm"); + mwmNode.append_attribute("name") = mwmId.GetInfo()->GetCountryName().c_str(); + mwmNode.append_attribute("version") = static_cast(mwmId.GetInfo()->GetVersion()); + pugi::xml_node created = mwmNode.append_child("create"); + + FeatureType ft; + editor.GetEditedFeature(emo.GetID().m_mwmId, emo.GetID().m_index, ft); + + editor::XMLFeature xf = ft.ToXML(true); + xf.SetMWMFeatureIndex(ft.GetID().m_index); + xf.SetModificationTime(time(nullptr)); + xf.SetUploadTime(time(nullptr)); + xf.SetUploadStatus("Uploaded"); + xf.AttachToParentNode(created); +} + +template +uint32_t CountFeaturesInRect(MwmSet::MwmId const & mwmId, m2::RectD const & rect) +{ + auto & editor = osm::Editor::Instance(); + uint32_t unused = 0; + uint32_t counter = 0; + editor.ForEachFeatureInMwmRectAndScale(mwmId, [&counter](T const & ft) + { + ++counter; + }, rect, unused); + + return counter; +} } // namespace namespace editor @@ -131,13 +179,12 @@ void EditorTest::GetFeatureTypeInfoTest() TestCafe cafe(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor, &mwmId](FeatureType & ft) { TEST(!editor.GetFeatureTypeInfo(ft.GetID().m_mwmId, ft.GetID().m_index), ()); - EditFeature(ft); + SetBuildingLevelsToOne(ft); auto const fti = editor.GetFeatureTypeInfo(ft.GetID().m_mwmId, ft.GetID().m_index); TEST_NOT_EQUAL(fti, 0, ()); @@ -160,14 +207,13 @@ void EditorTest::GetEditedFeatureTest() TestCafe cafe(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { FeatureType featureType; TEST(!editor.GetEditedFeature(ft.GetID(), featureType), ()); - EditFeature(ft); + SetBuildingLevelsToOne(ft); TEST(editor.GetEditedFeature(ft.GetID(), featureType), ()); @@ -180,6 +226,86 @@ void EditorTest::GetEditedFeatureTest() }); } +void EditorTest::SetIndexTest() +{ + // osm::Editor::SetIndex was called in constructor. + auto & editor = osm::Editor::Instance(); + + auto const gbMwmId = BuildMwm("GB", [](TestMwmBuilder & builder) + { + TestCafe cafe({1.0, 1.0}, "London Cafe", "en"); + TestStreet street({{0.0, 0.0}, {1.0, 1.0}, {2.0, 2.0}}, "Test street", "en"); + cafe.SetStreet(street); + builder.Add(street); + builder.Add(cafe); + builder.Add(TestCafe({3.0, 3.0}, "London Cafe", "en")); + builder.Add(TestCafe({4.0, 4.0}, "London Cafe", "en")); + builder.Add(TestCafe({4.0, 4.0}, "London Cafe", "en")); + builder.Add(TestCafe({4.0, 4.0}, "London Cafe", "en")); + }); + + auto const mwmId = editor.m_mwmIdByMapNameFn("GB"); + + TEST_EQUAL(gbMwmId, mwmId, ()); + + osm::EditableMapObject emo; + CreateCafeAtPoint({2.0, 2.0}, gbMwmId, emo); + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) + { + auto const firstPtr = editor.m_getOriginalFeatureFn(ft.GetID()); + TEST(firstPtr, ()); + SetBuildingLevelsToOne(ft); + auto const secondPtr = editor.m_getOriginalFeatureFn(ft.GetID()); + TEST(secondPtr, ()); + TEST_EQUAL(firstPtr->GetID(), secondPtr->GetID(), ()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) + { + TEST_EQUAL(editor.m_getOriginalFeatureStreetFn(ft), "Test street", ()); + + EditFeature(ft, [](osm::EditableMapObject & emo) + { + osm::LocalizedStreet ls{"Some street", ""}; + emo.SetStreet(ls); + }); + TEST_EQUAL(editor.m_getOriginalFeatureStreetFn(ft), "Test street", ()); + }); + + uint32_t counter = 0; + editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + { + ++counter; + }, {100.0, 100.0}); + + TEST_EQUAL(counter, 0, ()); + + counter = 0; + editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + { + ++counter; + }, {3.0, 3.0}); + + TEST_EQUAL(counter, 1, ()); + + counter = 0; + editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + { + ++counter; + }, {1.0, 1.0}); + + TEST_EQUAL(counter, 2, ()); + + counter = 0; + editor.m_forEachFeatureAtPointFn([&counter](FeatureType & ft) + { + ++counter; + }, {4.0, 4.0}); + + TEST_EQUAL(counter, 3, ()); +} + void EditorTest::GetEditedFeatureStreetTest() { auto & editor = osm::Editor::Instance(); @@ -195,18 +321,17 @@ void EditorTest::GetEditedFeatureStreetTest() TestCafe cafe(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { string street; TEST(!editor.GetEditedFeatureStreet(ft.GetID(), street), ()); - osm::EditableMapObject emo; - FillEditableMapObject(editor, ft, emo); osm::LocalizedStreet ls{"some street", ""}; - emo.SetStreet(ls); - TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::SavedSuccessfully, ()); + EditFeature(ft, [&ls](osm::EditableMapObject & emo) + { + emo.SetStreet(ls); + }); TEST(editor.GetEditedFeatureStreet(ft.GetID(), street), ()); TEST_EQUAL(street, ls.m_defaultName, ()); @@ -227,7 +352,6 @@ void EditorTest::OriginalFeatureHasDefaultNameTest() builder.Add(unnamedCafe); builder.Add(secondUnnamedCafe); }); - ASSERT(mwmId.IsAlive(), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { @@ -268,8 +392,6 @@ void EditorTest::GetFeatureStatusTest() builder.Add(unnamedCafe); }); - ASSERT(mwmId.IsAlive(), ()); - ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Untouched, ()); @@ -287,7 +409,7 @@ void EditorTest::GetFeatureStatusTest() ForEachCafeAtPoint(m_index, m2::PointD(2.0, 2.0), [&editor](FeatureType & ft) { TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Untouched, ()); - editor.DeleteFeature(ft); + editor.DeleteFeature(ft.GetID()); TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Deleted, ()); }); @@ -307,8 +429,6 @@ void EditorTest::IsFeatureUploadedTest() builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); - ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { TEST(!editor.IsFeatureUploaded(ft.GetID().m_mwmId, ft.GetID().m_index), ()); @@ -320,22 +440,7 @@ void EditorTest::IsFeatureUploadedTest() TEST(!editor.IsFeatureUploaded(emo.GetID().m_mwmId, emo.GetID().m_index), ()); pugi::xml_document doc; - pugi::xml_node root = doc.append_child("mapsme"); - root.append_attribute("format_version") = 1; - - pugi::xml_node mwmNode = root.append_child("mwm"); - mwmNode.append_attribute("name") = mwmId.GetInfo()->GetCountryName().c_str(); - mwmNode.append_attribute("version") = static_cast(mwmId.GetInfo()->GetVersion()); - pugi::xml_node created = mwmNode.append_child("create"); - - FeatureType ft; - editor.GetEditedFeature(emo.GetID().m_mwmId, emo.GetID().m_index, ft); - - editor::XMLFeature xf = ft.ToXML(true); - xf.SetMWMFeatureIndex(ft.GetID().m_index); - xf.SetModificationTime(time(nullptr)); - xf.SetUploadStatus("Uploaded"); - xf.AttachToParentNode(created); + GenerateUploadedFeature(mwmId, emo, doc); editor.m_storage->Save(doc); editor.LoadMapEdits(); @@ -352,20 +457,18 @@ void EditorTest::DeleteFeatureTest() builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); - osm::EditableMapObject emo; CreateCafeAtPoint({3.0, 3.0}, mwmId, emo); FeatureType ft; editor.GetEditedFeature(emo.GetID().m_mwmId, emo.GetID().m_index, ft); - editor.DeleteFeature(ft); + editor.DeleteFeature(ft.GetID()); TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Untouched, ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) { - editor.DeleteFeature(ft); + editor.DeleteFeature(ft.GetID()); TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Deleted, ()); }); } @@ -379,7 +482,6 @@ void EditorTest::ClearAllLocalEditsTest() TestCafe cafe(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); osm::EditableMapObject emo; CreateCafeAtPoint({3.0, 3.0}, mwmId, emo); @@ -410,8 +512,6 @@ void EditorTest::GetFeaturesByStatusTest() builder.Add(someCafe); }); - ASSERT(mwmId.IsAlive(), ()); - FeatureID modifiedId, deletedId, obsoleteId, createdId; ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor, &modifiedId](FeatureType & ft) @@ -426,7 +526,7 @@ void EditorTest::GetFeaturesByStatusTest() ForEachCafeAtPoint(m_index, m2::PointD(2.0, 2.0), [&editor, &deletedId](FeatureType & ft) { - editor.DeleteFeature(ft); + editor.DeleteFeature(ft.GetID()); deletedId = ft.GetID(); }); @@ -465,23 +565,21 @@ void EditorTest::OnMapDeregisteredTest() TestCafe cafeLondon(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafeLondon); }); - ASSERT(gbMwmId.IsAlive(), ()); auto const rfMwmId = BuildMwm("RF", [](TestMwmBuilder & builder) { TestCafe cafeMoscow(m2::PointD(2.0, 2.0), "Moscow Cafe", "en"); builder.Add(cafeMoscow); }); - ASSERT(rfMwmId.IsAlive(), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [](FeatureType & ft) { - EditFeature(ft); + SetBuildingLevelsToOne(ft); }); ForEachCafeAtPoint(m_index, m2::PointD(2.0, 2.0), [](FeatureType & ft) { - EditFeature(ft); + SetBuildingLevelsToOne(ft); }); TEST(!editor.m_features.empty(), ()); @@ -504,7 +602,6 @@ void EditorTest::RollBackChangesTest() TestCafe cafe(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); const string houseNumber = "4a"; @@ -542,13 +639,11 @@ void EditorTest::HaveMapEditsOrNotesToUploadTest() builder.Add(cafe); }); - ASSERT(mwmId.IsAlive(), ()); - TEST(!editor.HaveMapEditsOrNotesToUpload(), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [](FeatureType & ft) { - EditFeature(ft); + SetBuildingLevelsToOne(ft); }); TEST(editor.HaveMapEditsOrNotesToUpload(), ()); @@ -577,21 +672,19 @@ void EditorTest::HaveMapEditsToUploadTest() TestCafe cafeLondon(m2::PointD(1.0, 1.0), "London Cafe", "en"); builder.Add(cafeLondon); }); - ASSERT(gbMwmId.IsAlive(), ()); auto const rfMwmId = BuildMwm("RF", [](TestMwmBuilder & builder) { TestCafe cafeMoscow(m2::PointD(2.0, 2.0), "Moscow Cafe", "ru"); builder.Add(cafeMoscow); }); - ASSERT(rfMwmId.IsAlive(), ()); TEST(!editor.HaveMapEditsToUpload(gbMwmId), ()); TEST(!editor.HaveMapEditsToUpload(rfMwmId), ()); ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [](FeatureType & ft) { - EditFeature(ft); + SetBuildingLevelsToOne(ft); }); TEST(editor.HaveMapEditsToUpload(gbMwmId), ()); @@ -599,18 +692,355 @@ void EditorTest::HaveMapEditsToUploadTest() ForEachCafeAtPoint(m_index, m2::PointD(2.0, 2.0), [](FeatureType & ft) { - EditFeature(ft); + SetBuildingLevelsToOne(ft); }); TEST(editor.HaveMapEditsToUpload(gbMwmId), ()); TEST(editor.HaveMapEditsToUpload(rfMwmId), ()); } +void EditorTest::GetStatsTest() +{ + auto & editor = osm::Editor::Instance(); + + auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(2.0, 2.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(3.0, 3.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(4.0, 4.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(5.0, 5.0), "London Cafe", "en")); + }); + + auto stats = editor.GetStats(); + + TEST(stats.m_edits.empty(), ()); + TEST_EQUAL(stats.m_uploadedCount, 0, ()); + TEST_EQUAL(stats.m_lastUploadTimestamp, my::INVALID_TIME_STAMP, ()); + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [](FeatureType & ft) + { + SetBuildingLevelsToOne(ft); + }); + + stats = editor.GetStats(); + TEST_EQUAL(stats.m_edits.size(), 1, ()); + + ForEachCafeAtPoint(m_index, m2::PointD(4.0, 4.0), [](FeatureType & ft) + { + SetBuildingLevelsToOne(ft); + }); + + stats = editor.GetStats(); + TEST_EQUAL(stats.m_edits.size(), 2, ()); + + ForEachCafeAtPoint(m_index, m2::PointD(5.0, 5.0), [](FeatureType & ft) + { + SetBuildingLevelsToOne(ft); + }); + + stats = editor.GetStats(); + TEST_EQUAL(stats.m_edits.size(), 3, ()); + TEST_EQUAL(stats.m_uploadedCount, 0, ()); + TEST_EQUAL(stats.m_lastUploadTimestamp, my::INVALID_TIME_STAMP, ()); + + osm::EditableMapObject emo; + CreateCafeAtPoint({6.0, 6.0}, mwmId, emo); + pugi::xml_document doc; + GenerateUploadedFeature(mwmId, emo, doc); + editor.m_storage->Save(doc); + editor.LoadMapEdits(); + + stats = editor.GetStats(); + TEST_EQUAL(stats.m_edits.size(), 1, ()); + TEST_EQUAL(stats.m_uploadedCount, 1, ()); + TEST_NOT_EQUAL(stats.m_lastUploadTimestamp, my::INVALID_TIME_STAMP, ()); +} + +void EditorTest::IsCreatedFeatureTest() +{ + auto & editor = osm::Editor::Instance(); + + auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe", "en")); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) + { + TEST(!editor.IsCreatedFeature(ft.GetID()), ()); + SetBuildingLevelsToOne(ft); + TEST(!editor.IsCreatedFeature(ft.GetID()), ()); + }); + + osm::EditableMapObject emo; + TEST(!editor.IsCreatedFeature(emo.GetID()), ()); + CreateCafeAtPoint({2.0, 2.0}, mwmId, emo); + TEST(editor.IsCreatedFeature(emo.GetID()), ()); +} + +void EditorTest::ForEachFeatureInMwmRectAndScaleTest() +{ + auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe", "en")); + }); + + { + osm::EditableMapObject emo; + CreateCafeAtPoint({10.0, 10.0}, mwmId, emo); + } + { + osm::EditableMapObject emo; + CreateCafeAtPoint({20.0, 20.0}, mwmId, emo); + } + { + osm::EditableMapObject emo; + CreateCafeAtPoint({22.0, 22.0}, mwmId, emo); + } + + TEST_EQUAL(CountFeaturesInRect(mwmId, {0.0, 0.0, 2.0, 2.0}), 0, ()); + TEST_EQUAL(CountFeaturesInRect(mwmId, {9.0, 9.0, 21.0, 21.0}), 2, ()); + TEST_EQUAL(CountFeaturesInRect(mwmId, {9.0, 9.0, 23.0, 23.0}), 3, ()); + + TEST_EQUAL(CountFeaturesInRect(mwmId, {0.0, 0.0, 2.0, 2.0}), 0, ()); + TEST_EQUAL(CountFeaturesInRect(mwmId, {9.0, 9.0, 21.0, 21.0}), 2, ()); + TEST_EQUAL(CountFeaturesInRect(mwmId, {9.0, 9.0, 23.0, 23.0}), 3, ()); +} + +void EditorTest::CreateNoteTest() +{ + auto & editor = osm::Editor::Instance(); + + auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(2.0, 2.0), "Cafe", "en")); + }); + + auto const createAndCheckNote = [&editor](FeatureID const & fId, + ms::LatLon const & pos, + osm::Editor::NoteProblemType const noteType) + { + platform::tests_support::ScopedFile sf("test_notes.xml"); + editor.m_notes = Notes::MakeNotes(sf.GetFullPath(), true); + editor.CreateNote(pos, fId, noteType, "with comment"); + + auto notes = editor.m_notes->GetNotes(); + TEST_EQUAL(notes.size(), 1, ()); + TEST(notes.front().m_point.EqualDxDy(pos, 1e-10), ()); + TEST_NOT_EQUAL(notes.front().m_note.find("with comment"), string::npos, ()); + TEST_NOT_EQUAL(notes.front().m_note.find("OSM data version"), string::npos, ()); + }; + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor, &createAndCheckNote](FeatureType & ft) + { + createAndCheckNote(ft.GetID(), {1.0, 1.0}, osm::Editor::NoteProblemType::PlaceDoesNotExist); + + auto notes = editor.m_notes->GetNotes(); + TEST_NOT_EQUAL(notes.front().m_note.find(osm::Editor::kPlaceDoesNotExistMessage), string::npos, ()); + TEST_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Obsolete, ()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(2.0, 2.0), [&editor, &createAndCheckNote](FeatureType & ft) + { + createAndCheckNote(ft.GetID(), {2.0, 2.0}, osm::Editor::NoteProblemType::General); + + TEST_NOT_EQUAL(editor.GetFeatureStatus(ft.GetID()), osm::Editor::FeatureStatus::Obsolete, ()); + auto notes = editor.m_notes->GetNotes(); + TEST_EQUAL(notes.front().m_note.find(osm::Editor::kPlaceDoesNotExistMessage), string::npos, ()); + }); +} + +void EditorTest::LoadMapEditsTest() +{ + auto & editor = osm::Editor::Instance(); + + auto const gbMwmId = BuildMwm("GB", [](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(0.0, 0.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe", "en")); + }); + + auto const rfMwmId = BuildMwm("RF", [](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(2.0, 2.0), "Moscow Cafe1", "en")); + builder.Add(TestCafe(m2::PointD(7.0, 7.0), "Moscow Cafe2", "en")); + builder.Add(TestCafe(m2::PointD(4.0, 4.0), "Moscow Cafe3", "en")); + builder.Add(TestCafe(m2::PointD(6.0, 6.0), "Moscow Cafe4", "en")); + }); + + vector features; + + ForEachCafeAtPoint(m_index, m2::PointD(0.0, 0.0), [&features](FeatureType & ft) + { + SetBuildingLevelsToOne(ft); + features.emplace_back(ft.GetID()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor, &features](FeatureType & ft) + { + editor.DeleteFeature(ft.GetID()); + features.emplace_back(ft.GetID()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(2.0, 2.0), [&editor, &features](FeatureType & ft) + { + editor.MarkFeatureAsObsolete(ft.GetID()); + features.emplace_back(ft.GetID()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(7.0, 7.0), [&features](FeatureType & ft) + { + SetBuildingLevelsToOne(ft); + features.emplace_back(ft.GetID()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(4.0, 4.0), [&editor, &features](FeatureType & ft) + { + editor.DeleteFeature(ft.GetID()); + features.emplace_back(ft.GetID()); + }); + + ForEachCafeAtPoint(m_index, m2::PointD(6.0, 6.0), [&features](FeatureType & ft) + { + SetBuildingLevelsToOne(ft); + features.emplace_back(ft.GetID()); + }); + + osm::EditableMapObject emo; + CreateCafeAtPoint({5.0, 5.0}, rfMwmId, emo); + features.emplace_back(emo.GetID()); + + editor.Save(); + editor.LoadMapEdits(); + + auto const fillLoaded = [&editor](vector & loadedFeatures) + { + loadedFeatures.clear(); + for (auto const & mwm : editor.m_features) + { + for (auto const & index : mwm.second) + { + loadedFeatures.emplace_back(index.second.m_feature.GetID()); + } + } + }; + + vector loadedFeatures; + fillLoaded(loadedFeatures); + + sort(loadedFeatures.begin(), loadedFeatures.end()); + sort(features.begin(), features.end()); + TEST_EQUAL(features, loadedFeatures, ()); + + TEST(RemoveMwm(rfMwmId), ()); + + auto const newRfMwmId = BuildMwm("RF", [](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(2.0, 2.0), "Moscow Cafe1", "en")); + builder.Add(TestCafe(m2::PointD(7.0, 7.0), "Moscow Cafe2", "en")); + builder.Add(TestCafe(m2::PointD(4.0, 4.0), "Moscow Cafe3", "en")); + builder.Add(TestCafe(m2::PointD(6.0, 6.0), "Moscow Cafe4", "en")); + }, 1); + + editor.LoadMapEdits(); + fillLoaded(loadedFeatures); + + TEST_EQUAL(features.size(), loadedFeatures.size(), ()); + + m_index.DeregisterMap(m_mwmFiles.back().GetCountryFile()); + TEST(RemoveMwm(newRfMwmId), ()); + + TEST_EQUAL(editor.m_features.size(), 2, ()); + + editor.LoadMapEdits(); + fillLoaded(loadedFeatures); + + TEST_EQUAL(editor.m_features.size(), 1, ()); + TEST_EQUAL(loadedFeatures.size(), 2, ()); + + osm::EditableMapObject gbEmo; + CreateCafeAtPoint({3.0, 3.0}, gbMwmId, gbEmo); + + pugi::xml_document doc; + GenerateUploadedFeature(gbMwmId, gbEmo, doc); + editor.m_storage->Save(doc); + editor.LoadMapEdits(); + fillLoaded(loadedFeatures); + + TEST_EQUAL(editor.m_features.size(), 1, ()); + TEST_EQUAL(loadedFeatures.size(), 1, ()); + + m_index.DeregisterMap(m_mwmFiles.back().GetCountryFile()); + TEST(RemoveMwm(gbMwmId), ()); + + auto const newGbMwmId = BuildMwm("GB", [](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(0.0, 0.0), "London Cafe", "en")); + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe", "en")); + }, 1); + + newGbMwmId.GetInfo()->m_version.SetSecondsSinceEpoch(time(nullptr) + 1); + + editor.LoadMapEdits(); + TEST(editor.m_features.empty(), ()); +} + +void EditorTest::SaveEditedFeatureTest() +{ + auto & editor = osm::Editor::Instance(); + + auto const mwmId = ConstructTestMwm([](TestMwmBuilder & builder) + { + builder.Add(TestCafe(m2::PointD(1.0, 1.0), "London Cafe1", "en")); + }); + + osm::EditableMapObject emo; + + editor.CreatePoint(classif().GetTypeByPath({"amenity", "cafe"}), {4.0, 4.0}, mwmId, emo); + emo.SetHouseNumber("12"); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Untouched, ()); + TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::SavedSuccessfully, ()); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Created, ()); + TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::NothingWasChanged, ()); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Created, ()); + + ForEachCafeAtPoint(m_index, m2::PointD(1.0, 1.0), [&editor](FeatureType & ft) + { + osm::EditableMapObject emo; + FillEditableMapObject(editor, ft, emo); + TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::NothingWasChanged, ()); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Untouched, ()); + emo.SetHouseNumber("4a"); + TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::SavedSuccessfully, ()); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Modified, ()); + TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::NothingWasChanged, ()); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Modified, ()); + emo.SetHouseNumber(""); + TEST_EQUAL(editor.SaveEditedFeature(emo), osm::Editor::SaveResult::SavedSuccessfully, ()); + TEST_EQUAL(editor.GetFeatureStatus(emo.GetID()), osm::Editor::FeatureStatus::Untouched, ()); + }); +} + void EditorTest::Cleanup(platform::LocalCountryFile const & map) { platform::CountryIndexes::DeleteFromDisk(map); map.DeleteFromDisk(MapOptions::Map); } + +bool EditorTest::RemoveMwm(MwmSet::MwmId const & mwmId) +{ + auto const & file = mwmId.GetInfo()->GetLocalFile(); + auto const it = find(m_mwmFiles.begin(), m_mwmFiles.end(), file); + + if (it == m_mwmFiles.end()) + return false; + + Cleanup(*it); + m_mwmFiles.erase(it); + return true; +} } // namespace testing } // namespace editor @@ -628,6 +1058,11 @@ UNIT_CLASS_TEST(EditorTest, OriginalFeatureHasDefaultNameTest) EditorTest::OriginalFeatureHasDefaultNameTest(); } +UNIT_CLASS_TEST(EditorTest, SetIndexTest) +{ + EditorTest::SetIndexTest(); +} + UNIT_CLASS_TEST(EditorTest, GetFeatureStatusTest) { EditorTest::GetFeatureStatusTest(); @@ -682,4 +1117,34 @@ UNIT_CLASS_TEST(EditorTest, HaveMapEditsToUploadTest) { EditorTest::HaveMapEditsToUploadTest(); } + +UNIT_CLASS_TEST(EditorTest, GetStatsTest) +{ + EditorTest::GetStatsTest(); +} + +UNIT_CLASS_TEST(EditorTest, IsCreatedFeatureTest) +{ + EditorTest::IsCreatedFeatureTest(); +} + +UNIT_CLASS_TEST(EditorTest, ForEachFeatureInMwmRectAndScaleTest) +{ + EditorTest::ForEachFeatureInMwmRectAndScaleTest(); +} + +UNIT_CLASS_TEST(EditorTest, CreateNoteTest) +{ + EditorTest::CreateNoteTest(); +} + +UNIT_CLASS_TEST(EditorTest, LoadMapEditstest) +{ + EditorTest::LoadMapEditsTest(); +} + +UNIT_CLASS_TEST(EditorTest, SaveEditedFeatureTest) +{ + EditorTest::SaveEditedFeatureTest(); +} } // namespace diff --git a/indexer/indexer_tests/osm_editor_test.hpp b/indexer/indexer_tests/osm_editor_test.hpp index f03b8770bb..fe2b62e71d 100644 --- a/indexer/indexer_tests/osm_editor_test.hpp +++ b/indexer/indexer_tests/osm_editor_test.hpp @@ -23,6 +23,7 @@ public: void GetFeatureTypeInfoTest(); void GetEditedFeatureTest(); + void SetIndexTest(); void GetEditedFeatureStreetTest(); void OriginalFeatureHasDefaultNameTest(); void GetFeatureStatusTest(); @@ -34,6 +35,12 @@ public: void RollBackChangesTest(); void HaveMapEditsOrNotesToUploadTest(); void HaveMapEditsToUploadTest(); + void GetStatsTest(); + void IsCreatedFeatureTest(); + void ForEachFeatureInMwmRectAndScaleTest(); + void CreateNoteTest(); + void LoadMapEditsTest(); + void SaveEditedFeatureTest(); private: template @@ -43,9 +50,9 @@ private: } template - MwmSet::MwmId BuildMwm(string const & name, TBuildFn && fn) + MwmSet::MwmId BuildMwm(string const & name, TBuildFn && fn, int64_t version = 0) { - m_mwmFiles.emplace_back(GetPlatform().WritableDir(), platform::CountryFile(name), 0 /* version */); + m_mwmFiles.emplace_back(GetPlatform().WritableDir(), platform::CountryFile(name), version); auto & file = m_mwmFiles.back(); Cleanup(file); @@ -63,10 +70,13 @@ private: if (info) m_infoGetter.AddCountry(storage::CountryDef(name, info->m_limitRect)); + CHECK(id.IsAlive(), ()); + return id; } void Cleanup(platform::LocalCountryFile const & map); + bool RemoveMwm(MwmSet::MwmId const & mwmId); Index m_index; storage::CountryInfoGetterForTesting m_infoGetter; diff --git a/indexer/osm_editor.cpp b/indexer/osm_editor.cpp index 5fdde75491..30a324770a 100644 --- a/indexer/osm_editor.cpp +++ b/indexer/osm_editor.cpp @@ -415,9 +415,8 @@ bool Editor::IsFeatureUploaded(MwmSet::MwmId const & mwmId, uint32_t index) cons return info && info->m_uploadStatus == kUploaded; } -void Editor::DeleteFeature(FeatureType const & feature) +void Editor::DeleteFeature(FeatureID const & fid) { - FeatureID const & fid = feature.GetID(); auto const mwm = m_features.find(fid.m_mwmId); if (mwm != m_features.end()) { @@ -430,16 +429,10 @@ void Editor::DeleteFeature(FeatureType const & feature) } } - FeatureTypeInfo & fti = m_features[fid.m_mwmId][fid.m_index]; - fti.m_status = FeatureStatus::Deleted; - // TODO: What if local client time is absolutely wrong? - fti.m_modificationTimestamp = time(nullptr); - // TODO: We don't really need to serialize whole feature. Improve this code in the future. - fti.m_feature = feature; + MarkFeatureWithStatus(fid, FeatureStatus::Deleted); // TODO(AlexZ): Synchronize Save call/make it on a separate thread. Save(); - Invalidate(); } @@ -491,6 +484,7 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo) auto const featureStatus = GetFeatureStatus(fid.m_mwmId, fid.m_index); ASSERT_NOT_EQUAL(featureStatus, FeatureStatus::Obsolete, ("Obsolete feature cannot be modified.")); + ASSERT_NOT_EQUAL(featureStatus, FeatureStatus::Deleted, ("Unexpected feature status.")); bool const wasCreatedByUser = IsCreatedFeature(fid); if (wasCreatedByUser) @@ -510,8 +504,6 @@ Editor::SaveResult Editor::SaveEditedFeature(EditableMapObject const & emo) } else { - ASSERT_NOT_EQUAL(featureStatus, FeatureStatus::Deleted, ("Unexpected feature status.")); - auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); if (!originalFeaturePtr) { @@ -1037,20 +1029,7 @@ void Editor::MarkFeatureAsObsolete(FeatureID const & fid) return; } - auto & fti = m_features[fid.m_mwmId][fid.m_index]; - // If a feature was modified we can drop all changes since it's now obsolete. - auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); - - if (!originalFeaturePtr) - { - LOG(LERROR, ("A feature with id", fid, "cannot be loaded.")); - alohalytics::LogEvent("Editor_MissingFeature_Error"); - return; - } - - fti.m_feature = *originalFeaturePtr; - fti.m_status = FeatureStatus::Obsolete; - fti.m_modificationTimestamp = time(nullptr); + MarkFeatureWithStatus(fid, FeatureStatus::Obsolete); Save(); Invalidate(); @@ -1146,6 +1125,24 @@ void Editor::UploadNotes(string const & key, string const & secret) m_notes->Upload(OsmOAuth::ServerAuth({key, secret})); } +void Editor::MarkFeatureWithStatus(FeatureID const & fid, FeatureStatus status) +{ + auto & fti = m_features[fid.m_mwmId][fid.m_index]; + + auto const originalFeaturePtr = m_getOriginalFeatureFn(fid); + + if (!originalFeaturePtr) + { + LOG(LERROR, ("A feature with id", fid, "cannot be loaded.")); + alohalytics::LogEvent("Editor_MissingFeature_Error"); + return; + } + + fti.m_feature = *originalFeaturePtr; + fti.m_status = status; + fti.m_modificationTimestamp = time(nullptr); +} + string DebugPrint(Editor::FeatureStatus fs) { switch (fs) diff --git a/indexer/osm_editor.hpp b/indexer/osm_editor.hpp index 4a70207acb..282f9b98ef 100644 --- a/indexer/osm_editor.hpp +++ b/indexer/osm_editor.hpp @@ -112,7 +112,7 @@ public: bool IsFeatureUploaded(MwmSet::MwmId const & mwmId, uint32_t index) const; /// Marks feature as "deleted" from MwM file. - void DeleteFeature(FeatureType const & feature); + void DeleteFeature(FeatureID const & fid); /// @returns false if feature wasn't edited. /// @param outFeature is valid only if true was returned. @@ -219,7 +219,9 @@ private: FeatureTypeInfo const * GetFeatureTypeInfo(MwmSet::MwmId const & mwmId, uint32_t index) const; FeatureTypeInfo * GetFeatureTypeInfo(MwmSet::MwmId const & mwmId, uint32_t index); void SaveUploadedInformation(FeatureTypeInfo const & fromUploader); - + + void MarkFeatureWithStatus(FeatureID const & fid, FeatureStatus status); + // TODO(AlexZ): Synchronize multithread access. /// Deleted, edited and created features. map> m_features; diff --git a/map/framework.cpp b/map/framework.cpp index 5ab3159a20..779716a67c 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2960,13 +2960,7 @@ osm::Editor::SaveResult Framework::SaveEditedMapObject(osm::EditableMapObject em void Framework::DeleteFeature(FeatureID const & fid) const { - // TODO(AlexZ): Use FeatureID in the editor interface. - - FeatureType ft; - if (!GetFeatureByID(fid, ft)) - return; - - osm::Editor::Instance().DeleteFeature(ft); + osm::Editor::Instance().DeleteFeature(fid); if (m_selectedFeature == fid) m_selectedFeature = FeatureID(); } diff --git a/xcode/generator/generator.xcodeproj/project.pbxproj b/xcode/generator/generator.xcodeproj/project.pbxproj index 4d668aeb25..57b286ef38 100644 --- a/xcode/generator/generator.xcodeproj/project.pbxproj +++ b/xcode/generator/generator.xcodeproj/project.pbxproj @@ -7,6 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + 3D51BC481D5E50F700F1FA8D /* centers_table_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D51BC461D5E50F700F1FA8D /* centers_table_builder.cpp */; }; + 3D51BC491D5E50F700F1FA8D /* centers_table_builder.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D51BC471D5E50F700F1FA8D /* centers_table_builder.hpp */; }; + 3D51BC521D5E512500F1FA8D /* altitude_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D51BC4A1D5E512500F1FA8D /* altitude_generator.cpp */; }; + 3D51BC531D5E512500F1FA8D /* altitude_generator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D51BC4B1D5E512500F1FA8D /* altitude_generator.hpp */; }; + 3D51BC561D5E512500F1FA8D /* region_meta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D51BC4E1D5E512500F1FA8D /* region_meta.cpp */; }; + 3D51BC571D5E512500F1FA8D /* region_meta.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D51BC4F1D5E512500F1FA8D /* region_meta.hpp */; }; + 3D51BC581D5E512500F1FA8D /* srtm_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D51BC501D5E512500F1FA8D /* srtm_parser.cpp */; }; + 3D51BC591D5E512500F1FA8D /* srtm_parser.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D51BC511D5E512500F1FA8D /* srtm_parser.hpp */; }; 670B84BC1A8CDB0000CE4492 /* osm_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 670B84BA1A8CDB0000CE4492 /* osm_source.cpp */; }; 670B84BD1A8CDB0000CE4492 /* osm_source.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 670B84BB1A8CDB0000CE4492 /* osm_source.hpp */; }; 6726C1D51A4AFEF4005EEA39 /* osm2meta.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6726C1D31A4AFEF4005EEA39 /* osm2meta.cpp */; }; @@ -68,6 +76,14 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 3D51BC461D5E50F700F1FA8D /* centers_table_builder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = centers_table_builder.cpp; sourceTree = ""; }; + 3D51BC471D5E50F700F1FA8D /* centers_table_builder.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = centers_table_builder.hpp; sourceTree = ""; }; + 3D51BC4A1D5E512500F1FA8D /* altitude_generator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = altitude_generator.cpp; sourceTree = ""; }; + 3D51BC4B1D5E512500F1FA8D /* altitude_generator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = altitude_generator.hpp; sourceTree = ""; }; + 3D51BC4E1D5E512500F1FA8D /* region_meta.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = region_meta.cpp; sourceTree = ""; }; + 3D51BC4F1D5E512500F1FA8D /* region_meta.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = region_meta.hpp; sourceTree = ""; }; + 3D51BC501D5E512500F1FA8D /* srtm_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = srtm_parser.cpp; sourceTree = ""; }; + 3D51BC511D5E512500F1FA8D /* srtm_parser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = srtm_parser.hpp; sourceTree = ""; }; 670B84BA1A8CDB0000CE4492 /* osm_source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = osm_source.cpp; sourceTree = ""; }; 670B84BB1A8CDB0000CE4492 /* osm_source.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = osm_source.hpp; sourceTree = ""; }; 670D05AC1B0E07C30013A7AC /* defaults.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = defaults.xcconfig; path = ../defaults.xcconfig; sourceTree = ""; }; @@ -173,6 +189,14 @@ 6753401D1A3F2A1B00A0A8C3 /* generator */ = { isa = PBXGroup; children = ( + 3D51BC4A1D5E512500F1FA8D /* altitude_generator.cpp */, + 3D51BC4B1D5E512500F1FA8D /* altitude_generator.hpp */, + 3D51BC4E1D5E512500F1FA8D /* region_meta.cpp */, + 3D51BC4F1D5E512500F1FA8D /* region_meta.hpp */, + 3D51BC501D5E512500F1FA8D /* srtm_parser.cpp */, + 3D51BC511D5E512500F1FA8D /* srtm_parser.hpp */, + 3D51BC461D5E50F700F1FA8D /* centers_table_builder.cpp */, + 3D51BC471D5E50F700F1FA8D /* centers_table_builder.hpp */, E9502E311D34012200CAB86B /* booking_scoring.cpp */, E9502E321D34012200CAB86B /* booking_scoring.hpp */, 677E2A111CAACC5F001DC42A /* tag_admixer.hpp */, @@ -268,12 +292,14 @@ 6753406F1A3F2A7400A0A8C3 /* feature_merger.hpp in Headers */, 6753406A1A3F2A7400A0A8C3 /* feature_builder.hpp in Headers */, 675340741A3F2A7400A0A8C3 /* generate_info.hpp in Headers */, + 3D51BC571D5E512500F1FA8D /* region_meta.hpp in Headers */, 677E2A161CAACC5F001DC42A /* tag_admixer.hpp in Headers */, 675340861A3F2A7400A0A8C3 /* tesselator.hpp in Headers */, 67A0FEBF1CEB467F008F2A61 /* booking_dataset.hpp in Headers */, 6753405F1A3F2A7400A0A8C3 /* borders_loader.hpp in Headers */, 675340801A3F2A7400A0A8C3 /* polygonizer.hpp in Headers */, 675340941C5231BA002CF0D9 /* search_index_builder.hpp in Headers */, + 3D51BC591D5E512500F1FA8D /* srtm_parser.hpp in Headers */, 677E2A181CAACC5F001DC42A /* towns_dumper.hpp in Headers */, 675340821A3F2A7400A0A8C3 /* routing_generator.hpp in Headers */, 675340841A3F2A7400A0A8C3 /* statistics.hpp in Headers */, @@ -283,7 +309,9 @@ 675340711A3F2A7400A0A8C3 /* feature_sorter.hpp in Headers */, 675340611A3F2A7400A0A8C3 /* check_model.hpp in Headers */, 6726C1D61A4AFEF4005EEA39 /* osm2meta.hpp in Headers */, + 3D51BC491D5E50F700F1FA8D /* centers_table_builder.hpp in Headers */, 6753407B1A3F2A7400A0A8C3 /* osm_id.hpp in Headers */, + 3D51BC531D5E512500F1FA8D /* altitude_generator.hpp in Headers */, 675340731A3F2A7400A0A8C3 /* gen_mwm_info.hpp in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -375,6 +403,9 @@ buildActionMask = 2147483647; files = ( 6753406C1A3F2A7400A0A8C3 /* feature_generator.cpp in Sources */, + 3D51BC561D5E512500F1FA8D /* region_meta.cpp in Sources */, + 3D51BC521D5E512500F1FA8D /* altitude_generator.cpp in Sources */, + 3D51BC581D5E512500F1FA8D /* srtm_parser.cpp in Sources */, 6753407A1A3F2A7400A0A8C3 /* osm_id.cpp in Sources */, 675340871A3F2A7400A0A8C3 /* unpack_mwm.cpp in Sources */, 670B84BC1A8CDB0000CE4492 /* osm_source.cpp in Sources */, @@ -390,6 +421,7 @@ 675340691A3F2A7400A0A8C3 /* feature_builder.cpp in Sources */, 677E2A171CAACC5F001DC42A /* towns_dumper.cpp in Sources */, 6753405C1A3F2A7400A0A8C3 /* borders_generator.cpp in Sources */, + 3D51BC481D5E50F700F1FA8D /* centers_table_builder.cpp in Sources */, 675340671A3F2A7400A0A8C3 /* dumper.cpp in Sources */, E9502E331D34012200CAB86B /* booking_scoring.cpp in Sources */, 675340831A3F2A7400A0A8C3 /* statistics.cpp in Sources */, @@ -451,6 +483,7 @@ "$(OMIM_ROOT)/3party/osrm/osrm-backend/include", "$(QT_PATH)/include", "$(OMIM_ROOT)/3party/glm", + "$(OMIM_ROOT)/3party/jansson/src", ); MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; @@ -494,6 +527,7 @@ "$(OMIM_ROOT)/3party/osrm/osrm-backend/include", "$(QT_PATH)/include", "$(OMIM_ROOT)/3party/glm", + "$(OMIM_ROOT)/3party/jansson/src", ); MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; @@ -541,7 +575,7 @@ GCC_ENABLE_CPP_EXCEPTIONS = YES; GCC_ENABLE_CPP_RTTI = YES; GCC_NO_COMMON_BLOCKS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -556,7 +590,7 @@ GCC_ENABLE_CPP_EXCEPTIONS = YES; GCC_ENABLE_CPP_RTTI = YES; GCC_NO_COMMON_BLOCKS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/xcode/indexer/indexer.xcodeproj/project.pbxproj b/xcode/indexer/indexer.xcodeproj/project.pbxproj index e6cfe7403e..00ae38aecc 100644 --- a/xcode/indexer/indexer.xcodeproj/project.pbxproj +++ b/xcode/indexer/indexer.xcodeproj/project.pbxproj @@ -31,6 +31,17 @@ 3D489BC81D3D22190052AA38 /* string_slice_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D489BA91D3D1F8A0052AA38 /* string_slice_tests.cpp */; }; 3D489BF31D4F87740052AA38 /* osm_editor_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D489BF11D4F87740052AA38 /* osm_editor_test.cpp */; }; 3D489BF41D4F87740052AA38 /* osm_editor_test.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D489BF21D4F87740052AA38 /* osm_editor_test.hpp */; }; + 3D51BC311D5E4B7300F1FA8D /* osm_editor_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D489BF11D4F87740052AA38 /* osm_editor_test.cpp */; }; + 3D51BC331D5E4BB000F1FA8D /* osm_editor_test.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D489BF21D4F87740052AA38 /* osm_editor_test.hpp */; }; + 3D51BC351D5E4BF600F1FA8D /* libsearch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC341D5E4BF600F1FA8D /* libsearch.a */; }; + 3D51BC371D5E4C3900F1FA8D /* libstorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC361D5E4C3900F1FA8D /* libstorage.a */; }; + 3D51BC3B1D5E4C5D00F1FA8D /* libplatform_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC3A1D5E4C5D00F1FA8D /* libplatform_tests_support.a */; }; + 3D51BC3D1D5E4C6400F1FA8D /* libgenerator_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC3C1D5E4C6400F1FA8D /* libgenerator_tests_support.a */; }; + 3D51BC3F1D5E4C8800F1FA8D /* librouting.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC3E1D5E4C8800F1FA8D /* librouting.a */; }; + 3D51BC411D5E4CFA00F1FA8D /* libtess2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC401D5E4CFA00F1FA8D /* libtess2.a */; }; + 3D51BC421D5E4D3800F1FA8D /* libgenerator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC381D5E4C4300F1FA8D /* libgenerator.a */; }; + 3D51BC431D5E4E2B00F1FA8D /* test_mwm_set.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 56C74C2D1C749E8100B71B9F /* test_mwm_set.hpp */; }; + 3D51BC451D5E4EBF00F1FA8D /* libsearch_tests_support.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D51BC441D5E4EBF00F1FA8D /* libsearch_tests_support.a */; }; 3D928F671D50F9FE001670E0 /* index_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D928F651D50F9FE001670E0 /* index_helpers.cpp */; }; 3D928F681D50F9FE001670E0 /* index_helpers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D928F661D50F9FE001670E0 /* index_helpers.hpp */; }; 56C74C1C1C749E4700B71B9F /* categories_holder_loader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 56C74C121C749E4700B71B9F /* categories_holder_loader.cpp */; }; @@ -220,6 +231,14 @@ 3D489BA91D3D1F8A0052AA38 /* string_slice_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_slice_tests.cpp; sourceTree = ""; }; 3D489BF11D4F87740052AA38 /* osm_editor_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = osm_editor_test.cpp; sourceTree = ""; }; 3D489BF21D4F87740052AA38 /* osm_editor_test.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = osm_editor_test.hpp; sourceTree = ""; }; + 3D51BC341D5E4BF600F1FA8D /* libsearch.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsearch.a; path = "../../../omim-xcode-build/Debug/libsearch.a"; sourceTree = ""; }; + 3D51BC361D5E4C3900F1FA8D /* libstorage.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libstorage.a; path = "../../../omim-xcode-build/Debug/libstorage.a"; sourceTree = ""; }; + 3D51BC381D5E4C4300F1FA8D /* libgenerator.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgenerator.a; path = "../../../omim-xcode-build/Debug/libgenerator.a"; sourceTree = ""; }; + 3D51BC3A1D5E4C5D00F1FA8D /* libplatform_tests_support.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libplatform_tests_support.a; path = "../../../omim-xcode-build/Debug/libplatform_tests_support.a"; sourceTree = ""; }; + 3D51BC3C1D5E4C6400F1FA8D /* libgenerator_tests_support.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgenerator_tests_support.a; path = "../../../omim-xcode-build/Debug/libgenerator_tests_support.a"; sourceTree = ""; }; + 3D51BC3E1D5E4C8800F1FA8D /* librouting.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = librouting.a; path = "../../../omim-xcode-build/Debug/librouting.a"; sourceTree = ""; }; + 3D51BC401D5E4CFA00F1FA8D /* libtess2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libtess2.a; path = "../../../omim-xcode-build/Debug/libtess2.a"; sourceTree = ""; }; + 3D51BC441D5E4EBF00F1FA8D /* libsearch_tests_support.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsearch_tests_support.a; path = "../../../omim-xcode-build/Debug/libsearch_tests_support.a"; sourceTree = ""; }; 3D928F651D50F9FE001670E0 /* index_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = index_helpers.cpp; sourceTree = ""; }; 3D928F661D50F9FE001670E0 /* index_helpers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = index_helpers.hpp; sourceTree = ""; }; 56C74C121C749E4700B71B9F /* categories_holder_loader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = categories_holder_loader.cpp; sourceTree = ""; }; @@ -383,6 +402,14 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 3D51BC451D5E4EBF00F1FA8D /* libsearch_tests_support.a in Frameworks */, + 3D51BC421D5E4D3800F1FA8D /* libgenerator.a in Frameworks */, + 3D51BC411D5E4CFA00F1FA8D /* libtess2.a in Frameworks */, + 3D51BC3F1D5E4C8800F1FA8D /* librouting.a in Frameworks */, + 3D51BC3D1D5E4C6400F1FA8D /* libgenerator_tests_support.a in Frameworks */, + 3D51BC3B1D5E4C5D00F1FA8D /* libplatform_tests_support.a in Frameworks */, + 3D51BC371D5E4C3900F1FA8D /* libstorage.a in Frameworks */, + 3D51BC351D5E4BF600F1FA8D /* libsearch.a in Frameworks */, 670BAAAC1D0B07AA000302DA /* libcoding.a in Frameworks */, 670BAAC81D0B0B77000302DA /* SystemConfiguration.framework in Frameworks */, 670BAAC41D0B0865000302DA /* IOKit.framework in Frameworks */, @@ -417,6 +444,14 @@ 670BAACC1D0B0F0A000302DA /* libs */ = { isa = PBXGroup; children = ( + 3D51BC441D5E4EBF00F1FA8D /* libsearch_tests_support.a */, + 3D51BC401D5E4CFA00F1FA8D /* libtess2.a */, + 3D51BC3E1D5E4C8800F1FA8D /* librouting.a */, + 3D51BC3C1D5E4C6400F1FA8D /* libgenerator_tests_support.a */, + 3D51BC3A1D5E4C5D00F1FA8D /* libplatform_tests_support.a */, + 3D51BC381D5E4C4300F1FA8D /* libgenerator.a */, + 3D51BC361D5E4C3900F1FA8D /* libstorage.a */, + 3D51BC341D5E4BF600F1FA8D /* libsearch.a */, 670BAAC71D0B0B77000302DA /* SystemConfiguration.framework */, 670BAAC51D0B086E000302DA /* CFNetwork.framework */, 670BAAC31D0B0865000302DA /* IOKit.framework */, @@ -644,6 +679,15 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 3D51BC321D5E4B9200F1FA8D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D51BC431D5E4E2B00F1FA8D /* test_mwm_set.hpp in Headers */, + 3D51BC331D5E4BB000F1FA8D /* osm_editor_test.hpp in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 675340981A3F53CB00A0A8C3 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -735,6 +779,7 @@ 670C61211AB0661100C38A8C /* Sources */, 670C61221AB0661100C38A8C /* Frameworks */, 670C61231AB0661100C38A8C /* CopyFiles */, + 3D51BC321D5E4B9200F1FA8D /* Headers */, ); buildRules = ( ); @@ -802,6 +847,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3D51BC311D5E4B7300F1FA8D /* osm_editor_test.cpp in Sources */, 670BAA9D1D0B06E1000302DA /* interval_index_test.cpp in Sources */, 670BAAA31D0B06E1000302DA /* test_type.cpp in Sources */, 670BAA961D0B06E1000302DA /* cell_id_test.cpp in Sources */,