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