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:
authorygorshenin <mipt.vi002@gmail.com>2016-08-01 12:12:49 +0300
committerGitHub <noreply@github.com>2016-08-01 12:12:49 +0300
commit1e6dd75476400e45ab8bf49ba7bd4c7a65cde368 (patch)
tree2fd1251ad8693adc663695202c762c8a1160e4dd
parent796affb8c3cb0362a38a9d5ac00f2d77ff46d51b (diff)
parent5d284dfa0a68ed056c9dbfc15d9dbd994848aa9b (diff)
Merge pull request #3898 from bykoianko/master-correct-working-on-maps-without-altitude-section
Bugfix. Building pedestrian and bicycle routes with maps without altitude section.
-rw-r--r--generator/generator_tests/altitude_test.cpp114
-rw-r--r--indexer/altitude_loader.cpp5
-rw-r--r--indexer/altitude_loader.hpp2
3 files changed, 82 insertions, 39 deletions
diff --git a/generator/generator_tests/altitude_test.cpp b/generator/generator_tests/altitude_test.cpp
index af95ff2481..0138edea7f 100644
--- a/generator/generator_tests/altitude_test.cpp
+++ b/generator/generator_tests/altitude_test.cpp
@@ -69,7 +69,24 @@ class MockAltitudeGetter : public AltitudeGetter
public:
using TMockAltitudes = map<m2::PointI, TAltitude>;
- MockAltitudeGetter(TMockAltitudes && altitudes) : m_altitudes(altitudes) {}
+ MockAltitudeGetter(vector<TPoint3DList> const & roads)
+ {
+ for (TPoint3DList const & geom3D : roads)
+ {
+ for (auto const & g : geom3D)
+ {
+ auto const it = m_altitudes.find(g.m_point);
+ if (it != m_altitudes.cend())
+ {
+ CHECK_EQUAL(it->second, g.m_altitude,
+ ("Point", it->first, "is set with two different altitudes."));
+ continue;
+ }
+ m_altitudes[g.m_point] = g.m_altitude;
+ }
+ }
+ }
+
// AltitudeGetter overrides:
TAltitude GetAltitude(m2::PointD const & p) override
{
@@ -82,7 +99,17 @@ public:
}
private:
- TMockAltitudes const & m_altitudes;
+
+ TMockAltitudes m_altitudes;
+};
+
+class MockNoAltitudeGetter : public AltitudeGetter
+{
+public:
+ TAltitude GetAltitude(m2::PointD const &) override
+ {
+ return kInvalidAltitude;
+ }
};
vector<m2::PointD> ExtractPoints(TPoint3DList const & geom3D)
@@ -93,25 +120,6 @@ vector<m2::PointD> ExtractPoints(TPoint3DList const & geom3D)
return result;
}
-void FillAltitudes(vector<TPoint3DList> const & roads,
- MockAltitudeGetter::TMockAltitudes & altitudes)
-{
- for (TPoint3DList const & geom3D : roads)
- {
- for (size_t i = 0; i < geom3D.size(); ++i)
- {
- auto it = altitudes.find(geom3D[i].m_point);
- if (it != altitudes.end())
- {
- CHECK_EQUAL(it->second, geom3D[i].m_altitude,
- ("Point", it->first, "is set with two different altitudes."));
- continue;
- }
- altitudes[geom3D[i].m_point] = geom3D[i].m_altitude;
- }
- }
-}
-
void BuildMwmWithoutAltitudes(vector<TPoint3DList> const & roads, LocalCountryFile & country)
{
generator::tests_support::TestMwmBuilder builder(country, feature::DataHeader::country);
@@ -121,11 +129,13 @@ void BuildMwmWithoutAltitudes(vector<TPoint3DList> const & roads, LocalCountryFi
}
void TestAltitudes(MwmValue const & mwmValue, string const & mwmPath,
- MockAltitudeGetter & altitudeGetter)
+ bool hasAltitudeExpected, AltitudeGetter & expectedAltitudes)
{
AltitudeLoader loader(mwmValue);
+ TEST_EQUAL(loader.HasAltitudes(), hasAltitudeExpected, ());
- auto processor = [&altitudeGetter, &loader](FeatureType const & f, uint32_t const & id) {
+ auto processor = [&expectedAltitudes, &loader](FeatureType const & f, uint32_t const & id)
+ {
f.ParseGeometry(FeatureType::BEST_GEOMETRY);
size_t const pointsCount = f.GetPointsCount();
TAltitudes const altitudes = loader.GetAltitudes(id, pointsCount);
@@ -139,12 +149,17 @@ void TestAltitudes(MwmValue const & mwmValue, string const & mwmPath,
TEST_EQUAL(altitudes.size(), pointsCount, ());
for (size_t i = 0; i < pointsCount; ++i)
- TEST_EQUAL(altitudeGetter.GetAltitude(f.GetPoint(i)), altitudes[i], ("A wrong altitude"));
+ {
+ TAltitude const fromGetter = expectedAltitudes.GetAltitude(f.GetPoint(i));
+ TAltitude const expected = (fromGetter == kInvalidAltitude ? kDefaultAltitudeMeters : fromGetter);
+ TEST_EQUAL(expected, altitudes[i], ("A wrong altitude"));
+ }
};
feature::ForEachFromDat(mwmPath, processor);
}
-void TestAltitudesBuilding(vector<TPoint3DList> const & roads)
+void TestAltitudesBuilding(vector<TPoint3DList> const & roads, bool hasAltitudeExpected,
+ AltitudeGetter & altitudeGetter)
{
classificator::Load();
Platform & platform = GetPlatform();
@@ -156,11 +171,6 @@ void TestAltitudesBuilding(vector<TPoint3DList> const & roads)
platform::tests_support::ScopedFile testScopedMwm(country.GetPath(MapOptions::Map));
BuildMwmWithoutAltitudes(roads, country);
- // Creating MockAltitudeGetter.
- MockAltitudeGetter::TMockAltitudes altitudes;
- FillAltitudes(roads, altitudes);
- MockAltitudeGetter altitudeGetter(move(altitudes));
-
// Adding altitude section to mwm.
string const mwmPath = my::JoinFoldersToPath(testDirFullPath, kTestMwm + DATA_FILE_EXTENSION);
BuildRoadAltitudes(mwmPath, altitudeGetter);
@@ -173,42 +183,72 @@ void TestAltitudesBuilding(vector<TPoint3DList> const & roads)
MwmSet::MwmHandle mwmHandle = index.GetMwmHandleById(regResult.first);
TEST(mwmHandle.IsAlive(), ());
- TestAltitudes(*mwmHandle.GetValue<MwmValue>(), mwmPath, altitudeGetter);
+ TestAltitudes(*mwmHandle.GetValue<MwmValue>(), mwmPath, hasAltitudeExpected, altitudeGetter);
+}
+
+void TestBuildingAllFeaturesHaveAltitude(vector<TPoint3DList> const & roads, bool hasAltitudeExpected)
+{
+ MockAltitudeGetter altitudeGetter(roads);
+ TestAltitudesBuilding(roads, hasAltitudeExpected, altitudeGetter);
+}
+
+void TestBuildingNoFeatureHasAltitude(vector<TPoint3DList> const & roads, bool hasAltitudeExpected)
+{
+ MockNoAltitudeGetter altitudeGetter;
+ TestAltitudesBuilding(roads, hasAltitudeExpected, altitudeGetter);
}
UNIT_TEST(AltitudeGenerationTest_ZeroFeatures)
{
vector<TPoint3DList> const roads = {};
- TestAltitudesBuilding(roads);
+ TestBuildingAllFeaturesHaveAltitude(roads, false /* hasAltitudeExpected */);
}
UNIT_TEST(AltitudeGenerationTest_OneRoad)
{
vector<TPoint3DList> const roads = {kRoad1};
- TestAltitudesBuilding(roads);
+ TestBuildingAllFeaturesHaveAltitude(roads, true /* hasAltitudeExpected */);
}
UNIT_TEST(AltitudeGenerationTest_TwoConnectedRoads)
{
vector<TPoint3DList> const roads = {kRoad1, kRoad2};
- TestAltitudesBuilding(roads);
+ TestBuildingAllFeaturesHaveAltitude(roads, true /* hasAltitudeExpected */);
}
UNIT_TEST(AltitudeGenerationTest_TwoDisconnectedRoads)
{
vector<TPoint3DList> const roads = {kRoad1, kRoad3};
- TestAltitudesBuilding(roads);
+ TestBuildingAllFeaturesHaveAltitude(roads, true /* hasAltitudeExpected */);
}
UNIT_TEST(AltitudeGenerationTest_ThreeRoads)
{
vector<TPoint3DList> const roads = {kRoad1, kRoad2, kRoad3};
- TestAltitudesBuilding(roads);
+ TestBuildingAllFeaturesHaveAltitude(roads, true /* hasAltitudeExpected */);
}
UNIT_TEST(AltitudeGenerationTest_FourRoads)
{
vector<TPoint3DList> const roads = {kRoad1, kRoad2, kRoad3, kRoad4};
- TestAltitudesBuilding(roads);
+ TestBuildingAllFeaturesHaveAltitude(roads, true /* hasAltitudeExpected */);
+}
+
+UNIT_TEST(AltitudeGenerationTest_ZeroFeaturesWithoutAltitude)
+{
+ vector<TPoint3DList> const roads = {};
+ TestBuildingNoFeatureHasAltitude(roads, false /* hasAltitudeExpected */);
+}
+
+UNIT_TEST(AltitudeGenerationTest_OneRoadWithoutAltitude)
+{
+ vector<TPoint3DList> const roads = {kRoad1};
+ TestBuildingNoFeatureHasAltitude(roads, false /* hasAltitudeExpected */);
+}
+
+UNIT_TEST(AltitudeGenerationTest_FourRoadsWithoutAltitude)
+{
+ vector<TPoint3DList> const roads = {kRoad1, kRoad2, kRoad3, kRoad4};
+ TestBuildingNoFeatureHasAltitude(roads, false /* hasAltitudeExpected */);
}
} // namespace
diff --git a/indexer/altitude_loader.cpp b/indexer/altitude_loader.cpp
index f253056543..a794c96537 100644
--- a/indexer/altitude_loader.cpp
+++ b/indexer/altitude_loader.cpp
@@ -54,7 +54,10 @@ AltitudeLoader::AltitudeLoader(MwmValue const & mwmValue)
}
}
-bool AltitudeLoader::HasAltitudes() const { return m_header.m_minAltitude != kInvalidAltitude; }
+bool AltitudeLoader::HasAltitudes() const
+{
+ return m_reader != nullptr && m_header.m_minAltitude != kInvalidAltitude;
+}
TAltitudes const & AltitudeLoader::GetAltitudes(uint32_t featureId, size_t pointCount)
{
diff --git a/indexer/altitude_loader.hpp b/indexer/altitude_loader.hpp
index bcca0c893e..ff76fd9ba9 100644
--- a/indexer/altitude_loader.hpp
+++ b/indexer/altitude_loader.hpp
@@ -20,9 +20,9 @@ public:
/// or the returned vector is empty.
TAltitudes const & GetAltitudes(uint32_t featureId, size_t pointCount);
-private:
bool HasAltitudes() const;
+private:
unique_ptr<CopiedMemoryRegion> m_altitudeAvailabilityRegion;
unique_ptr<CopiedMemoryRegion> m_featureTableRegion;