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