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