1 #include "catch.hpp"
2 
3 #include <osmium/builder/osm_object_builder.hpp>
4 #include <osmium/osm/node.hpp>
5 
6 #include <algorithm>
7 #include <iterator>
8 #include <string>
9 
check_node_1(const osmium::Node & node)10 void check_node_1(const osmium::Node& node) {
11     REQUIRE(1 == node.id());
12     REQUIRE(3 == node.version());
13     REQUIRE(node.visible());
14     REQUIRE(333 == node.changeset());
15     REQUIRE(21 == node.uid());
16     REQUIRE(123 == uint32_t(node.timestamp()));
17     REQUIRE(osmium::Location(3.5, 4.7) == node.location());
18     REQUIRE(std::string{"testuser"} == node.user());
19 
20     for (const osmium::memory::Item& item : node) {
21         REQUIRE(osmium::item_type::tag_list == item.type());
22     }
23 
24     REQUIRE(node.tags().begin() == node.tags().end());
25     REQUIRE(node.tags().empty());
26     REQUIRE(0 == std::distance(node.tags().begin(), node.tags().end()));
27 }
28 
check_node_2(const osmium::Node & node)29 void check_node_2(const osmium::Node& node) {
30     REQUIRE(2 == node.id());
31     REQUIRE(3 == node.version());
32     REQUIRE(node.visible());
33     REQUIRE(333 == node.changeset());
34     REQUIRE(21 == node.uid());
35     REQUIRE(123 == uint32_t(node.timestamp()));
36     REQUIRE(osmium::Location(3.5, 4.7) == node.location());
37     REQUIRE(std::string{"testuser"} == node.user());
38 
39     for (const osmium::memory::Item& item : node) {
40         REQUIRE(osmium::item_type::tag_list == item.type());
41     }
42 
43     REQUIRE_FALSE(node.tags().empty());
44     REQUIRE(2 == std::distance(node.tags().begin(), node.tags().end()));
45 
46     int n = 0;
47     for (const osmium::Tag& tag : node.tags()) {
48         switch (n) {
49             case 0:
50                 REQUIRE(std::string("amenity") == tag.key());
51                 REQUIRE(std::string("bank") == tag.value());
52                 break;
53             case 1:
54                 REQUIRE(std::string("name") == tag.key());
55                 REQUIRE(std::string("OSM Savings") == tag.value());
56                 break;
57             default:
58                 REQUIRE(false);
59         }
60         ++n;
61     }
62     REQUIRE(2 == n);
63 }
64 
65 TEST_CASE("Node in Buffer") {
66 
67     constexpr size_t buffer_size = 10000;
68     unsigned char data[buffer_size];
69 
70     osmium::memory::Buffer buffer{data, buffer_size, 0};
71 
72     SECTION("Add node to buffer") {
73 
74         {
75             // add node 1
76             osmium::builder::NodeBuilder node_builder{buffer};
77 
78             node_builder.set_id(1)
79                 .set_version(3)
80                 .set_visible(true)
81                 .set_changeset(333)
82                 .set_uid(21)
83                 .set_timestamp(123)
84                 .set_location(osmium::Location{3.5, 4.7})
85                 .set_user("testuser");
86         }
87 
88         buffer.commit();
89 
90         {
91             // add node 2
92             osmium::builder::NodeBuilder node_builder{buffer};
93 
94             node_builder.set_id(2)
95                 .set_version(3)
96                 .set_visible(true)
97                 .set_changeset(333)
98                 .set_uid(21)
99                 .set_timestamp(123)
100                 .set_location(osmium::Location{3.5, 4.7})
101                 .set_user("testuser");
102 
103             osmium::builder::TagListBuilder tag_builder{node_builder};
104             tag_builder.add_tag("amenity", "bank");
105             tag_builder.add_tag("name", "OSM Savings");
106         }
107 
108         buffer.commit();
109 
110         REQUIRE(2 == std::distance(buffer.begin(), buffer.end()));
111         int item_no = 0;
112         for (const osmium::memory::Item& item : buffer) {
113             REQUIRE(osmium::item_type::node == item.type());
114 
115             const auto& node = static_cast<const osmium::Node&>(item);
116 
117             switch (item_no) {
118                 case 0:
119                     check_node_1(node);
120                     break;
121                 case 1:
122                     check_node_2(node);
123                     break;
124                 default:
125                     break;
126             }
127 
128             ++item_no;
129 
130         }
131 
132     }
133 
134     SECTION("Add buffer to another one") {
135 
136         {
137             // add node 1
138             osmium::builder::NodeBuilder node_builder{buffer};
139 
140             node_builder.set_id(1)
141                 .set_version(3)
142                 .set_visible(true)
143                 .set_changeset(333)
144                 .set_uid(21)
145                 .set_timestamp(123)
146                 .set_location(osmium::Location{3.5, 4.7})
147                 .set_user("testuser");
148         }
149 
150         buffer.commit();
151 
152         osmium::memory::Buffer buffer2{buffer_size, osmium::memory::Buffer::auto_grow::yes};
153 
154         buffer2.add_buffer(buffer);
155         buffer2.commit();
156 
157         REQUIRE(buffer.committed() == buffer2.committed());
158         const osmium::Node& node = buffer2.get<osmium::Node>(0);
159         REQUIRE(node.id() == 1);
160         REQUIRE(123 == uint32_t(node.timestamp()));
161     }
162 
163     SECTION("Use back_inserter on buffer") {
164 
165         {
166             // add node 1
167             osmium::builder::NodeBuilder node_builder{buffer};
168 
169             node_builder.set_id(1)
170                 .set_version(3)
171                 .set_visible(true)
172                 .set_changeset(333)
173                 .set_uid(21)
174                 .set_timestamp(123)
175                 .set_location(osmium::Location{3.5, 4.7})
176                 .set_user("testuser");
177         }
178 
179         buffer.commit();
180 
181         osmium::memory::Buffer buffer2{buffer_size, osmium::memory::Buffer::auto_grow::yes};
182 
183         std::copy(buffer.begin(), buffer.end(), std::back_inserter(buffer2));
184 
185         REQUIRE(buffer.committed() == buffer2.committed());
186         const osmium::Node& node = buffer2.get<osmium::Node>(0);
187         REQUIRE(node.id() == 1);
188         REQUIRE(123 == uint32_t(node.timestamp()));
189     }
190 }
191 
192