From 18728c8d11cb99fe2875936a7157d5b9a8c49b15 Mon Sep 17 00:00:00 2001 From: Arsentiy Milchakov Date: Thu, 9 Nov 2017 17:49:24 +0300 Subject: [PATCH] [booking] availability filter tests --- .../generator_tests_support/test_feature.cpp | 2 + .../generator_tests_support/test_feature.hpp | 3 + indexer/indexer_tests_support/helpers.hpp | 2 - .../test_mwm_environment.cpp | 36 ++++++++ .../test_mwm_environment.hpp | 83 +++++++++++++++++ map/map_tests/CMakeLists.txt | 2 + .../booking_availability_cache_test.cpp | 55 ++++++++++++ map/map_tests/booking_filter_test.cpp | 88 +++++++++++++++++++ map/map_tests/map_tests.pro | 2 + tools/python/run_desktop_tests.py | 2 +- .../indexer/indexer.xcodeproj/project.pbxproj | 8 ++ 11 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 indexer/indexer_tests_support/test_mwm_environment.cpp create mode 100644 indexer/indexer_tests_support/test_mwm_environment.hpp create mode 100644 map/map_tests/booking_availability_cache_test.cpp create mode 100644 map/map_tests/booking_filter_test.cpp diff --git a/generator/generator_tests_support/test_feature.cpp b/generator/generator_tests_support/test_feature.cpp index 05b6cbf782..85116b43b5 100644 --- a/generator/generator_tests_support/test_feature.cpp +++ b/generator/generator_tests_support/test_feature.cpp @@ -231,6 +231,8 @@ void TestPOI::Serialize(FeatureBuilder1 & fb) const fb.AddHouseNumber(m_houseNumber); if (!m_streetName.empty()) fb.AddStreet(m_streetName); + if (!m_metadata.Empty()) + fb.GetMetadataForTesting() = m_metadata; } string TestPOI::ToString() const diff --git a/generator/generator_tests_support/test_feature.hpp b/generator/generator_tests_support/test_feature.hpp index 23df5befed..77d08dc85e 100644 --- a/generator/generator_tests_support/test_feature.hpp +++ b/generator/generator_tests_support/test_feature.hpp @@ -1,6 +1,7 @@ #pragma once #include "indexer/feature_decl.hpp" +#include "indexer/feature_meta.hpp" #include "indexer/mwm_set.hpp" #include "geometry/point2d.hpp" @@ -124,11 +125,13 @@ public: inline void SetHouseNumber(std::string const & houseNumber) { m_houseNumber = houseNumber; } inline void SetStreet(TestStreet const & street) { m_streetName = street.GetName(); } inline void SetTypes(std::vector> const & types) { m_types = types; } + inline void SetMetadata(feature::Metadata const & metadata) { m_metadata = metadata; } private: std::string m_houseNumber; std::string m_streetName; std::vector> m_types; + feature::Metadata m_metadata; }; class TestBuilding : public TestFeature diff --git a/indexer/indexer_tests_support/helpers.hpp b/indexer/indexer_tests_support/helpers.hpp index 6232ad7184..5adfbb0768 100644 --- a/indexer/indexer_tests_support/helpers.hpp +++ b/indexer/indexer_tests_support/helpers.hpp @@ -7,8 +7,6 @@ #include "std/unique_ptr.hpp" -class Index; - namespace indexer { namespace tests_support diff --git a/indexer/indexer_tests_support/test_mwm_environment.cpp b/indexer/indexer_tests_support/test_mwm_environment.cpp new file mode 100644 index 0000000000..ca686ef114 --- /dev/null +++ b/indexer/indexer_tests_support/test_mwm_environment.cpp @@ -0,0 +1,36 @@ +#include "indexer/indexer_tests_support/test_mwm_environment.hpp" + +#include + +namespace indexer +{ +namespace tests_support +{ +TestMwmEnvironment::TestMwmEnvironment() { classificator::Load(); } + +TestMwmEnvironment::~TestMwmEnvironment() +{ + for (auto const & file : m_mwmFiles) + Cleanup(file); +} + +void TestMwmEnvironment::Cleanup(platform::LocalCountryFile const & map) +{ + platform::CountryIndexes::DeleteFromDisk(map); + map.DeleteFromDisk(MapOptions::Map); +} + +bool TestMwmEnvironment::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 tests_support +} // namespace indexer diff --git a/indexer/indexer_tests_support/test_mwm_environment.hpp b/indexer/indexer_tests_support/test_mwm_environment.hpp new file mode 100644 index 0000000000..9d0e439f53 --- /dev/null +++ b/indexer/indexer_tests_support/test_mwm_environment.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include "generator/generator_tests_support/test_feature.hpp" +#include "generator/generator_tests_support/test_mwm_builder.hpp" + +#include "platform/local_country_file_utils.hpp" + +#include "storage/country_info_getter.hpp" + +#include + +#include + +namespace indexer +{ +namespace tests_support +{ +class TestMwmEnvironment +{ +public: + using MwmList = std::vector; + + TestMwmEnvironment(); + ~TestMwmEnvironment(); + + template + MwmSet::MwmId BuildMwm(string const & name, TBuildFn && fn, int64_t version = 0) + { + m_mwmFiles.emplace_back(GetPlatform().WritableDir(), platform::CountryFile(name), version); + auto & file = m_mwmFiles.back(); + Cleanup(file); + + { + generator::tests_support::TestMwmBuilder builder(file, feature::DataHeader::country); + fn(builder); + } + + auto result = m_index.RegisterMap(file); + CHECK_EQUAL(result.second, MwmSet::RegResult::Success, ()); + + auto const & id = result.first; + + auto const & info = id.GetInfo(); + if (info) + m_infoGetter.AddCountry(storage::CountryDef(name, info->m_limitRect)); + + CHECK(id.IsAlive(), ()); + + return id; + } + + template + FeatureID FeatureIdForPoint(m2::PointD const & mercator, Checker const & checker) + { + m2::RectD const rect = + MercatorBounds::RectByCenterXYAndSizeInMeters(mercator, 0.2 /* rect width */); + FeatureID id; + auto const fn = [&id, &checker](FeatureType const & featureType) + { + if (checker(featureType)) + id = featureType.GetID(); + }; + m_index.ForEachInRect(fn, rect, scales::GetUpperScale()); + CHECK(id.IsValid(), ()); + return id; + } + + void Cleanup(platform::LocalCountryFile const & map); + bool RemoveMwm(MwmSet::MwmId const & mwmId); + + Index & GetIndex() { return m_index; } + Index const & GetIndex() const { return m_index; } + + MwmList & GetMwms() { return m_mwmFiles; } + MwmList const & GetMwms() const { return m_mwmFiles; } + +private: + Index m_index; + storage::CountryInfoGetterForTesting m_infoGetter; + MwmList m_mwmFiles; +}; +} // namespace tests_support +} // namespace indexer \ No newline at end of file diff --git a/map/map_tests/CMakeLists.txt b/map/map_tests/CMakeLists.txt index 8cbc14b9cd..472a6d5e6f 100644 --- a/map/map_tests/CMakeLists.txt +++ b/map/map_tests/CMakeLists.txt @@ -5,6 +5,8 @@ add_definitions("-DOMIM_UNIT_TEST_WITH_QT_EVENT_LOOP") set( SRC address_tests.cpp + booking_availability_cache_test.cpp + booking_filter_test.cpp bookmarks_test.cpp chart_generator_tests.cpp feature_getters_tests.cpp diff --git a/map/map_tests/booking_availability_cache_test.cpp b/map/map_tests/booking_availability_cache_test.cpp new file mode 100644 index 0000000000..8c4357953b --- /dev/null +++ b/map/map_tests/booking_availability_cache_test.cpp @@ -0,0 +1,55 @@ +#include "testing/testing.hpp" + +#include "map/booking_filter_cache.hpp" + +#include +#include + +using namespace booking::filter::availability; +using namespace std::chrono; + +namespace +{ +UNIT_TEST(AvailabilityCache_Smoke) +{ + Cache cache(2, 0); + + std::string kHotelId = "0"; + + TEST_EQUAL(cache.Get(kHotelId), Cache::HotelStatus::Absent, ()); + + cache.Reserve(kHotelId); + + TEST_EQUAL(cache.Get(kHotelId), Cache::HotelStatus::NotReady, ()); + + cache.Insert(kHotelId, Cache::HotelStatus::Available); + + TEST_EQUAL(cache.Get(kHotelId), Cache::HotelStatus::Available, ()); + + cache.Insert(kHotelId, Cache::HotelStatus::UnAvailable); + + TEST_EQUAL(cache.Get(kHotelId), Cache::HotelStatus::UnAvailable, ()); +} + +UNIT_TEST(AvailabilityCache_RemoveExtra) +{ + Cache cache(3, 0); + std::vector const kHotelIds = {"1", "2", "3"}; + + for (auto const & id : kHotelIds) + TEST_EQUAL(cache.Get(id), Cache::HotelStatus::Absent, ()); + + for (auto const & id : kHotelIds) + cache.Insert(id, Cache::HotelStatus::Available); + + for (auto const & id : kHotelIds) + TEST_EQUAL(cache.Get(id), Cache::HotelStatus::Available, ()); + + cache.Insert("4", Cache::HotelStatus::Available); + + for (auto const & id : kHotelIds) + TEST_EQUAL(cache.Get(id), Cache::HotelStatus::Absent, ()); + + TEST_EQUAL(cache.Get("4"), Cache::HotelStatus::Available, ()); +} +} // namespace \ No newline at end of file diff --git a/map/map_tests/booking_filter_test.cpp b/map/map_tests/booking_filter_test.cpp new file mode 100644 index 0000000000..1cf0811a99 --- /dev/null +++ b/map/map_tests/booking_filter_test.cpp @@ -0,0 +1,88 @@ +#include "testing/testing.hpp" + +#include "generator/generator_tests_support/test_feature.hpp" +#include "indexer/indexer_tests_support/test_mwm_environment.hpp" + +#include "map/booking_filter.hpp" + +#include "partners_api/booking_api.hpp" + +#include "search/result.hpp" + +#include "indexer/feature_meta.hpp" + +#include "base/scope_guard.hpp" + +#include + +using namespace booking::filter; +using namespace generator::tests_support; + +namespace +{ +UNIT_TEST(BookingFilter_AvailabilitySmoke) +{ + indexer::tests_support::TestMwmEnvironment env; + booking::Api api; + Filter filter(env.GetIndex(), api); + + booking::SetBookingUrlForTesting("http://localhost:34568/booking/min_price"); + MY_SCOPE_GUARD(cleanup, []() { booking::SetBookingUrlForTesting(""); }); + + std::vector const kHotelIds = {"10623", "10624", "10625"}; + + env.BuildMwm("TestMwm", [&kHotelIds](TestMwmBuilder & builder) + { + feature::Metadata metadata; + metadata.Set(feature::Metadata::FMD_SPONSORED_ID, kHotelIds[0]); + TestPOI hotel1(m2::PointD(1.0, 1.0), "hotel 1", "en"); + hotel1.SetMetadata(metadata); + builder.Add(hotel1); + + TestPOI hotel2(m2::PointD(1.1, 1.1), "hotel 2", "en"); + metadata.Set(feature::Metadata::FMD_SPONSORED_ID, kHotelIds[1]); + hotel2.SetMetadata(metadata); + builder.Add(hotel2); + + TestPOI hotel3(m2::PointD(0.9, 0.9), "hotel 3", "en"); + metadata.Set(feature::Metadata::FMD_SPONSORED_ID, kHotelIds[2]); + hotel3.SetMetadata(metadata); + builder.Add(hotel3); + }); + + m2::RectD const rect = MercatorBounds::RectByCenterXYAndSizeInMeters( + m2::PointD(1.0, 1.0), 2 / MercatorBounds::degreeInMetres /* rect width */); + search::Results results; + results.AddResult({"suggest for testing", "suggest for testing"}); + search::Results expctedResults; + env.GetIndex().ForEachInRect( + [&results, &expctedResults](FeatureType & ft) { + search::Result::Metadata metadata; + metadata.m_isSponsoredHotel = true; + search::Result result(ft.GetID(), ft.GetCenter(), "", "", "", 0, metadata); + auto copy = result; + results.AddResult(std::move(result)); + expctedResults.AddResult(std::move(copy)); + }, + rect, scales::GetUpperScale()); + availability::ParamsInternal params; + search::Results filteredResults; + params.m_callback = [&filteredResults](search::Results const & results) + { + filteredResults = results; + testing::Notify(); + }; + + filter.Availability(results, params); + + testing::Wait(); + + TEST_NOT_EQUAL(filteredResults.GetCount(), 0, ()); + TEST_EQUAL(filteredResults.GetCount(), expctedResults.GetCount(), ()); + + for (size_t i = 0; i < filteredResults.GetCount(); ++i) + { + TEST_EQUAL(filteredResults[i].GetFeatureID(), expctedResults[i].GetFeatureID(), ()); + } +} +} // namespace \ No newline at end of file diff --git a/map/map_tests/map_tests.pro b/map/map_tests/map_tests.pro index abbfba28c4..86678f6b76 100644 --- a/map/map_tests/map_tests.pro +++ b/map/map_tests/map_tests.pro @@ -35,6 +35,8 @@ macx-*: LIBS *= "-framework IOKit" "-framework SystemConfiguration" SOURCES += \ ../../testing/testingmain.cpp \ address_tests.cpp \ + booking_availability_cache_test.cpp \ + booking_filter_test.cpp \ bookmarks_test.cpp \ chart_generator_tests.cpp \ feature_getters_tests.cpp \ diff --git a/tools/python/run_desktop_tests.py b/tools/python/run_desktop_tests.py index 6acf81e6ca..bda94914d0 100755 --- a/tools/python/run_desktop_tests.py +++ b/tools/python/run_desktop_tests.py @@ -39,7 +39,7 @@ WITH_SERVER = "with_server" PORT = 34568 -TESTS_REQUIRING_SERVER = ["downloader_tests", "storage_tests", "partners_api_tests"] +TESTS_REQUIRING_SERVER = ["downloader_tests", "storage_tests", "partners_api_tests", "map_tests"] class TestRunner: diff --git a/xcode/indexer/indexer.xcodeproj/project.pbxproj b/xcode/indexer/indexer.xcodeproj/project.pbxproj index 7ba240c320..d5166a9421 100644 --- a/xcode/indexer/indexer.xcodeproj/project.pbxproj +++ b/xcode/indexer/indexer.xcodeproj/project.pbxproj @@ -50,6 +50,8 @@ 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 */; }; + 3D4E99881FB48E5F0025B48C /* test_mwm_environment.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 3D4E99861FB48E5F0025B48C /* test_mwm_environment.hpp */; }; + 3D4E99891FB48E5F0025B48C /* test_mwm_environment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3D4E99871FB48E5F0025B48C /* test_mwm_environment.cpp */; }; 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 */; }; @@ -281,6 +283,8 @@ 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 = ""; }; + 3D4E99861FB48E5F0025B48C /* test_mwm_environment.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_mwm_environment.hpp; sourceTree = ""; }; + 3D4E99871FB48E5F0025B48C /* test_mwm_environment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_mwm_environment.cpp; 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 = ""; }; @@ -532,6 +536,8 @@ 34AF87E21DBE562300E5E7DC /* indexer_tests_support */ = { isa = PBXGroup; children = ( + 3D4E99871FB48E5F0025B48C /* test_mwm_environment.cpp */, + 3D4E99861FB48E5F0025B48C /* test_mwm_environment.hpp */, 34AF87E31DBE565F00E5E7DC /* helpers.cpp */, 34AF87E41DBE565F00E5E7DC /* helpers.hpp */, ); @@ -832,6 +838,7 @@ files = ( E906DE3C1CF44934004C4F5E /* postcodes_matcher.hpp in Headers */, 6753414E1A3F540F00A0A8C3 /* types_mapping.hpp in Headers */, + 3D4E99881FB48E5F0025B48C /* test_mwm_environment.hpp in Headers */, 67BC92F31D21476500A4A378 /* string_set.hpp in Headers */, 6753411F1A3F540F00A0A8C3 /* feature_loader.hpp in Headers */, 675341151A3F540F00A0A8C3 /* feature_covering.hpp in Headers */, @@ -1094,6 +1101,7 @@ 3D74EF241F8F559D0081202C /* ugc_types_test.cpp in Sources */, 6753410D1A3F540F00A0A8C3 /* drawing_rules.cpp in Sources */, 675341301A3F540F00A0A8C3 /* index.cpp in Sources */, + 3D4E99891FB48E5F0025B48C /* test_mwm_environment.cpp in Sources */, 34664CF61D49FEC1003D7096 /* centers_table.cpp in Sources */, 56C74C201C749E4700B71B9F /* edits_migration.cpp in Sources */, 6753414D1A3F540F00A0A8C3 /* types_mapping.cpp in Sources */,