1 #include "catch.hpp" 2 3 #include <osmium/index/detail/tmpfile.hpp> 4 #include <osmium/index/map/dense_file_array.hpp> 5 #include <osmium/index/map/sparse_file_array.hpp> 6 #include <osmium/index/node_locations_map.hpp> 7 #include <osmium/osm/location.hpp> 8 #include <osmium/osm/types.hpp> 9 #include <osmium/util/file.hpp> 10 11 #include <iterator> 12 13 TEST_CASE("File based dense index") { 14 const int fd = osmium::detail::create_tmp_file(); 15 16 REQUIRE(osmium::file_size(fd) == 0); 17 18 const osmium::unsigned_object_id_type id1 = 6; 19 const osmium::unsigned_object_id_type id2 = 3; 20 const osmium::Location loc1{1.2, 4.5}; 21 const osmium::Location loc2{3.5, -7.2}; 22 23 using index_type = osmium::index::map::DenseFileArray<osmium::unsigned_object_id_type, osmium::Location>; 24 constexpr const size_t S = sizeof(index_type::element_type); 25 26 { 27 index_type index{fd}; 28 29 REQUIRE(index.size() == 0); 30 31 REQUIRE_THROWS_AS(index.get( 0), osmium::not_found); 32 REQUIRE_THROWS_AS(index.get( 1), osmium::not_found); 33 REQUIRE_THROWS_AS(index.get( 3), osmium::not_found); 34 REQUIRE_THROWS_AS(index.get( 5), osmium::not_found); 35 REQUIRE_THROWS_AS(index.get( 6), osmium::not_found); 36 REQUIRE_THROWS_AS(index.get( 7), osmium::not_found); 37 REQUIRE_THROWS_AS(index.get(100), osmium::not_found); 38 39 index.set(id1, loc1); 40 REQUIRE(index.size() == 7); 41 42 index.set(id2, loc2); 43 REQUIRE(index.size() == 7); 44 45 index.sort(); 46 47 REQUIRE(loc1 == index.get(id1)); 48 REQUIRE(loc2 == index.get(id2)); 49 50 REQUIRE_THROWS_AS(index.get( 0), osmium::not_found); 51 REQUIRE_THROWS_AS(index.get( 1), osmium::not_found); 52 REQUIRE_THROWS_AS(index.get( 5), osmium::not_found); 53 REQUIRE_THROWS_AS(index.get( 7), osmium::not_found); 54 REQUIRE_THROWS_AS(index.get(100), osmium::not_found); 55 56 REQUIRE(index.size() == 7); 57 REQUIRE(std::distance(index.cbegin(), index.cend()) == 7); 58 59 REQUIRE(osmium::file_size(fd) >= (6 * S)); 60 } 61 62 { 63 index_type index{fd}; 64 REQUIRE(osmium::file_size(fd) >= (6 * S)); 65 66 REQUIRE(index.size() == 7); 67 68 REQUIRE(loc1 == index.get(id1)); 69 REQUIRE(loc2 == index.get(id2)); 70 71 REQUIRE_THROWS_AS(index.get( 0), osmium::not_found); 72 REQUIRE_THROWS_AS(index.get( 1), osmium::not_found); 73 REQUIRE_THROWS_AS(index.get( 5), osmium::not_found); 74 REQUIRE_THROWS_AS(index.get( 7), osmium::not_found); 75 REQUIRE_THROWS_AS(index.get(100), osmium::not_found); 76 77 REQUIRE(index.size() == 7); 78 REQUIRE(std::distance(index.cbegin(), index.cend()) == 7); 79 80 const auto* it = index.cbegin(); 81 REQUIRE(*it++ == osmium::Location{}); 82 REQUIRE(*it++ == osmium::Location{}); 83 REQUIRE(*it++ == osmium::Location{}); 84 REQUIRE(*it++ == loc2); 85 REQUIRE(*it++ == osmium::Location{}); 86 REQUIRE(*it++ == osmium::Location{}); 87 REQUIRE(*it++ == loc1); 88 REQUIRE(it++ == index.cend()); 89 } 90 } 91 92 TEST_CASE("File based sparse index") { 93 const int fd = osmium::detail::create_tmp_file(); 94 95 REQUIRE(osmium::file_size(fd) == 0); 96 97 const osmium::unsigned_object_id_type id1 = 6; 98 const osmium::unsigned_object_id_type id2 = 3; 99 const osmium::Location loc1{1.2, 4.5}; 100 const osmium::Location loc2{3.5, -7.2}; 101 102 using index_type = osmium::index::map::SparseFileArray<osmium::unsigned_object_id_type, osmium::Location>; 103 constexpr const size_t S = sizeof(index_type::element_type); 104 105 { 106 index_type index{fd}; 107 108 REQUIRE(index.size() == 0); 109 110 REQUIRE_THROWS_AS(index.get( 0), osmium::not_found); 111 REQUIRE_THROWS_AS(index.get( 1), osmium::not_found); 112 REQUIRE_THROWS_AS(index.get( 3), osmium::not_found); 113 REQUIRE_THROWS_AS(index.get( 5), osmium::not_found); 114 REQUIRE_THROWS_AS(index.get( 6), osmium::not_found); 115 REQUIRE_THROWS_AS(index.get( 7), osmium::not_found); 116 REQUIRE_THROWS_AS(index.get(100), osmium::not_found); 117 118 index.set(id1, loc1); 119 REQUIRE(index.size() == 1); 120 121 index.set(id2, loc2); 122 REQUIRE(index.size() == 2); 123 124 index.sort(); 125 126 REQUIRE(loc1 == index.get(id1)); 127 REQUIRE(loc2 == index.get(id2)); 128 129 REQUIRE_THROWS_AS(index.get( 0), osmium::not_found); 130 REQUIRE_THROWS_AS(index.get( 1), osmium::not_found); 131 REQUIRE_THROWS_AS(index.get( 5), osmium::not_found); 132 REQUIRE_THROWS_AS(index.get( 7), osmium::not_found); 133 REQUIRE_THROWS_AS(index.get(100), osmium::not_found); 134 135 REQUIRE(index.size() == 2); 136 REQUIRE(std::distance(index.cbegin(), index.cend()) == 2); 137 138 REQUIRE(osmium::file_size(fd) >= (2 * S)); 139 } 140 141 { 142 index_type index{fd}; 143 REQUIRE(osmium::file_size(fd) >= (2 * S)); 144 145 REQUIRE(index.size() == 2); 146 147 REQUIRE(loc1 == index.get(id1)); 148 REQUIRE(loc2 == index.get(id2)); 149 150 REQUIRE_THROWS_AS(index.get( 0), osmium::not_found); 151 REQUIRE_THROWS_AS(index.get( 1), osmium::not_found); 152 REQUIRE_THROWS_AS(index.get( 5), osmium::not_found); 153 REQUIRE_THROWS_AS(index.get( 7), osmium::not_found); 154 REQUIRE_THROWS_AS(index.get(100), osmium::not_found); 155 156 REQUIRE(index.size() == 2); 157 REQUIRE(std::distance(index.cbegin(), index.cend()) == 2); 158 } 159 } 160 161