1 #include "catch.hpp"
2 
3 #include <osmium/builder/osm_object_builder.hpp>
4 #include <osmium/osm/node.hpp>
5 
6 #include <iterator>
7 
8 struct CallbackClass {
9 
10     int count = 0;
11 
moving_in_bufferCallbackClass12     void moving_in_buffer(size_t old_offset, size_t new_offset) {
13         REQUIRE(old_offset > new_offset);
14         ++count;
15     }
16 
17 }; // struct CallbackClass
18 
19 TEST_CASE("Purge data from empty buffer") {
20     constexpr const size_t buffer_size = 10000;
21     osmium::memory::Buffer buffer{buffer_size};
22 
23     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
24 
25     CallbackClass callback;
26     buffer.purge_removed(&callback);
27 
28     REQUIRE(callback.count == 0);
29     REQUIRE(buffer.committed() == 0);
30 }
31 
32 TEST_CASE("Purge buffer with one object but nothing to delete") {
33     constexpr const size_t buffer_size = 10000;
34     osmium::memory::Buffer buffer{buffer_size};
35 
36     {
37         osmium::builder::NodeBuilder node_builder{buffer};
38         node_builder.set_user("testuser");
39     }
40     buffer.commit();
41     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
42     const size_t committed = buffer.committed();
43 
44     CallbackClass callback;
45     buffer.purge_removed(&callback);
46 
47     REQUIRE(callback.count == 0);
48     REQUIRE(committed == buffer.committed());
49     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
50 }
51 
52 TEST_CASE("Purge buffer with one object which gets deleted") {
53     constexpr const size_t buffer_size = 10000;
54     osmium::memory::Buffer buffer{buffer_size};
55 
56     {
57         osmium::builder::NodeBuilder node_builder{buffer};
58         node_builder.set_user("testuser");
59         node_builder.set_removed(true);
60     }
61     buffer.commit();
62     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
63 
64     CallbackClass callback;
65     buffer.purge_removed(&callback);
66 
67     REQUIRE(callback.count == 0);
68     REQUIRE(buffer.committed() == 0);
69     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
70 }
71 
72 TEST_CASE("Purge buffer without callback") {
73     constexpr const size_t buffer_size = 10000;
74     osmium::memory::Buffer buffer{buffer_size};
75 
76     {
77         osmium::builder::NodeBuilder node_builder{buffer};
78         node_builder.set_user("testuser");
79         node_builder.set_removed(true);
80     }
81     buffer.commit();
82     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
83 
84     buffer.purge_removed();
85     REQUIRE(buffer.committed() == 0);
86     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
87 }
88 
89 TEST_CASE("Purge buffer with two objects, first gets deleted") {
90     constexpr const size_t buffer_size = 10000;
91     osmium::memory::Buffer buffer{buffer_size};
92 
93     {
94         osmium::builder::NodeBuilder node_builder{buffer};
95         node_builder.set_user("testuser");
96         node_builder.set_removed(true);
97     }
98     buffer.commit();
99     const size_t size1 = buffer.committed();
100     {
101         osmium::builder::NodeBuilder node_builder{buffer};
102         node_builder.set_user("testuser");
103     }
104     buffer.commit();
105     const size_t size2 = buffer.committed() - size1;
106     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 2);
107 
108     CallbackClass callback;
109     buffer.purge_removed(&callback);
110 
111     REQUIRE(callback.count == 1);
112     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
113     REQUIRE(buffer.committed() == size2);
114 }
115 
116 TEST_CASE("Purge buffer with two objects, second gets deleted") {
117     constexpr const size_t buffer_size = 10000;
118     osmium::memory::Buffer buffer{buffer_size};
119 
120     {
121         osmium::builder::NodeBuilder node_builder{buffer};
122         node_builder.set_user("testuser_longer_name");
123     }
124     buffer.commit();
125     const size_t size1 = buffer.committed();
126     {
127         osmium::builder::NodeBuilder node_builder{buffer};
128         node_builder.set_user("testuser");
129         node_builder.set_removed(true);
130     }
131     buffer.commit();
132 
133     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 2);
134 
135     CallbackClass callback;
136     buffer.purge_removed(&callback);
137 
138     REQUIRE(callback.count == 0);
139     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
140     REQUIRE(buffer.committed() == size1);
141 }
142 
143 TEST_CASE("Purge buffer with three objects, middle one gets deleted") {
144     constexpr const size_t buffer_size = 10000;
145     osmium::memory::Buffer buffer{buffer_size};
146 
147     {
148         osmium::builder::NodeBuilder node_builder{buffer};
149         node_builder.set_user("testuser_longer_name");
150     }
151     buffer.commit();
152 
153     {
154         osmium::builder::NodeBuilder node_builder{buffer};
155         node_builder.set_user("testuser");
156         node_builder.set_removed(true);
157     }
158     buffer.commit();
159 
160     {
161         osmium::builder::NodeBuilder node_builder{buffer};
162         node_builder.set_user("sn");
163     }
164     buffer.commit();
165 
166     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
167 
168     CallbackClass callback;
169     buffer.purge_removed(&callback);
170 
171     REQUIRE(callback.count == 1);
172     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 2);
173 }
174 
175 TEST_CASE("Purge buffer with three objects, all get deleted") {
176     constexpr const size_t buffer_size = 10000;
177     osmium::memory::Buffer buffer{buffer_size};
178 
179     {
180         osmium::builder::NodeBuilder node_builder{buffer};
181         node_builder.set_user("testuser_longer_name");
182         node_builder.set_removed(true);
183     }
184     buffer.commit();
185 
186     {
187         osmium::builder::NodeBuilder node_builder{buffer};
188         node_builder.set_user("testuser");
189         node_builder.set_removed(true);
190     }
191     buffer.commit();
192 
193     {
194         osmium::builder::NodeBuilder node_builder{buffer};
195         node_builder.set_user("sn");
196         node_builder.set_removed(true);
197     }
198     buffer.commit();
199 
200     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
201 
202     CallbackClass callback;
203     buffer.purge_removed(&callback);
204 
205     REQUIRE(callback.count == 0);
206     REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
207 }
208 
209