co-maps/generator/generator_tests/camera_collector_tests.cpp
2025-11-22 13:58:55 +01:00

249 lines
8.2 KiB
C++

#include "testing/testing.hpp"
#include "generator/collector_camera.hpp"
#include "generator/feature_maker.hpp"
#include "generator/filter_planet.hpp"
#include "generator/generate_info.hpp"
#include "generator/intermediate_data.hpp"
#include "generator/osm2type.hpp"
#include "generator/osm_element.hpp"
#include "generator/osm_source.hpp"
#include "generator/processor_factory.hpp"
#include "generator/raw_generator.hpp"
#include "generator/translator.hpp"
#include "indexer/classificator_loader.hpp"
#include "indexer/map_style.hpp"
#include "indexer/map_style_reader.hpp"
#include "platform/platform.hpp"
#include "platform/platform_tests_support/scoped_dir.hpp"
#include "platform/platform_tests_support/scoped_file.hpp"
#include "platform/platform_tests_support/writable_dir_changer.hpp"
#include "base/macros.hpp"
#include "defines.hpp"
namespace routing_builder
{
using namespace generator;
using std::pair, std::string;
string const kSpeedCameraTag = R"(<tag k="highway" v="speed_camera"/>)";
feature::FeatureBuilder MakeFeatureBuilderWithParams(OsmElement & element)
{
feature::FeatureBuilder fb;
auto & params = fb.GetParams();
ftype::GetNameAndType(&element, params);
return fb;
}
class TranslatorForTest : public generator::Translator
{
public:
explicit TranslatorForTest(std::shared_ptr<FeatureProcessorInterface> const & processor,
std::shared_ptr<generator::cache::IntermediateData> const & cache)
: Translator(processor, cache, std::make_shared<FeatureMaker>(cache->GetCache()))
{
SetFilter(std::make_shared<FilterPlanet>());
}
// TranslatorInterface overrides:
std::shared_ptr<TranslatorInterface> Clone() const override
{
CHECK(false, ());
return {};
}
void Merge(TranslatorInterface const &) override { CHECK(false, ()); }
protected:
using Translator::Translator;
};
class TestCameraCollector
{
public:
// Directory name for creating test mwm and temporary files.
string static const kTestDir;
string static const kOsmFileName;
TestCameraCollector()
{
GetStyleReader().SetCurrentStyle(MapStyleMerged);
classificator::Load();
}
static bool Test(string const & osmSourceXML, std::set<pair<uint64_t, uint64_t>> const & trueAnswers)
{
using namespace platform::tests_support;
Platform & platform = GetPlatform();
WritableDirChanger writableDirChanger(kTestDir);
auto const & writableDir = platform.WritableDir();
ScopedDir const scopedDir(kTestDir);
auto const osmRelativePath = base::JoinPath(kTestDir, kOsmFileName);
ScopedFile const osmScopedFile(osmRelativePath, osmSourceXML);
feature::GenerateInfo genInfo;
// Generate intermediate data.
genInfo.m_cacheDir = writableDir;
genInfo.m_intermediateDir = writableDir;
genInfo.m_nodeStorageType = feature::GenerateInfo::NodeStorageType::Index;
genInfo.m_osmFileName = base::JoinPath(writableDir, osmRelativePath);
genInfo.m_osmFileType = feature::GenerateInfo::OsmSourceType::XML;
// Test save intermediate data is OK.
CHECK(GenerateIntermediateData(genInfo), ());
// Test load this data from cached file.
generator::cache::IntermediateDataObjectsCache objectsCache;
auto cache = std::make_shared<generator::cache::IntermediateData>(objectsCache, genInfo);
auto collector =
std::make_shared<CameraCollector>(genInfo.GetIntermediateFileName(CAMERAS_TO_WAYS_FILENAME), cache->GetCache());
auto processor = CreateProcessor(ProcessorType::Noop);
auto translator = std::make_shared<TranslatorForTest>(processor, cache);
translator->SetCollector(collector);
RawGenerator rawGenerator(genInfo);
rawGenerator.GenerateCustom(translator);
CHECK(rawGenerator.Execute(), ());
std::set<pair<uint64_t, uint64_t>> answers;
collector->ForEachCamera([&](auto const & camera)
{
for (auto const & w : camera.m_ways)
answers.emplace(camera.m_id, w);
});
return answers == trueAnswers;
}
};
string const TestCameraCollector::kTestDir = "camera_test";
string const TestCameraCollector::kOsmFileName = "planet" OSM_DATA_FILE_EXTENSION;
UNIT_CLASS_TEST(TestCameraCollector, test_1)
{
string const osmSourceXML =
R"(<osm version="0.6" generator="osmconvert 0.8.4" timestamp="2018-07-16T02:00:00Z">
<node id="1" lat="55.779384" lon="37.3699375" version="1">)" +
kSpeedCameraTag + R"(</node><node id="2" lat="55.779304" lon="37.3699375" version="1">)" + kSpeedCameraTag +
R"(</node><node id="3" lat="55.773084" lon="37.3699375" version="1">)" + kSpeedCameraTag +
R"(</node><node id="4" lat="55.773084" lon="37.3699375" version="1">
</node>
<way id="10" version="1">
<nd ref="1"/>
<nd ref="4"/>
<tag k="highway" v="unclassified"/>
</way>
<way id="20" version="1">
<nd ref="1"/>
<nd ref="2"/>
<nd ref="3"/>
<tag k="highway" v="unclassified"/>
</way>
</osm>)";
std::set<pair<uint64_t, uint64_t>> trueAnswers = {{1, 10}, {1, 20}, {2, 20}, {3, 20}};
TEST(TestCameraCollector::Test(osmSourceXML, trueAnswers), ());
}
UNIT_CLASS_TEST(TestCameraCollector, test_2)
{
string const osmSourceXML =
R"(<osm version="0.6" generator="osmconvert 0.8.4" timestamp="2018-07-16T02:00:00Z">
<node id="1" lat="55.779384" lon="37.3699375" version="1">)" +
kSpeedCameraTag + R"(</node><node id="2" lat="55.779304" lon="37.3699375" version="1">)" + kSpeedCameraTag +
R"(</node><node id="3" lat="55.773084" lon="37.3699375" version="1">)" + kSpeedCameraTag +
R"(</node><node id="4" lat="55.773024" lon="37.3699375" version="1">)" + kSpeedCameraTag +
R"(</node><node id="5" lat="55.773014" lon="37.3699375" version="1">)" + kSpeedCameraTag +
R"(</node>
<way id="10" version="1">
<nd ref="1"/>
<nd ref="2"/>
<tag k="highway" v="unclassified"/>
</way>
<way id="20" version="1">
<nd ref="1"/>
<nd ref="3"/>
<tag k="highway" v="unclassified"/>
</way>
<way id="30" version="1">
<nd ref="1"/>
<nd ref="3"/>
<nd ref="4"/>
<nd ref="5"/>
<tag k="highway" v="unclassified"/>
</way>
</osm>)";
std::set<pair<uint64_t, uint64_t>> trueAnswers = {{1, 10}, {2, 10}, {1, 20}, {3, 20},
{1, 30}, {3, 30}, {4, 30}, {5, 30}};
TEST(TestCameraCollector::Test(osmSourceXML, trueAnswers), ());
}
UNIT_CLASS_TEST(TestCameraCollector, test_3)
{
string const osmSourceXML =
R"(<osm version="0.6" generator="osmconvert 0.8.4" timestamp="2018-07-16T02:00:00Z">
<node id="1" lat="55.779384" lon="37.3699375" version="1">)" +
kSpeedCameraTag +
R"(</node><node id="2" lat="55.779384" lon="37.3699375" version="1">
</node>
<way id="10" version="1">
<nd ref="1"/>
<nd ref="2"/>
<tag k="highway" v="unclassified"/>
</way>
<way id="20" version="1">
<nd ref="1"/>
<nd ref="2"/>
<tag k="highway" v="unclassified"/>
</way>
</osm>)";
std::set<pair<uint64_t, uint64_t>> trueAnswers = {{1, 10}, {1, 20}};
TEST(TestCameraCollector::Test(osmSourceXML, trueAnswers), ());
}
UNIT_CLASS_TEST(TestCameraCollector, test_4)
{
string const osmSourceXML =
R"(<osm version="0.6" generator="osmconvert 0.8.4" timestamp="2018-07-16T02:00:00Z">
<node id="1" lat="55.779384" lon="37.3699375" version="1">)" +
kSpeedCameraTag +
R"(</node><way id="10" version="1">
<tag k="highway" v="unclassified"/>
</way>
<way id="20" version="1">
<tag k="highway" v="unclassified"/>
</way>
</osm>)";
std::set<pair<uint64_t, uint64_t>> trueAnswers = {};
TEST(TestCameraCollector::Test(osmSourceXML, trueAnswers), ());
}
UNIT_CLASS_TEST(TestCameraCollector, test_5)
{
string const osmSourceXML =
R"(<osm version="0.6" generator="osmconvert 0.8.4" timestamp="2018-07-16T02:00:00Z">
<node id="1" lat="55.779384" lon="37.3699375" version="1"></node>
<way id="10" version="1">
<nd ref="1"/>
<tag k="highway" v="unclassified"/>
</way>
</osm>)";
std::set<pair<uint64_t, uint64_t>> trueAnswers = {};
TEST(TestCameraCollector::Test(osmSourceXML, trueAnswers), ());
}
} // namespace routing_builder