1 #include "catch.hpp"
2 
3 #include "test_crc.hpp"
4 
5 #include <osmium/builder/attr.hpp>
6 #include <osmium/osm/changeset.hpp>
7 #include <osmium/osm/crc.hpp>
8 
9 #include <string>
10 
11 using namespace osmium::builder::attr; // NOLINT(google-build-using-namespace)
12 
13 constexpr const std::size_t test_buffer_size = 1024UL * 10UL;
14 
15 TEST_CASE("Build changeset") {
16     osmium::memory::Buffer buffer{test_buffer_size};
17 
18     osmium::builder::add_changeset(buffer,
19         _cid(42),
20         _created_at(time_t(100)),
21         _closed_at(time_t(200)),
22         _num_changes(7),
23         _num_comments(3),
24         _uid(9),
25         _user("user"),
26         _tag("comment", "foo")
27     );
28 
29     const osmium::Changeset& cs1 = buffer.get<osmium::Changeset>(0);
30 
31     REQUIRE(42 == cs1.id());
32     REQUIRE(9 == cs1.uid());
33     REQUIRE(7 == cs1.num_changes());
34     REQUIRE(3 == cs1.num_comments());
35     REQUIRE(cs1.closed());
36     REQUIRE(osmium::Timestamp{100} == cs1.created_at());
37     REQUIRE(osmium::Timestamp{200} == cs1.closed_at());
38     REQUIRE(1 == cs1.tags().size());
39     REQUIRE(std::string("user") == cs1.user());
40 
41     osmium::CRC<crc_type> crc32;
42     crc32.update(cs1);
43     REQUIRE(crc32().checksum() == 0x502e8c0e);
44 
45     const auto pos = osmium::builder::add_changeset(buffer,
46         _cid(43),
47         _created_at(time_t(120)),
48         _num_changes(21),
49         _num_comments(0),
50         _uid(9),
51         _user("user"),
52         _tag("comment", "foo"),
53         _tag("foo", "bar"),
54         _comment({time_t(300), 10, "user2", "foo"}),
55         _comments({{time_t(400), 9, "user", "bar"}})
56     );
57 
58     const osmium::Changeset& cs2 = buffer.get<osmium::Changeset>(pos);
59 
60     REQUIRE(43 == cs2.id());
61     REQUIRE(9 == cs2.uid());
62     REQUIRE(21 == cs2.num_changes());
63     REQUIRE(0 == cs2.num_comments());
64     REQUIRE_FALSE(cs2.closed());
65     REQUIRE(osmium::Timestamp{120} == cs2.created_at());
66     REQUIRE(osmium::Timestamp{} == cs2.closed_at());
67     REQUIRE(2 == cs2.tags().size());
68     REQUIRE(std::string("user") == cs2.user());
69 
70     REQUIRE(cs1 != cs2);
71 
72     REQUIRE(cs1 < cs2);
73     REQUIRE(cs1 <= cs2);
74     REQUIRE_FALSE(cs1 > cs2);
75     REQUIRE_FALSE(cs1 >= cs2);
76 
77     auto cit = cs2.discussion().begin();
78 
79     REQUIRE(cit != cs2.discussion().end());
80     REQUIRE(cit->date() == osmium::Timestamp{300});
81     REQUIRE(cit->uid() == 10);
82     REQUIRE(std::string("user2") == cit->user());
83     REQUIRE(std::string("foo") == cit->text());
84 
85     REQUIRE(++cit != cs2.discussion().end());
86     REQUIRE(cit->date() == osmium::Timestamp{400});
87     REQUIRE(cit->uid() == 9);
88     REQUIRE(std::string("user") == cit->user());
89     REQUIRE(std::string("bar") == cit->text());
90 
91     REQUIRE(++cit == cs2.discussion().end());
92 }
93 
94 TEST_CASE("Create changeset without helper") {
95     osmium::memory::Buffer buffer{test_buffer_size};
96     {
97         osmium::builder::ChangesetBuilder builder{buffer};
98 
99         builder.set_id(42)
100             .set_created_at(100)
101             .set_closed_at(200)
102             .set_num_changes(7)
103             .set_num_comments(2)
104             .set_uid(9)
105             .set_user("user");
106 
107         {
108             osmium::builder::TagListBuilder tl_builder{builder};
109             tl_builder.add_tag("key1", "val1");
110             tl_builder.add_tag("key2", "val2");
111         }
112 
113         osmium::builder::ChangesetDiscussionBuilder disc_builder{builder};
114         disc_builder.add_comment(osmium::Timestamp{300}, 10, "user2");
115         disc_builder.add_comment_text("foo");
116         disc_builder.add_comment(osmium::Timestamp{400}, 9, "user");
117         disc_builder.add_comment_text("bar");
118     }
119 
120     const auto& cs = buffer.get<osmium::Changeset>(buffer.commit());
121 
122     REQUIRE(42 == cs.id());
123     REQUIRE(9 == cs.uid());
124     REQUIRE(7 == cs.num_changes());
125     REQUIRE(2 == cs.num_comments());
126     REQUIRE(cs.closed());
127     REQUIRE(osmium::Timestamp{100} == cs.created_at());
128     REQUIRE(osmium::Timestamp{200} == cs.closed_at());
129     REQUIRE(2 == cs.tags().size());
130     REQUIRE(std::string("user") == cs.user());
131 
132     auto cit = cs.discussion().begin();
133 
134     REQUIRE(cit != cs.discussion().end());
135     REQUIRE(cit->date() == osmium::Timestamp{300});
136     REQUIRE(cit->uid() == 10);
137     REQUIRE(std::string("user2") == cit->user());
138     REQUIRE(std::string("foo") == cit->text());
139 
140     REQUIRE(++cit != cs.discussion().end());
141     REQUIRE(cit->date() == osmium::Timestamp{400});
142     REQUIRE(cit->uid() == 9);
143     REQUIRE(std::string("user") == cit->user());
144     REQUIRE(std::string("bar") == cit->text());
145 
146     REQUIRE(++cit == cs.discussion().end());
147 }
148 
149 TEST_CASE("Change changeset") {
150     osmium::memory::Buffer buffer{test_buffer_size};
151 
152     osmium::builder::add_changeset(buffer,
153         _cid(42),
154         _created_at(time_t(100)),
155         _closed_at(time_t(200)),
156         _num_changes(7),
157         _num_comments(3),
158         _uid(9),
159         _user("user"),
160         _tag("comment", "foo")
161     );
162 
163     auto& cs = buffer.get<osmium::Changeset>(0);
164 
165     cs.set_id(12);
166     cs.set_created_at(time_t(200));
167     cs.set_closed_at(time_t(300));
168     cs.set_num_changes(3);
169     cs.set_num_comments(4);
170     cs.set_uid(10);
171     cs.clear_user();
172 
173     REQUIRE(12 == cs.id());
174     REQUIRE(10 == cs.uid());
175     REQUIRE(3 == cs.num_changes());
176     REQUIRE(4 == cs.num_comments());
177     REQUIRE(cs.closed());
178     REQUIRE(osmium::Timestamp{200} == cs.created_at());
179     REQUIRE(osmium::Timestamp{300} == cs.closed_at());
180     REQUIRE(1 == cs.tags().size());
181     REQUIRE(std::string("") == cs.user());
182     REQUIRE(cs.tags().size() == 1);
183 
184     auto it = cs.tags().begin();
185     REQUIRE(it->key() == std::string{"comment"});
186     REQUIRE(it->value() == std::string{"foo"});
187     ++it;
188     REQUIRE(it == cs.tags().end());
189 }
190 
191