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