#include "catch.hpp" #include #include #include #include #include #include #include #include #include #include #include #include static_assert(osmium::index::empty_value() == osmium::Location{}, "Empty value for location is wrong"); template void test_func_all(TIndex& index) { const osmium::unsigned_object_id_type id1 = 12; const osmium::unsigned_object_id_type id2 = 3; const osmium::Location loc1{1.2, 4.5}; const osmium::Location loc2{3.5, -7.2}; REQUIRE_THROWS_AS(index.get(id1), osmium::not_found); index.set(id1, loc1); index.set(id2, loc2); index.sort(); REQUIRE_THROWS_AS(index.get(0), osmium::not_found); REQUIRE_THROWS_AS(index.get(1), osmium::not_found); REQUIRE_THROWS_AS(index.get(5), osmium::not_found); REQUIRE_THROWS_AS(index.get(100), osmium::not_found); REQUIRE_THROWS_WITH(index.get(0), "id 0 not found"); REQUIRE_THROWS_WITH(index.get(1), "id 1 not found"); } template void test_func_real(TIndex& index) { const osmium::unsigned_object_id_type id1 = 12; const osmium::unsigned_object_id_type id2 = 3; const osmium::Location loc1{1.2, 4.5}; const osmium::Location loc2{3.5, -7.2}; index.set(id1, loc1); index.set(id2, loc2); index.sort(); REQUIRE(loc1 == index.get(id1)); REQUIRE(loc2 == index.get(id2)); REQUIRE_THROWS_AS(index.get(0), osmium::not_found); REQUIRE_THROWS_AS(index.get(1), osmium::not_found); REQUIRE_THROWS_AS(index.get(5), osmium::not_found); REQUIRE_THROWS_AS(index.get(100), osmium::not_found); index.clear(); REQUIRE_THROWS_AS(index.get(id1), osmium::not_found); REQUIRE_THROWS_AS(index.get(id2), osmium::not_found); REQUIRE_THROWS_AS(index.get(0), osmium::not_found); REQUIRE_THROWS_AS(index.get(1), osmium::not_found); REQUIRE_THROWS_AS(index.get(5), osmium::not_found); REQUIRE_THROWS_AS(index.get(100), osmium::not_found); } TEST_CASE("Map Id to location: Dummy") { using index_type = osmium::index::map::Dummy; index_type index1; REQUIRE(0 == index1.size()); REQUIRE(0 == index1.used_memory()); test_func_all(index1); REQUIRE(0 == index1.size()); REQUIRE(0 == index1.used_memory()); } TEST_CASE("Map Id to location: DenseMemArray") { using index_type = osmium::index::map::DenseMemArray; index_type index1; index1.reserve(1000); test_func_all(index1); index_type index2; index2.reserve(1000); test_func_real(index2); } #ifdef __linux__ TEST_CASE("Map Id to location: DenseMmapArray") { using index_type = osmium::index::map::DenseMmapArray; index_type index1; test_func_all(index1); index_type index2; test_func_real(index2); } #else # pragma message("not running 'DenseMapMmap' test case on this machine") #endif TEST_CASE("Map Id to location: DenseFileArray") { using index_type = osmium::index::map::DenseFileArray; index_type index1; test_func_all(index1); index_type index2; test_func_real(index2); } #ifdef OSMIUM_WITH_SPARSEHASH TEST_CASE("Map Id to location: SparseMemTable") { using index_type = osmium::index::map::SparseMemTable; index_type index1; test_func_all(index1); index_type index2; test_func_real(index2); } #endif TEST_CASE("Map Id to location: SparseMemMap") { using index_type = osmium::index::map::SparseMemMap; index_type index1; test_func_all(index1); index_type index2; test_func_real(index2); } TEST_CASE("Map Id to location: SparseMemArray") { using index_type = osmium::index::map::SparseMemArray; index_type index1; REQUIRE(0 == index1.size()); REQUIRE(0 == index1.used_memory()); test_func_all(index1); REQUIRE(2 == index1.size()); index_type index2; test_func_real(index2); } TEST_CASE("Map Id to location: Dynamic map choice") { using map_type = osmium::index::map::Map; const auto& map_factory = osmium::index::MapFactory::instance(); const std::vector map_type_names = map_factory.map_types(); REQUIRE(map_type_names.size() >= 5); REQUIRE_THROWS_AS(map_factory.create_map(""), osmium::map_factory_error); REQUIRE_THROWS_AS(map_factory.create_map("does not exist"), osmium::map_factory_error); REQUIRE_THROWS_WITH(map_factory.create_map(""), "Need non-empty map type name"); REQUIRE_THROWS_WITH(map_factory.create_map("does not exist"), "Support for map type 'does not exist' not compiled into this binary"); for (const auto& map_type_name : map_type_names) { std::unique_ptr index1 = map_factory.create_map(map_type_name); index1->reserve(1000); test_func_all(*index1); std::unique_ptr index2 = map_factory.create_map(map_type_name); index2->reserve(1000); test_func_real(*index2); } }