blob: 65cadf6243cc589fd7da3f81969ac91222f64039 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi71ff2312017-07-12 13:32:50 +00002/*
Junxiao Shicf4ac5b2018-03-28 22:46:06 +00003 * Copyright (c) 2013-2018 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080020 */
21
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080022#include "name.hpp"
23
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070024#include "boost-test.hpp"
Yingdi Yu90e23582014-11-06 14:21:04 -080025#include <unordered_map>
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070026
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080027namespace ndn {
Junxiao Shi6bf0adf2015-02-15 13:54:56 -070028namespace tests {
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080029
30BOOST_AUTO_TEST_SUITE(TestName)
31
32static const uint8_t TestName[] = {
Alexander Afanasyev4b456282014-02-13 00:34:34 -080033 0x7, 0x14, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000034 0x8, 0x5, // GenericNameComponent
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080035 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000036 0x8, 0x3, // GenericNameComponent
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080037 0x6e, 0x64, 0x6e,
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000038 0x8, 0x6, // GenericNameComponent
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080039 0x70, 0x72, 0x65, 0x66, 0x69, 0x78
40};
41
Alexander Afanasyev4b456282014-02-13 00:34:34 -080042const uint8_t Name1[] = {0x7, 0x7, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000043 0x8, 0x5, // GenericNameComponent
Alexander Afanasyev4b456282014-02-13 00:34:34 -080044 0x6c, 0x6f, 0x63, 0x61, 0x6c};
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070045
Alexander Afanasyev4b456282014-02-13 00:34:34 -080046const uint8_t Name2[] = {0x7, 0xc, // Name
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000047 0x8, 0x5, // GenericNameComponent
Alexander Afanasyev4b456282014-02-13 00:34:34 -080048 0x6c, 0x6f, 0x63, 0x61, 0x6c,
Junxiao Shi4ffbb9d2018-03-31 17:16:35 +000049 0x8, 0x3, // GenericNameComponent
Alexander Afanasyev4b456282014-02-13 00:34:34 -080050 0x6e, 0x64, 0x6e};
51
Junxiao Shi71ff2312017-07-12 13:32:50 +000052// ---- encoding, decoding ----
53
Alexander Afanasyevc2344292014-03-02 00:08:00 +000054BOOST_AUTO_TEST_CASE(Basic)
55{
56 Name name("/hello/world");
57
58 BOOST_CHECK_NO_THROW(name.at(0));
59 BOOST_CHECK_NO_THROW(name.at(1));
60 BOOST_CHECK_NO_THROW(name.at(-1));
61 BOOST_CHECK_NO_THROW(name.at(-2));
62
63 BOOST_CHECK_THROW(name.at(2), Name::Error);
64 BOOST_CHECK_THROW(name.at(-3), Name::Error);
65}
66
67BOOST_AUTO_TEST_CASE(Encode)
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080068{
69 Name name("/local/ndn/prefix");
Davide Pesaventoe78eeca2017-02-23 23:22:32 -050070 const Block& wire = name.wireEncode();
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080071
Davide Pesaventoe78eeca2017-02-23 23:22:32 -050072 // for (auto i = wire.begin(); i != wire.end(); ++i) {
73 // if (i != wire.begin())
74 // std::cout << ", ";
75 // printHex(std::cout, *i);
76 // }
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080077 // std::cout << std::endl;
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070078
Davide Pesaventoe78eeca2017-02-23 23:22:32 -050079 BOOST_CHECK_EQUAL_COLLECTIONS(TestName, TestName + sizeof(TestName),
Alexander Afanasyev29e5c3d2014-02-11 00:01:10 -080080 wire.begin(), wire.end());
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080081}
82
Alexander Afanasyevc2344292014-03-02 00:08:00 +000083BOOST_AUTO_TEST_CASE(Decode)
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -080084{
85 Block block(TestName, sizeof(TestName));
86
87 Name name(block);
88
89 BOOST_CHECK_EQUAL(name.toUri(), "/local/ndn/prefix");
90}
91
Junxiao Shi2586be42015-01-30 20:13:01 -070092BOOST_AUTO_TEST_CASE(ZeroLengthComponent)
93{
94 static const uint8_t compOctets[] {0x08, 0x00};
95 Block compBlock(compOctets, sizeof(compOctets));
96 name::Component comp;
97 BOOST_REQUIRE_NO_THROW(comp.wireDecode(compBlock));
98 BOOST_CHECK_EQUAL(comp.value_size(), 0);
99
100 static const uint8_t nameOctets[] {0x07, 0x08, 0x08, 0x01, 0x41, 0x08, 0x00, 0x08, 0x01, 0x42};
101 Block nameBlock(nameOctets, sizeof(nameOctets));
102 static const std::string nameUri("/A/.../B");
103 Name name;
104 BOOST_REQUIRE_NO_THROW(name.wireDecode(nameBlock));
105 BOOST_CHECK_EQUAL(name.toUri(), nameUri);
106 Block nameEncoded = name.wireEncode();
107 BOOST_CHECK(nameEncoded == nameBlock);
108
109 Name name2;
Alexander Afanasyev66ca2032015-12-04 13:17:02 -0800110 BOOST_REQUIRE_NO_THROW(name2 = Name(nameUri));
Alexander Afanasyevd7eacc72015-04-03 13:06:26 -0700111 BOOST_CHECK_EQUAL(name2.toUri(), nameUri);
Junxiao Shi2586be42015-01-30 20:13:01 -0700112 Block name2Encoded = name2.wireEncode();
113 BOOST_CHECK(name2Encoded == nameBlock);
114}
115
Junxiao Shi6bf0adf2015-02-15 13:54:56 -0700116BOOST_AUTO_TEST_CASE(ImplicitSha256Digest)
Alexander Afanasyev6486d522014-10-23 14:14:11 -0700117{
118 Name n;
119
Junxiao Shi6bf0adf2015-02-15 13:54:56 -0700120 static const uint8_t DIGEST[] = {0x28, 0xba, 0xd4, 0xb5, 0x27, 0x5b, 0xd3, 0x92,
121 0xdb, 0xb6, 0x70, 0xc7, 0x5c, 0xf0, 0xb6, 0x6f,
122 0x13, 0xf7, 0x94, 0x2b, 0x21, 0xe8, 0x0f, 0x55,
123 0xc0, 0xe8, 0x6b, 0x37, 0x47, 0x53, 0xa5, 0x48,
124 0x00, 0x00};
Alexander Afanasyev6486d522014-10-23 14:14:11 -0700125
126 BOOST_REQUIRE_NO_THROW(n.appendImplicitSha256Digest(DIGEST, 32));
127 BOOST_REQUIRE_NO_THROW(n.appendImplicitSha256Digest(make_shared<Buffer>(DIGEST, 32)));
128 BOOST_CHECK_EQUAL(n.get(0), n.get(1));
129
130 BOOST_REQUIRE_THROW(n.appendImplicitSha256Digest(DIGEST, 34), name::Component::Error);
131 BOOST_REQUIRE_THROW(n.appendImplicitSha256Digest(DIGEST, 30), name::Component::Error);
132
133 n.append(DIGEST, 32);
134 BOOST_CHECK_LT(n.get(0), n.get(2));
135 BOOST_CHECK_EQUAL_COLLECTIONS(n.get(0).value_begin(), n.get(0).value_end(),
136 n.get(2).value_begin(), n.get(2).value_end());
137
138 n.append(DIGEST + 1, 32);
139 BOOST_CHECK_LT(n.get(0), n.get(3));
140
141 n.append(DIGEST + 2, 32);
142 BOOST_CHECK_LT(n.get(0), n.get(4));
143
144 BOOST_CHECK_EQUAL(n.get(0).toUri(), "sha256digest="
145 "28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548");
146
147 BOOST_CHECK_EQUAL(n.get(0).isImplicitSha256Digest(), true);
148 BOOST_CHECK_EQUAL(n.get(2).isImplicitSha256Digest(), false);
149
150 BOOST_CHECK_THROW(Name("/hello/sha256digest=hmm"), name::Component::Error);
151
152 Name n2;
153 // check canonical URI encoding (lower case)
154 BOOST_CHECK_NO_THROW(n2 = Name("/hello/sha256digest="
155 "28bad4b5275bd392dbb670c75cf0b66f13f7942b21e80f55c0e86b374753a548"));
156 BOOST_CHECK_EQUAL(n.get(0), n2.get(1));
157
158 // will accept hex value in upper case too
159 BOOST_CHECK_NO_THROW(n2 = Name("/hello/sha256digest="
160 "28BAD4B5275BD392DBB670C75CF0B66F13F7942B21E80F55C0E86B374753A548"));
161 BOOST_CHECK_EQUAL(n.get(0), n2.get(1));
Alexander Afanasyev6486d522014-10-23 14:14:11 -0700162}
163
Alexander Afanasyevd7eacc72015-04-03 13:06:26 -0700164BOOST_AUTO_TEST_CASE(NameWithSpaces)
165{
166 Name name("/ hello\t/\tworld \r\n");
167
168 BOOST_CHECK_EQUAL("/hello/world", name);
169 BOOST_CHECK_THROW(Name("/hello//world"), name::Component::Error);
170}
171
Junxiao Shi71ff2312017-07-12 13:32:50 +0000172BOOST_AUTO_TEST_CASE(DeepCopy)
173{
174 Name n1("/hello/world");
175 Name n2 = n1.deepCopy();
176
177 BOOST_CHECK_EQUAL(n1, n2);
178 BOOST_CHECK_NE(&n1.wireEncode(), &n2.wireEncode());
179
180 EncodingBuffer buffer(1024, 0);
181 n1.wireEncode(buffer);
182 Name n3(buffer.block());
183
184 BOOST_CHECK_EQUAL(n1, n3);
185 BOOST_CHECK_EQUAL(n3.wireEncode().getBuffer()->size(), 1024);
186 n3 = n3.deepCopy();
187
188 BOOST_CHECK_LT(n3.wireEncode().size(), 1024);
189 BOOST_CHECK_EQUAL(n3.wireEncode().getBuffer()->size(), n3.wireEncode().size());
190}
191
192// ---- iterators ----
193
194BOOST_AUTO_TEST_CASE(ForwardIterator)
195{
196 name::Component comps[] {
197 name::Component("A"),
198 name::Component("B"),
199 name::Component("C"),
200 name::Component("D")
201 };
202
203 Name n0;
204 BOOST_CHECK_EQUAL_COLLECTIONS(n0.begin(), n0.end(), comps, comps + 0);
205
206 Name n4("/A/B/C/D");
207 BOOST_CHECK_EQUAL_COLLECTIONS(n4.begin(), n4.end(), comps, comps + 4);
208}
209
210BOOST_AUTO_TEST_CASE(ReverseIterator)
211{
212 name::Component comps[] {
213 name::Component("D"),
214 name::Component("C"),
215 name::Component("B"),
216 name::Component("A")
217 };
218
219 Name n0;
220 BOOST_CHECK_EQUAL_COLLECTIONS(n0.rbegin(), n0.rend(), comps, comps + 0);
221
222 Name n4("/A/B/C/D");
223 BOOST_CHECK_EQUAL_COLLECTIONS(n4.rbegin(), n4.rend(), comps, comps + 4);
224}
225
226// ---- modifiers ----
227
Joao Pereira6f7cfd02015-06-15 11:36:26 -0400228BOOST_AUTO_TEST_CASE(Append)
229{
230 PartialName toAppend("/and");
231 PartialName toAppend1("/beyond");
232 {
233 Name name("/hello/world");
234 BOOST_CHECK_EQUAL("/hello/world/hello/world", name.append(name));
235 BOOST_CHECK_EQUAL("/hello/world/hello/world", name);
236 }
237 {
238 Name name("/hello/world");
239 BOOST_CHECK_EQUAL("/hello/world/and", name.append(toAppend));
240 }
241 {
242 Name name("/hello/world");
243 BOOST_CHECK_EQUAL("/hello/world/and/beyond", name.append(toAppend).append(toAppend1));
244 }
Ashlesh Gawande7dffab62017-12-21 16:40:53 -0600245
246 {
247 std::vector<uint8_t> vec{1, 1, 2, 3};
248 Name name("/hello");
249 BOOST_CHECK_EQUAL("/hello/%01%01%02%03", name.append(vec.begin(), vec.end()));
250 }
Joao Pereira6f7cfd02015-06-15 11:36:26 -0400251}
252
Junxiao Shi71ff2312017-07-12 13:32:50 +0000253BOOST_AUTO_TEST_CASE(AppendsAndMultiEncode)
254{
255 Name name("/local");
256 BOOST_CHECK_EQUAL_COLLECTIONS(name.wireEncode().begin(), name.wireEncode().end(),
257 Name1, Name1 + sizeof(Name1));
258
259 name.append("ndn");
260 BOOST_CHECK_EQUAL_COLLECTIONS(name.wireEncode().begin(), name.wireEncode().end(),
261 Name2, Name2 + sizeof(Name2));
262
263 name.append("prefix");
264 BOOST_CHECK_EQUAL_COLLECTIONS(name.wireEncode().begin(), name.wireEncode().end(),
265 TestName, TestName+sizeof(TestName));
266}
267
268BOOST_AUTO_TEST_CASE(AppendNumber)
269{
270 Name name;
271 for (uint32_t i = 0; i < 10; i++) {
272 name.appendNumber(i);
273 }
274
275 BOOST_CHECK_EQUAL(name.size(), 10);
276
277 for (uint32_t i = 0; i < 10; i++) {
278 BOOST_CHECK_EQUAL(name[i].toNumber(), i);
279 }
280}
281
282BOOST_AUTO_TEST_CASE(Markers)
283{
284 // TestNameComponent/NamingConvention provides additional coverage for these methods,
285 // including verifications of the wire format.
286
287 Name name;
288 uint64_t number;
289
290 BOOST_REQUIRE_NO_THROW(number = name.appendSegment(30923).at(-1).toSegment());
291 BOOST_CHECK_EQUAL(number, 30923);
292
293 BOOST_REQUIRE_NO_THROW(number = name.appendSegmentOffset(589).at(-1).toSegmentOffset());
294 BOOST_CHECK_EQUAL(number, 589);
295
296 BOOST_REQUIRE_NO_THROW(number = name.appendVersion().at(-1).toVersion());
297
298 BOOST_REQUIRE_NO_THROW(number = name.appendVersion(25912).at(-1).toVersion());
299 BOOST_CHECK_EQUAL(number, 25912);
300
301 const time::system_clock::TimePoint tp = time::system_clock::now();
302 time::system_clock::TimePoint tp2;
303 BOOST_REQUIRE_NO_THROW(tp2 = name.appendTimestamp(tp).at(-1).toTimestamp());
304 BOOST_CHECK_LE(std::abs(time::duration_cast<time::microseconds>(tp2 - tp).count()), 1);
305
306 BOOST_REQUIRE_NO_THROW(number = name.appendSequenceNumber(11676).at(-1).toSequenceNumber());
307 BOOST_CHECK_EQUAL(number, 11676);
308}
309
310BOOST_AUTO_TEST_CASE(Clear)
311{
312 Name n("/A");
313 BOOST_CHECK_EQUAL(n.empty(), false);
314
315 n.clear();
316 BOOST_CHECK_EQUAL(n.empty(), true);
317 BOOST_CHECK_EQUAL(n.size(), 0);
318}
319
320// ---- algorithms ----
321
322BOOST_AUTO_TEST_CASE(GetSuccessor)
323{
324 BOOST_CHECK_EQUAL(Name("ndn:/%00%01/%01%02").getSuccessor(), Name("ndn:/%00%01/%01%03"));
325 BOOST_CHECK_EQUAL(Name("ndn:/%00%01/%01%FF").getSuccessor(), Name("ndn:/%00%01/%02%00"));
326 BOOST_CHECK_EQUAL(Name("ndn:/%00%01/%FF%FF").getSuccessor(), Name("ndn:/%00%01/%00%00%00"));
327 BOOST_CHECK_EQUAL(Name().getSuccessor(), Name("ndn:/%00"));
328}
329
330BOOST_AUTO_TEST_CASE(Compare)
331{
332 BOOST_CHECK_EQUAL(Name("/A") .compare(Name("/A")), 0);
333 BOOST_CHECK_LT (Name("/A") .compare(Name("/B")), 0);
334 BOOST_CHECK_GT (Name("/B") .compare(Name("/A")), 0);
335 BOOST_CHECK_LT (Name("/A") .compare(Name("/AA")), 0);
336 BOOST_CHECK_GT (Name("/AA") .compare(Name("/A")), 0);
337 BOOST_CHECK_LT (Name("/A") .compare(Name("/A/C")), 0);
338 BOOST_CHECK_GT (Name("/A/C").compare(Name("/A")), 0);
339
340 BOOST_CHECK_EQUAL(Name("/Z/A/Y") .compare(1, 1, Name("/A")), 0);
341 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/B")), 0);
342 BOOST_CHECK_GT (Name("/Z/B/Y") .compare(1, 1, Name("/A")), 0);
343 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/AA")), 0);
344 BOOST_CHECK_GT (Name("/Z/AA/Y") .compare(1, 1, Name("/A")), 0);
345 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/A/C")), 0);
346 BOOST_CHECK_GT (Name("/Z/A/C/Y").compare(1, 2, Name("/A")), 0);
347
348 BOOST_CHECK_EQUAL(Name("/Z/A") .compare(1, Name::npos, Name("/A")), 0);
349 BOOST_CHECK_LT (Name("/Z/A") .compare(1, Name::npos, Name("/B")), 0);
350 BOOST_CHECK_GT (Name("/Z/B") .compare(1, Name::npos, Name("/A")), 0);
351 BOOST_CHECK_LT (Name("/Z/A") .compare(1, Name::npos, Name("/AA")), 0);
352 BOOST_CHECK_GT (Name("/Z/AA") .compare(1, Name::npos, Name("/A")), 0);
353 BOOST_CHECK_LT (Name("/Z/A") .compare(1, Name::npos, Name("/A/C")), 0);
354 BOOST_CHECK_GT (Name("/Z/A/C").compare(1, Name::npos, Name("/A")), 0);
355
356 BOOST_CHECK_EQUAL(Name("/Z/A/Y") .compare(1, 1, Name("/X/A/W"), 1, 1), 0);
357 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/X/B/W"), 1, 1), 0);
358 BOOST_CHECK_GT (Name("/Z/B/Y") .compare(1, 1, Name("/X/A/W"), 1, 1), 0);
359 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/X/AA/W"), 1, 1), 0);
360 BOOST_CHECK_GT (Name("/Z/AA/Y") .compare(1, 1, Name("/X/A/W"), 1, 1), 0);
361 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/X/A/C/W"), 1, 2), 0);
362 BOOST_CHECK_GT (Name("/Z/A/C/Y").compare(1, 2, Name("/X/A/W"), 1, 1), 0);
363
364 BOOST_CHECK_EQUAL(Name("/Z/A/Y") .compare(1, 1, Name("/X/A"), 1), 0);
365 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/X/B"), 1), 0);
366 BOOST_CHECK_GT (Name("/Z/B/Y") .compare(1, 1, Name("/X/A"), 1), 0);
367 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/X/AA"), 1), 0);
368 BOOST_CHECK_GT (Name("/Z/AA/Y") .compare(1, 1, Name("/X/A"), 1), 0);
369 BOOST_CHECK_LT (Name("/Z/A/Y") .compare(1, 1, Name("/X/A/C"), 1), 0);
370 BOOST_CHECK_GT (Name("/Z/A/C/Y").compare(1, 2, Name("/X/A"), 1), 0);
371}
372
Joao Pereira6f7cfd02015-06-15 11:36:26 -0400373BOOST_AUTO_TEST_CASE(SubName)
374{
375 Name name("/hello/world");
376
377 BOOST_CHECK_EQUAL("/hello/world", name.getSubName(0));
378 BOOST_CHECK_EQUAL("/world", name.getSubName(1));
379 BOOST_CHECK_EQUAL("/hello/", name.getSubName(0, 1));
380}
381
382BOOST_AUTO_TEST_CASE(SubNameNegativeIndex)
383{
384 Name name("/first/second/third/last");
385
386 BOOST_CHECK_EQUAL("/last", name.getSubName(-1));
387 BOOST_CHECK_EQUAL("/third/last", name.getSubName(-2));
388 BOOST_CHECK_EQUAL("/second", name.getSubName(-3, 1));
389}
390
391BOOST_AUTO_TEST_CASE(SubNameOutOfRangeIndexes)
392{
393 Name name("/first/second/last");
394 // No length
395 BOOST_CHECK_EQUAL("/first/second/last", name.getSubName(-10));
396 BOOST_CHECK_EQUAL("/", name.getSubName(10));
397
398 // Starting after the max position
399 BOOST_CHECK_EQUAL("/", name.getSubName(10, 1));
400 BOOST_CHECK_EQUAL("/", name.getSubName(10, 10));
401
402 // Not enough components
403 BOOST_CHECK_EQUAL("/second/last", name.getSubName(1, 10));
404 BOOST_CHECK_EQUAL("/last", name.getSubName(-1, 10));
405
406 // Start before first
407 BOOST_CHECK_EQUAL("/first/second", name.getSubName(-10, 2));
408 BOOST_CHECK_EQUAL("/first/second/last", name.getSubName(-10, 10));
409}
Alexander Afanasyevd7eacc72015-04-03 13:06:26 -0700410
Junxiao Shi71ff2312017-07-12 13:32:50 +0000411BOOST_AUTO_TEST_CASE(UnorderedMap)
Alexander Afanasyev4f512fb2016-05-18 10:47:53 -0700412{
Junxiao Shi71ff2312017-07-12 13:32:50 +0000413 std::unordered_map<Name, int> map;
414 Name name1("/1");
415 Name name2("/2");
416 Name name3("/3");
417 map[name1] = 1;
418 map[name2] = 2;
419 map[name3] = 3;
Alexander Afanasyev4f512fb2016-05-18 10:47:53 -0700420
Junxiao Shi71ff2312017-07-12 13:32:50 +0000421 BOOST_CHECK_EQUAL(map[name1], 1);
422 BOOST_CHECK_EQUAL(map[name2], 2);
423 BOOST_CHECK_EQUAL(map[name3], 3);
Alexander Afanasyev4f512fb2016-05-18 10:47:53 -0700424}
425
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100426BOOST_AUTO_TEST_SUITE_END() // TestName
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -0800427
Junxiao Shi6bf0adf2015-02-15 13:54:56 -0700428} // namespace tests
Alexander Afanasyev52eb20d2014-02-06 18:25:54 -0800429} // namespace ndn