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