Branch data Line data Source code
1 : : /* Copyright 2006-2009 Savarese Software Research Corporation
2 : : *
3 : : * Licensed under the Apache License, Version 2.0 (the "License");
4 : : * you may not use this file except in compliance with the License.
5 : : * You may obtain a copy of the License at
6 : : *
7 : : * https://www.savarese.com/software/ApacheLicense-2.0
8 : : *
9 : : * Unless required by applicable law or agreed to in writing, software
10 : : * distributed under the License is distributed on an "AS IS" BASIS,
11 : : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 : : * See the License for the specific language governing permissions and
13 : : * limitations under the License.
14 : : */
15 : :
16 : : #include <ssrc/wispers/utility/PropertiesToString.h>
17 : : #include <ssrc/wisp/serialization.h>
18 : :
19 : : #define BOOST_TEST_MODULE PropertiesTest
20 : : #include <boost/test/unit_test.hpp>
21 : :
22 : : using namespace NS_SSRC_WSPR_UTILITY;
23 : :
24 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_set) {
25 : 2 : Properties props;
26 : :
27 [ + - ]: 1 : props.set(1, "a");
28 [ + - ]: 1 : props.set(2, "a", "b");
29 : :
30 [ + - + - : 1 : Properties *node = props.find("a");
+ - ]
31 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
32 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 1);
+ - + - +
- + - + -
+ - - + ]
33 : :
34 [ + - ]: 1 : int *v = node->get_ptr<int>();
35 : :
36 [ + - + - : 1 : BOOST_CHECK(v != 0);
+ - + - +
- + - + -
- + ]
37 [ + - + - : 1 : BOOST_CHECK_EQUAL(*v, 1);
+ - + - +
- - + ]
38 : :
39 [ + - ]: 1 : unsigned int *uv = node->get_ptr<unsigned int>();
40 : :
41 [ + - + - : 1 : BOOST_CHECK(uv == 0);
+ - + - +
- + - + -
- + ]
42 : :
43 [ + - + - : 1 : node = props.find("a", "b");
+ - ]
44 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
45 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 2);
+ - + - +
- + - + -
+ - - + ]
46 : :
47 [ + - + - : 1 : node = props.find("c", "d");
+ - ]
48 [ + - + - : 1 : BOOST_CHECK(node == 0);
+ - + - +
- + - + -
- + ]
49 : :
50 [ + - ]: 1 : props.set(3, "c", "d", "e");
51 : :
52 [ + - + - : 1 : node = props.find("c", "d", "e");
+ - ]
53 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
54 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 3);
+ - + - +
- + - + -
+ - - + ]
55 : :
56 [ + - + - : 1 : node = props.find("c", "d");
+ - ]
57 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
58 [ + - + - : 1 : BOOST_CHECK(node->value() == 0);
+ - + - +
- + - + -
- + ]
59 : :
60 [ + - ]: 1 : props.set(4, "c", "d");
61 : :
62 [ + - + - : 1 : BOOST_CHECK(node->value() != 0);
+ - + - +
- + - + -
- + ]
63 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 4);
+ - + - +
- + - + -
+ - - + ]
64 : :
65 [ + - + - : 1 : node->set_value(5);
+ - ]
66 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 5);
+ - + - +
- + - + -
+ - - + ]
67 : 1 : }
68 : :
69 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_erase) {
70 : 2 : Properties props;
71 : :
72 [ + - ]: 1 : props.set(1, "a");
73 [ + - ]: 1 : props.set(2, "a", "b");
74 [ + - ]: 1 : props.set(5, "c", "d", "e");
75 : :
76 [ + - + - : 1 : Properties *node = props.find("c", "d", "e");
+ - ]
77 : :
78 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
79 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 5);
+ - + - +
- + - + -
+ - - + ]
80 : :
81 [ + - + - : 1 : BOOST_CHECK(props.erase("c", "d", "e") == 1);
+ - + - +
- + - + -
+ - + - +
- - + ]
82 [ + - + - : 1 : BOOST_CHECK(props.find("c", "d", "e") == 0);
+ - + - +
- + - + -
+ - + - +
- - + ]
83 : :
84 [ + - + - : 1 : node = props.find("a");
+ - ]
85 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
86 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 1);
+ - + - +
- + - + -
+ - - + ]
87 : :
88 [ + - + - : 1 : node = props.find("a", "b");
+ - ]
89 [ + - + - : 1 : BOOST_CHECK(node != 0);
+ - + - +
- + - + -
- + ]
90 [ + - + - : 1 : BOOST_CHECK(node->get<int>() == 2);
+ - + - +
- + - + -
+ - - + ]
91 : :
92 [ + - + - : 1 : BOOST_CHECK(props.erase("a") == 1);
+ - + - +
- + - + -
+ - + - +
- - + ]
93 [ + - + - : 1 : BOOST_CHECK(props.find("a") == 0);
+ - + - +
- + - + -
+ - + - +
- - + ]
94 [ + - + - : 1 : BOOST_CHECK(props.find("a", "b") == 0);
+ - + - +
- + - + -
+ - + - +
- - + ]
95 : :
96 [ + - + - : 1 : BOOST_CHECK(props.erase("a", "b") == 0);
+ - + - +
- + - + -
+ - + - +
- - + ]
97 : 1 : }
98 : :
99 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_get) {
100 : 2 : Properties props;
101 : :
102 [ + - ]: 1 : props.set(10u, "a");
103 [ + - + - : 1 : BOOST_CHECK(props.get<unsigned int>(0, "a") == 10);
+ - + - +
- + - + -
+ - - + ]
104 [ + - + - : 1 : BOOST_CHECK(props.get<int>(0, "a") == 0);
+ - + - +
- + - + -
+ - - + ]
105 [ + - + - : 1 : BOOST_CHECK(props.get<unsigned int>(9, "b") == 9);
+ - + - +
- + - + -
+ - - + ]
106 : :
107 [ + - ]: 1 : unsigned int *uv = props.get_ptr<unsigned int>("a");
108 : :
109 [ + - + - : 1 : BOOST_CHECK(uv != 0);
+ - + - +
- + - + -
- + ]
110 [ + - + - : 1 : BOOST_CHECK(*uv == 10);
+ - + - +
- + - + -
- + ]
111 : :
112 [ + - ]: 1 : int *iv = props.get_ptr<int>("b");
113 : :
114 [ + - + - : 1 : BOOST_CHECK(iv == 0);
+ - + - +
- + - + -
- + ]
115 : :
116 : : // Test const char * to string.
117 [ + - ]: 1 : props.set("foo", "c", "d");
118 [ + - + - : 1 : BOOST_CHECK(props.get<string>("", "c", "d") == "foo");
+ - + - +
- + - + -
+ - + - +
- + - -
+ ]
119 : : // Test set double.
120 [ + - ]: 1 : props.set(3.3f, "d", "e");
121 [ + - + - : 1 : BOOST_CHECK(props.get<double>(1.0, "d", "e") == 3.3f);
+ - + - +
- + - + -
+ - - + ]
122 : 1 : }
123 : :
124 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_va_set) {
125 : 2 : Properties props;
126 [ + - + - : 2 : string a("a"), b("b"), c("c");
+ - + - +
- + - ]
127 : :
128 [ + - ]: 1 : props.va_set(10u, &a, &b, &c, static_cast<string *>(0));
129 [ + - + - : 1 : BOOST_CHECK(props.get<unsigned int>(0, "a", "b", "c") == 10u);
+ - + - +
- + - + -
+ - - + ]
130 : 1 : }
131 : :
132 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_va_find) {
133 : 2 : Properties props;
134 [ + - + - : 2 : string a("a"), b("b");
+ - + - ]
135 : 1 : const string * null = static_cast<string *>(0);
136 : :
137 [ + - ]: 1 : props.set(10u, "a");
138 : :
139 [ + - ]: 1 : Properties *tree = props.va_find(&a, null);
140 : :
141 [ + - + - : 1 : BOOST_CHECK(tree != 0);
+ - + - +
- + - + -
- + ]
142 [ + - + - : 1 : BOOST_CHECK(tree->get<unsigned int>() == 10u);
+ - + - +
- + - + -
+ - - + ]
143 : :
144 [ + - ]: 1 : tree = props.va_find(&b, null);
145 : :
146 [ + - + - : 1 : BOOST_CHECK(tree == 0);
+ - + - +
- + - + -
- + ]
147 : 1 : }
148 : :
149 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_serialize) {
150 : : using ssrc::wisp::Packer;
151 : : using ssrc::wisp::Unpacker;
152 : : using ssrc::spread::detail::ByteBuffer;
153 : :
154 : 2 : ByteBuffer buffer(4096);;
155 [ + - + - ]: 2 : Packer<boost::archive::binary_oarchive> packer;
156 [ + - + - ]: 2 : Unpacker<boost::archive::binary_iarchive> unpacker;
157 [ + - + - : 2 : Properties oprops, iprops;
+ - + - ]
158 : :
159 [ + - ]: 1 : oprops.set(11u, "a", "b", "c");
160 : :
161 : : primitive_property_vector & ppv =
162 [ + - ]: 1 : oprops.create_primitive_property_vector("c", "d");
163 [ + - ]: 1 : property_vector & pv = oprops.create_property_vector("e", "f");
164 : :
165 [ + + ]: 11 : for(int i = 0; i < 10; ++i) {
166 [ + - + - ]: 10 : Properties *node = new Properties;
167 [ + - ]: 10 : node->set(i, "foo");
168 [ + - ]: 10 : pv.push_back(node);
169 [ + - + - : 10 : ppv.push_back(1);
+ - ]
170 : : }
171 : :
172 [ + - + - : 1 : BOOST_CHECK_NO_THROW(packer.pack(oprops, buffer));
+ - + - +
- + - + -
+ - - + #
# # # # #
# # # # #
# # # # #
# # ]
173 : :
174 [ + - + - : 1 : BOOST_CHECK(iprops.get<unsigned int>(4u, "a", "b", "c") == 4u);
+ - + - +
- + - + -
+ - - + ]
175 : :
176 [ + - ]: 1 : buffer.rewind();
177 : :
178 [ + - + - : 1 : BOOST_CHECK_NO_THROW(unpacker.unpack(iprops, buffer));
+ - + - +
- + - + -
+ - - + #
# # # # #
# # # # #
# # # # #
# # ]
179 : :
180 [ + - ]: 1 : oprops.set(12u, "a", "b", "c");
181 : :
182 [ + - + - : 1 : BOOST_CHECK(iprops.get<unsigned int>(2u, "a", "b", "c") == 11u);
+ - + - +
- + - + -
+ - - + ]
183 : 1 : }
184 : :
185 : : class AddProps {
186 : : mutable unsigned int _total;
187 : :
188 : : public:
189 : 1 : AddProps() : _total(0) { }
190 : :
191 : 2 : unsigned int total() const { return _total; }
192 : :
193 : : void reset() const { _total = 0; }
194 : :
195 : 5 : void enter(const std::string & key, const Properties *props,
196 : : const bool) const
197 : : {
198 [ + + ]: 5 : if(props->is_leaf()) {
199 : 2 : _total+=props->get<unsigned int>();
200 : : }
201 : 5 : }
202 : :
203 : 5 : void leave(const std::string & key, const Properties *props,
204 : : const bool) const
205 : 5 : { }
206 : : };
207 : :
208 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_visit) {
209 : 2 : Properties props;
210 : 1 : AddProps sum;
211 : :
212 [ + - ]: 1 : props.set(11u, "a", "b", "c");
213 [ + - ]: 1 : props.set(15u, "c", "d");
214 : :
215 [ + - + - : 1 : BOOST_CHECK_EQUAL(sum.total(), 0u);
+ - + - +
- - + ]
216 : :
217 [ + - ]: 1 : props.visit(sum);
218 : :
219 [ + - + - : 1 : BOOST_CHECK_EQUAL(sum.total(), 26u);
+ - + - +
- - + ]
220 : 1 : }
221 : :
222 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_equal) {
223 [ + - + - ]: 2 : Properties props1, props2;
224 : :
225 [ + - ]: 1 : props1.set(11u, "a", "b", "c");
226 [ + - ]: 1 : props1.set(15u, "c", "d");
227 : :
228 [ + - + - : 1 : BOOST_CHECK(!(props1 == props2));
+ - + - +
- + - + -
+ - - + ]
229 : :
230 [ + - ]: 1 : props2.set(11u, "a", "b", "c");
231 [ + - ]: 1 : props2.set(15u, "c", "d");
232 : :
233 [ + - + - : 1 : BOOST_CHECK(props1 == props2);
+ - + - +
- + - + -
+ - - + ]
234 : 1 : }
235 : :
236 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_merge) {
237 [ + - + - : 2 : Properties props1, props2, props3, props4, props5;
+ - + - +
- + - + -
+ - ]
238 : :
239 [ + - ]: 1 : props1.set(11u, "a", "b", "c");
240 [ + - ]: 1 : props1.set(15u, "c", "d");
241 [ + - ]: 1 : props1.set(3u, "f", "g");
242 [ + - ]: 1 : props1.set(18u, "j", "l");
243 [ + - ]: 1 : props1.set(19u, "k", "o", "m");
244 : :
245 [ + - ]: 1 : props2.set(13u, "a", "b", "e");
246 [ + - ]: 1 : props2.set(2u, "b", "e");
247 [ + - ]: 1 : props2.set(16u, "c", "d");
248 : :
249 [ + - ]: 1 : props3.set(11u, "a", "b", "c");
250 [ + - ]: 1 : props3.set(2u, "b", "e");
251 [ + - ]: 1 : props3.set(13u, "a", "b", "e");
252 [ + - ]: 1 : props3.set(16u, "c", "d");
253 [ + - ]: 1 : props3.set(3u, "f", "g");
254 [ + - ]: 1 : props3.set(18u, "j", "l");
255 [ + - ]: 1 : props3.set(19u, "k", "o", "m");
256 : :
257 [ + - + - : 1 : BOOST_CHECK(!(props4 == props2));
+ - + - +
- + - + -
+ - - + ]
258 [ + - + - : 1 : BOOST_CHECK(!(props5 == props1));
+ - + - +
- + - + -
+ - - + ]
259 : :
260 [ + - ]: 1 : props5.merge(props1);
261 [ + - ]: 1 : props4.merge(props2);
262 : :
263 [ + - + - : 1 : BOOST_CHECK(props4 == props2);
+ - + - +
- + - + -
+ - - + ]
264 [ + - + - : 1 : BOOST_CHECK(props5 == props1);
+ - + - +
- + - + -
+ - - + ]
265 : :
266 [ + - + - : 1 : BOOST_CHECK(!(props1 == props3));
+ - + - +
- + - + -
+ - - + ]
267 [ + - + - : 1 : BOOST_CHECK(!(props5 == props3));
+ - + - +
- + - + -
+ - - + ]
268 : :
269 [ + - ]: 1 : props5.merge(props2);
270 [ + - + - ]: 1 : props1.merge(std::move(props2));
271 : :
272 [ + - + - : 1 : BOOST_CHECK(props1 == props3);
+ - + - +
- + - + -
+ - - + ]
273 [ + - + - : 1 : BOOST_CHECK(props5 == props3);
+ - + - +
- + - + -
+ - - + ]
274 [ + - + - : 1 : BOOST_CHECK(props5 == props1);
+ - + - +
- + - + -
+ - - + ]
275 [ + - + - : 1 : BOOST_CHECK(!(props4 == props2));
+ - + - +
- + - + -
+ - - + ]
276 [ + - + - : 1 : BOOST_CHECK(props1.get<unsigned int>(0, "b", "e") == 2);
+ - + - +
- + - + -
+ - - + ]
277 [ + - + - : 1 : BOOST_CHECK(props5.get<unsigned int>(0, "b", "e") == 2);
+ - + - +
- + - + -
+ - - + ]
278 : 1 : }
279 : :
280 [ + - + - ]: 3 : BOOST_AUTO_TEST_CASE(test_prop_to_string) {
281 : 2 : Properties props;
282 : :
283 [ + - ]: 1 : props.set(11u, "a", "b", "c");
284 : :
285 : : primitive_property_vector & ppv =
286 [ + - ]: 1 : props.create_primitive_property_vector("c", "d");
287 [ + - ]: 1 : property_vector & pv = props.create_property_vector("e", "f");
288 : :
289 [ + + ]: 11 : for(int i = 0; i < 10; ++i) {
290 [ + - + - ]: 10 : Properties *node = new Properties;
291 [ + - ]: 10 : node->set(i, "foo");
292 [ + - ]: 10 : pv.push_back(node);
293 [ + - + - : 10 : ppv.push_back(i);
+ - ]
294 : : }
295 : :
296 [ + - ]: 1 : props.set("\"BA\nR\"F\aOO", "foo");
297 [ + - ]: 1 : props.set(true, "bool");
298 [ + - ]: 1 : props.set("bar", "01101");
299 : :
300 [ + - + - ]: 2 : const string expected("{[\"01101\"]=\"bar\",[\"a\"]={[\"b\"]={[\"c\"]=11}},[\"bool\"]=true,[\"c\"]={[\"d\"]={0,1,2,3,4,5,6,7,8,9}},[\"e\"]={[\"f\"]={{[\"foo\"]=0},{[\"foo\"]=1},{[\"foo\"]=2},{[\"foo\"]=3},{[\"foo\"]=4},{[\"foo\"]=5},{[\"foo\"]=6},{[\"foo\"]=7},{[\"foo\"]=8},{[\"foo\"]=9}}},[\"foo\"]=\"\\\"BA\\nR\\\"F\\aOO\"}");
301 : :
302 [ + - + - : 1 : BOOST_CHECK_EQUAL(to_string(props), expected);
+ - + - +
- + - + -
- + ]
303 : :
304 [ + - + - ]: 2 : const string expected_json("{\"01101\":\"bar\",\"a\":{\"b\":{\"c\":11}},\"bool\":true,\"c\":{\"d\":[0,1,2,3,4,5,6,7,8,9]},\"e\":{\"f\":[{\"foo\":0},{\"foo\":1},{\"foo\":2},{\"foo\":3},{\"foo\":4},{\"foo\":5},{\"foo\":6},{\"foo\":7},{\"foo\":8},{\"foo\":9}]},\"foo\":\"\\\"BA\\nR\\\"F\\aOO\"}");
305 : :
306 [ + - + - ]: 2 : std::ostringstream out;
307 [ + - + - ]: 2 : PropertiesToString to_json(out, PropertiesToString::ToJSON);
308 [ + - ]: 1 : to_json(props);
309 [ + - + - : 1 : BOOST_CHECK_EQUAL(out.str(), expected_json);
+ - + - +
- + - + -
- + ]
310 [ + - + - : 12 : }
+ - + - +
- + - + -
+ - + - +
- ]
|