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