1 #include "catch.hpp"
2 
3 #include <osmium/builder/attr.hpp>
4 #include <osmium/memory/buffer.hpp>
5 #include <osmium/osm/metadata_options.hpp>
6 #include <osmium/osm/object.hpp>
7 
8 #include <stdexcept>
9 
10 TEST_CASE("Metadata options: default") {
11     const osmium::metadata_options m{};
12     REQUIRE_FALSE(m.none());
13     REQUIRE(m.any());
14     REQUIRE(m.all());
15     REQUIRE(m.version());
16     REQUIRE(m.timestamp());
17     REQUIRE(m.changeset());
18     REQUIRE(m.uid());
19     REQUIRE(m.user());
20 }
21 
22 TEST_CASE("Metadata options: false") {
23     const osmium::metadata_options m{"false"};
24     REQUIRE(m.none());
25     REQUIRE_FALSE(m.any());
26     REQUIRE_FALSE(m.all());
27     REQUIRE_FALSE(m.version());
28     REQUIRE_FALSE(m.timestamp());
29     REQUIRE_FALSE(m.changeset());
30     REQUIRE_FALSE(m.uid());
31     REQUIRE_FALSE(m.user());
32 }
33 
34 TEST_CASE("Metadata options: none") {
35     const osmium::metadata_options m{"none"};
36     REQUIRE(m.none());
37     REQUIRE_FALSE(m.any());
38     REQUIRE_FALSE(m.all());
39     REQUIRE_FALSE(m.version());
40     REQUIRE_FALSE(m.timestamp());
41     REQUIRE_FALSE(m.changeset());
42     REQUIRE_FALSE(m.uid());
43     REQUIRE_FALSE(m.user());
44 }
45 
46 TEST_CASE("Metadata options: true") {
47     const osmium::metadata_options m{"true"};
48     REQUIRE_FALSE(m.none());
49     REQUIRE(m.any());
50     REQUIRE(m.all());
51     REQUIRE(m.version());
52     REQUIRE(m.timestamp());
53     REQUIRE(m.changeset());
54     REQUIRE(m.uid());
55     REQUIRE(m.user());
56 }
57 
58 TEST_CASE("Metadata options: all") {
59     const osmium::metadata_options m{"all"};
60     REQUIRE_FALSE(m.none());
61     REQUIRE(m.any());
62     REQUIRE(m.all());
63     REQUIRE(m.version());
64     REQUIRE(m.timestamp());
65     REQUIRE(m.changeset());
66     REQUIRE(m.uid());
67     REQUIRE(m.user());
68 }
69 
70 TEST_CASE("Metadata options: version,changeset") {
71     const osmium::metadata_options m{"version+changeset"};
72     REQUIRE_FALSE(m.none());
73     REQUIRE(m.any());
74     REQUIRE_FALSE(m.all());
75     REQUIRE(m.version());
76     REQUIRE_FALSE(m.timestamp());
77     REQUIRE(m.changeset());
78     REQUIRE_FALSE(m.uid());
79     REQUIRE_FALSE(m.user());
80 }
81 
82 TEST_CASE("Metadata options: timestamp,uid,user") {
83     const osmium::metadata_options m{"timestamp+uid+user"};
84     REQUIRE_FALSE(m.none());
85     REQUIRE(m.any());
86     REQUIRE_FALSE(m.all());
87     REQUIRE_FALSE(m.version());
88     REQUIRE(m.timestamp());
89     REQUIRE_FALSE(m.changeset());
90     REQUIRE(m.uid());
91     REQUIRE(m.user());
92 }
93 
94 TEST_CASE("Metadata options: fail") {
95     REQUIRE_THROWS_AS(osmium::metadata_options{"timestamp+foo"}, std::invalid_argument);
96 }
97 
98 TEST_CASE("Metdata options: constructor using OSMObject") {
99     osmium::memory::Buffer buffer{10UL * 1024UL};
100     using namespace osmium::builder::attr; // NOLINT(google-build-using-namespace)
101 
102     SECTION("only version") {
103         const osmium::OSMObject& obj = buffer.get<osmium::OSMObject>(osmium::builder::add_node(buffer,
104                 _id(1),
105                 _version(2)));
106         osmium::metadata_options options = osmium::detect_available_metadata(obj);
107         REQUIRE_FALSE(options.user());
108         REQUIRE_FALSE(options.uid());
109         REQUIRE_FALSE(options.changeset());
110         REQUIRE_FALSE(options.timestamp());
111         REQUIRE(options.version());
112     }
113 
114     SECTION("full") {
115         const osmium::OSMObject& obj = buffer.get<osmium::OSMObject>(osmium::builder::add_node(buffer,
116                 _id(1),
117                 _version(2),
118                 _timestamp("2018-01-01T23:00:00Z"),
119                 _cid(30),
120                 _uid(8),
121                 _user("foo")));
122         osmium::metadata_options options = osmium::detect_available_metadata(obj);
123         REQUIRE(options.all());
124     }
125 
126     SECTION("changeset+timestamp+version") {
127         const osmium::OSMObject& obj = buffer.get<osmium::OSMObject>(osmium::builder::add_node(buffer,
128                 _id(1),
129                 _version(2),
130                 _timestamp("2018-01-01T23:00:00Z"),
131                 _cid(30)));
132         osmium::metadata_options options = osmium::detect_available_metadata(obj);
133         REQUIRE(options.version());
134         REQUIRE(options.timestamp());
135         REQUIRE(options.changeset());
136         REQUIRE_FALSE(options.user());
137         REQUIRE_FALSE(options.uid());
138     }
139 }
140 
141 TEST_CASE("Metdata options: string representation should be valid 'version+changeset'") {
142     const osmium::metadata_options options{"version+changeset"};
143     REQUIRE(options.to_string() == "version+changeset");
144 }
145 
146 TEST_CASE("Metdata options: string representation should be valid 'version+uid+user'") {
147     const osmium::metadata_options options{"version+uid+user"};
148     REQUIRE(options.to_string() == "version+uid+user");
149 }
150 
151 TEST_CASE("Metdata options: string representation should be valid 'version+timestamp'") {
152     const osmium::metadata_options options{"version+timestamp"};
153     REQUIRE(options.to_string() == "version+timestamp");
154 }
155 
156 TEST_CASE("Metdata options: string representation should be valid 'timestamp+version (different order'") {
157     const osmium::metadata_options options{"timestamp+version"};
158     REQUIRE(options.to_string() == "version+timestamp");
159 }
160 
161 TEST_CASE("Metdata options: string representation should be valid 'none'") {
162     const osmium::metadata_options options{"none"};
163     REQUIRE(options.to_string() == "none");
164 }
165 
166 TEST_CASE("Metdata options: string representation should be valid 'all (short)'") {
167     const osmium::metadata_options options{"all"};
168     REQUIRE(options.to_string() == "all");
169 }
170 
171 TEST_CASE("Metdata options: string representation should be valid 'all (long)'") {
172     const osmium::metadata_options options{"user+uid+version+timestamp+changeset"};
173     REQUIRE(options.to_string() == "all");
174 }
175 
176