诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2000 lines
61 KiB

  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. // Author: kenton@google.com (Kenton Varda)
  31. // Based on original Protocol Buffers design by
  32. // Sanjay Ghemawat, Jeff Dean, and others.
  33. //
  34. // TODO(kenton): Improve this unittest to bring it up to the standards of
  35. // other proto2 unittests.
  36. #include <google/protobuf/repeated_field.h>
  37. #include <algorithm>
  38. #include <limits>
  39. #include <list>
  40. #include <sstream>
  41. #include <type_traits>
  42. #include <vector>
  43. #include <google/protobuf/stubs/logging.h>
  44. #include <google/protobuf/stubs/common.h>
  45. #include <google/protobuf/unittest.pb.h>
  46. #include <google/protobuf/stubs/strutil.h>
  47. #include <gmock/gmock.h>
  48. #include <google/protobuf/testing/googletest.h>
  49. #include <gtest/gtest.h>
  50. #include <google/protobuf/stubs/stl_util.h>
  51. namespace google {
  52. namespace protobuf {
  53. namespace {
  54. using ::protobuf_unittest::TestAllTypes;
  55. using ::testing::ElementsAre;
  56. // Test operations on a small RepeatedField.
  57. TEST(RepeatedField, Small) {
  58. RepeatedField<int> field;
  59. EXPECT_TRUE(field.empty());
  60. EXPECT_EQ(field.size(), 0);
  61. field.Add(5);
  62. EXPECT_FALSE(field.empty());
  63. EXPECT_EQ(field.size(), 1);
  64. EXPECT_EQ(field.Get(0), 5);
  65. EXPECT_EQ(field.at(0), 5);
  66. field.Add(42);
  67. EXPECT_FALSE(field.empty());
  68. EXPECT_EQ(field.size(), 2);
  69. EXPECT_EQ(field.Get(0), 5);
  70. EXPECT_EQ(field.at(0), 5);
  71. EXPECT_EQ(field.Get(1), 42);
  72. EXPECT_EQ(field.at(1), 42);
  73. field.Set(1, 23);
  74. EXPECT_FALSE(field.empty());
  75. EXPECT_EQ(field.size(), 2);
  76. EXPECT_EQ(field.Get(0), 5);
  77. EXPECT_EQ(field.at(0), 5);
  78. EXPECT_EQ(field.Get(1), 23);
  79. EXPECT_EQ(field.at(1), 23);
  80. field.at(1) = 25;
  81. EXPECT_FALSE(field.empty());
  82. EXPECT_EQ(field.size(), 2);
  83. EXPECT_EQ(field.Get(0), 5);
  84. EXPECT_EQ(field.at(0), 5);
  85. EXPECT_EQ(field.Get(1), 25);
  86. EXPECT_EQ(field.at(1), 25);
  87. field.RemoveLast();
  88. EXPECT_FALSE(field.empty());
  89. EXPECT_EQ(field.size(), 1);
  90. EXPECT_EQ(field.Get(0), 5);
  91. EXPECT_EQ(field.at(0), 5);
  92. field.Clear();
  93. EXPECT_TRUE(field.empty());
  94. EXPECT_EQ(field.size(), 0);
  95. // Additional bytes are for 'struct Rep' header.
  96. int expected_usage = 4 * sizeof(int) + sizeof(Arena*);
  97. EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
  98. }
  99. // Test operations on a RepeatedField which is large enough to allocate a
  100. // separate array.
  101. TEST(RepeatedField, Large) {
  102. RepeatedField<int> field;
  103. for (int i = 0; i < 16; i++) {
  104. field.Add(i * i);
  105. }
  106. EXPECT_FALSE(field.empty());
  107. EXPECT_EQ(field.size(), 16);
  108. for (int i = 0; i < 16; i++) {
  109. EXPECT_EQ(field.Get(i), i * i);
  110. }
  111. int expected_usage = 16 * sizeof(int);
  112. EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);
  113. }
  114. // Test swapping between various types of RepeatedFields.
  115. TEST(RepeatedField, SwapSmallSmall) {
  116. RepeatedField<int> field1;
  117. RepeatedField<int> field2;
  118. field1.Add(5);
  119. field1.Add(42);
  120. EXPECT_FALSE(field1.empty());
  121. EXPECT_EQ(field1.size(), 2);
  122. EXPECT_EQ(field1.Get(0), 5);
  123. EXPECT_EQ(field1.Get(1), 42);
  124. EXPECT_TRUE(field2.empty());
  125. EXPECT_EQ(field2.size(), 0);
  126. field1.Swap(&field2);
  127. EXPECT_TRUE(field1.empty());
  128. EXPECT_EQ(field1.size(), 0);
  129. EXPECT_FALSE(field2.empty());
  130. EXPECT_EQ(field2.size(), 2);
  131. EXPECT_EQ(field2.Get(0), 5);
  132. EXPECT_EQ(field2.Get(1), 42);
  133. }
  134. TEST(RepeatedField, SwapLargeSmall) {
  135. RepeatedField<int> field1;
  136. RepeatedField<int> field2;
  137. for (int i = 0; i < 16; i++) {
  138. field1.Add(i * i);
  139. }
  140. field2.Add(5);
  141. field2.Add(42);
  142. field1.Swap(&field2);
  143. EXPECT_EQ(field1.size(), 2);
  144. EXPECT_EQ(field1.Get(0), 5);
  145. EXPECT_EQ(field1.Get(1), 42);
  146. EXPECT_EQ(field2.size(), 16);
  147. for (int i = 0; i < 16; i++) {
  148. EXPECT_EQ(field2.Get(i), i * i);
  149. }
  150. }
  151. TEST(RepeatedField, SwapLargeLarge) {
  152. RepeatedField<int> field1;
  153. RepeatedField<int> field2;
  154. field1.Add(5);
  155. field1.Add(42);
  156. for (int i = 0; i < 16; i++) {
  157. field1.Add(i);
  158. field2.Add(i * i);
  159. }
  160. field2.Swap(&field1);
  161. EXPECT_EQ(field1.size(), 16);
  162. for (int i = 0; i < 16; i++) {
  163. EXPECT_EQ(field1.Get(i), i * i);
  164. }
  165. EXPECT_EQ(field2.size(), 18);
  166. EXPECT_EQ(field2.Get(0), 5);
  167. EXPECT_EQ(field2.Get(1), 42);
  168. for (int i = 2; i < 18; i++) {
  169. EXPECT_EQ(field2.Get(i), i - 2);
  170. }
  171. }
  172. // Determines how much space was reserved by the given field by adding elements
  173. // to it until it re-allocates its space.
  174. static int ReservedSpace(RepeatedField<int>* field) {
  175. const int* ptr = field->data();
  176. do {
  177. field->Add(0);
  178. } while (field->data() == ptr);
  179. return field->size() - 1;
  180. }
  181. TEST(RepeatedField, ReserveMoreThanDouble) {
  182. // Reserve more than double the previous space in the field and expect the
  183. // field to reserve exactly the amount specified.
  184. RepeatedField<int> field;
  185. field.Reserve(20);
  186. EXPECT_LE(20, ReservedSpace(&field));
  187. }
  188. TEST(RepeatedField, ReserveLessThanDouble) {
  189. // Reserve less than double the previous space in the field and expect the
  190. // field to grow by double instead.
  191. RepeatedField<int> field;
  192. field.Reserve(20);
  193. int capacity = field.Capacity();
  194. field.Reserve(capacity * 1.5);
  195. EXPECT_LE(2 * capacity, ReservedSpace(&field));
  196. }
  197. TEST(RepeatedField, ReserveLessThanExisting) {
  198. // Reserve less than the previous space in the field and expect the
  199. // field to not re-allocate at all.
  200. RepeatedField<int> field;
  201. field.Reserve(20);
  202. const int* previous_ptr = field.data();
  203. field.Reserve(10);
  204. EXPECT_EQ(previous_ptr, field.data());
  205. EXPECT_LE(20, ReservedSpace(&field));
  206. }
  207. TEST(RepeatedField, Resize) {
  208. RepeatedField<int> field;
  209. field.Resize(2, 1);
  210. EXPECT_EQ(2, field.size());
  211. field.Resize(5, 2);
  212. EXPECT_EQ(5, field.size());
  213. field.Resize(4, 3);
  214. ASSERT_EQ(4, field.size());
  215. EXPECT_EQ(1, field.Get(0));
  216. EXPECT_EQ(1, field.Get(1));
  217. EXPECT_EQ(2, field.Get(2));
  218. EXPECT_EQ(2, field.Get(3));
  219. field.Resize(0, 4);
  220. EXPECT_TRUE(field.empty());
  221. }
  222. TEST(RepeatedField, MergeFrom) {
  223. RepeatedField<int> source, destination;
  224. source.Add(4);
  225. source.Add(5);
  226. destination.Add(1);
  227. destination.Add(2);
  228. destination.Add(3);
  229. destination.MergeFrom(source);
  230. ASSERT_EQ(5, destination.size());
  231. EXPECT_EQ(1, destination.Get(0));
  232. EXPECT_EQ(2, destination.Get(1));
  233. EXPECT_EQ(3, destination.Get(2));
  234. EXPECT_EQ(4, destination.Get(3));
  235. EXPECT_EQ(5, destination.Get(4));
  236. }
  237. TEST(RepeatedField, CopyFrom) {
  238. RepeatedField<int> source, destination;
  239. source.Add(4);
  240. source.Add(5);
  241. destination.Add(1);
  242. destination.Add(2);
  243. destination.Add(3);
  244. destination.CopyFrom(source);
  245. ASSERT_EQ(2, destination.size());
  246. EXPECT_EQ(4, destination.Get(0));
  247. EXPECT_EQ(5, destination.Get(1));
  248. }
  249. TEST(RepeatedField, CopyFromSelf) {
  250. RepeatedField<int> me;
  251. me.Add(3);
  252. me.CopyFrom(me);
  253. ASSERT_EQ(1, me.size());
  254. EXPECT_EQ(3, me.Get(0));
  255. }
  256. TEST(RepeatedField, Erase) {
  257. RepeatedField<int> me;
  258. RepeatedField<int>::iterator it = me.erase(me.begin(), me.end());
  259. EXPECT_TRUE(me.begin() == it);
  260. EXPECT_EQ(0, me.size());
  261. me.Add(1);
  262. me.Add(2);
  263. me.Add(3);
  264. it = me.erase(me.begin(), me.end());
  265. EXPECT_TRUE(me.begin() == it);
  266. EXPECT_EQ(0, me.size());
  267. me.Add(4);
  268. me.Add(5);
  269. me.Add(6);
  270. it = me.erase(me.begin() + 2, me.end());
  271. EXPECT_TRUE(me.begin() + 2 == it);
  272. EXPECT_EQ(2, me.size());
  273. EXPECT_EQ(4, me.Get(0));
  274. EXPECT_EQ(5, me.Get(1));
  275. me.Add(6);
  276. me.Add(7);
  277. me.Add(8);
  278. it = me.erase(me.begin() + 1, me.begin() + 3);
  279. EXPECT_TRUE(me.begin() + 1 == it);
  280. EXPECT_EQ(3, me.size());
  281. EXPECT_EQ(4, me.Get(0));
  282. EXPECT_EQ(7, me.Get(1));
  283. EXPECT_EQ(8, me.Get(2));
  284. }
  285. // Add contents of empty container to an empty field.
  286. TEST(RepeatedField, AddRange1) {
  287. RepeatedField<int> me;
  288. std::vector<int> values;
  289. me.Add(values.begin(), values.end());
  290. ASSERT_EQ(me.size(), 0);
  291. }
  292. // Add contents of container with one thing to an empty field.
  293. TEST(RepeatedField, AddRange2) {
  294. RepeatedField<int> me;
  295. std::vector<int> values;
  296. values.push_back(-1);
  297. me.Add(values.begin(), values.end());
  298. ASSERT_EQ(me.size(), 1);
  299. ASSERT_EQ(me.Get(0), values[0]);
  300. }
  301. // Add contents of container with more than one thing to an empty field.
  302. TEST(RepeatedField, AddRange3) {
  303. RepeatedField<int> me;
  304. std::vector<int> values;
  305. values.push_back(0);
  306. values.push_back(1);
  307. me.Add(values.begin(), values.end());
  308. ASSERT_EQ(me.size(), 2);
  309. ASSERT_EQ(me.Get(0), values[0]);
  310. ASSERT_EQ(me.Get(1), values[1]);
  311. }
  312. // Add contents of container with more than one thing to a non-empty field.
  313. TEST(RepeatedField, AddRange4) {
  314. RepeatedField<int> me;
  315. me.Add(0);
  316. me.Add(1);
  317. std::vector<int> values;
  318. values.push_back(2);
  319. values.push_back(3);
  320. me.Add(values.begin(), values.end());
  321. ASSERT_EQ(me.size(), 4);
  322. ASSERT_EQ(me.Get(0), 0);
  323. ASSERT_EQ(me.Get(1), 1);
  324. ASSERT_EQ(me.Get(2), values[0]);
  325. ASSERT_EQ(me.Get(3), values[1]);
  326. }
  327. // Add contents of a stringstream in order to test code paths where there is
  328. // an input iterator.
  329. TEST(RepeatedField, AddRange5) {
  330. RepeatedField<int> me;
  331. std::stringstream ss;
  332. ss << 1 << ' ' << 2;
  333. me.Add(std::istream_iterator<int>(ss), std::istream_iterator<int>());
  334. ASSERT_EQ(me.size(), 2);
  335. ASSERT_EQ(me.Get(0), 1);
  336. ASSERT_EQ(me.Get(1), 2);
  337. }
  338. TEST(RepeatedField, CopyConstruct) {
  339. RepeatedField<int> source;
  340. source.Add(1);
  341. source.Add(2);
  342. RepeatedField<int> destination(source);
  343. ASSERT_EQ(2, destination.size());
  344. EXPECT_EQ(1, destination.Get(0));
  345. EXPECT_EQ(2, destination.Get(1));
  346. }
  347. TEST(RepeatedField, IteratorConstruct) {
  348. std::vector<int> values;
  349. RepeatedField<int> empty(values.begin(), values.end());
  350. ASSERT_EQ(values.size(), empty.size());
  351. values.push_back(1);
  352. values.push_back(2);
  353. RepeatedField<int> field(values.begin(), values.end());
  354. ASSERT_EQ(values.size(), field.size());
  355. EXPECT_EQ(values[0], field.Get(0));
  356. EXPECT_EQ(values[1], field.Get(1));
  357. RepeatedField<int> other(field.begin(), field.end());
  358. ASSERT_EQ(values.size(), other.size());
  359. EXPECT_EQ(values[0], other.Get(0));
  360. EXPECT_EQ(values[1], other.Get(1));
  361. }
  362. TEST(RepeatedField, CopyAssign) {
  363. RepeatedField<int> source, destination;
  364. source.Add(4);
  365. source.Add(5);
  366. destination.Add(1);
  367. destination.Add(2);
  368. destination.Add(3);
  369. destination = source;
  370. ASSERT_EQ(2, destination.size());
  371. EXPECT_EQ(4, destination.Get(0));
  372. EXPECT_EQ(5, destination.Get(1));
  373. }
  374. TEST(RepeatedField, SelfAssign) {
  375. // Verify that assignment to self does not destroy data.
  376. RepeatedField<int> source, *p;
  377. p = &source;
  378. source.Add(7);
  379. source.Add(8);
  380. *p = source;
  381. ASSERT_EQ(2, source.size());
  382. EXPECT_EQ(7, source.Get(0));
  383. EXPECT_EQ(8, source.Get(1));
  384. }
  385. TEST(RepeatedField, MoveConstruct) {
  386. {
  387. RepeatedField<int> source;
  388. source.Add(1);
  389. source.Add(2);
  390. const int* data = source.data();
  391. RepeatedField<int> destination = std::move(source);
  392. EXPECT_EQ(data, destination.data());
  393. EXPECT_THAT(destination, ElementsAre(1, 2));
  394. // This property isn't guaranteed but it's useful to have a test that would
  395. // catch changes in this area.
  396. EXPECT_TRUE(source.empty());
  397. }
  398. {
  399. Arena arena;
  400. RepeatedField<int>* source =
  401. Arena::CreateMessage<RepeatedField<int>>(&arena);
  402. source->Add(1);
  403. source->Add(2);
  404. RepeatedField<int> destination = std::move(*source);
  405. EXPECT_EQ(nullptr, destination.GetArena());
  406. EXPECT_THAT(destination, ElementsAre(1, 2));
  407. // This property isn't guaranteed but it's useful to have a test that would
  408. // catch changes in this area.
  409. EXPECT_THAT(*source, ElementsAre(1, 2));
  410. }
  411. }
  412. TEST(RepeatedField, MoveAssign) {
  413. {
  414. RepeatedField<int> source;
  415. source.Add(1);
  416. source.Add(2);
  417. RepeatedField<int> destination;
  418. destination.Add(3);
  419. const int* source_data = source.data();
  420. const int* destination_data = destination.data();
  421. destination = std::move(source);
  422. EXPECT_EQ(source_data, destination.data());
  423. EXPECT_THAT(destination, ElementsAre(1, 2));
  424. // This property isn't guaranteed but it's useful to have a test that would
  425. // catch changes in this area.
  426. EXPECT_EQ(destination_data, source.data());
  427. EXPECT_THAT(source, ElementsAre(3));
  428. }
  429. {
  430. Arena arena;
  431. RepeatedField<int>* source =
  432. Arena::CreateMessage<RepeatedField<int>>(&arena);
  433. source->Add(1);
  434. source->Add(2);
  435. RepeatedField<int>* destination =
  436. Arena::CreateMessage<RepeatedField<int>>(&arena);
  437. destination->Add(3);
  438. const int* source_data = source->data();
  439. const int* destination_data = destination->data();
  440. *destination = std::move(*source);
  441. EXPECT_EQ(source_data, destination->data());
  442. EXPECT_THAT(*destination, ElementsAre(1, 2));
  443. // This property isn't guaranteed but it's useful to have a test that would
  444. // catch changes in this area.
  445. EXPECT_EQ(destination_data, source->data());
  446. EXPECT_THAT(*source, ElementsAre(3));
  447. }
  448. {
  449. Arena source_arena;
  450. RepeatedField<int>* source =
  451. Arena::CreateMessage<RepeatedField<int>>(&source_arena);
  452. source->Add(1);
  453. source->Add(2);
  454. Arena destination_arena;
  455. RepeatedField<int>* destination =
  456. Arena::CreateMessage<RepeatedField<int>>(&destination_arena);
  457. destination->Add(3);
  458. *destination = std::move(*source);
  459. EXPECT_THAT(*destination, ElementsAre(1, 2));
  460. // This property isn't guaranteed but it's useful to have a test that would
  461. // catch changes in this area.
  462. EXPECT_THAT(*source, ElementsAre(1, 2));
  463. }
  464. {
  465. Arena arena;
  466. RepeatedField<int>* source =
  467. Arena::CreateMessage<RepeatedField<int>>(&arena);
  468. source->Add(1);
  469. source->Add(2);
  470. RepeatedField<int> destination;
  471. destination.Add(3);
  472. destination = std::move(*source);
  473. EXPECT_THAT(destination, ElementsAre(1, 2));
  474. // This property isn't guaranteed but it's useful to have a test that would
  475. // catch changes in this area.
  476. EXPECT_THAT(*source, ElementsAre(1, 2));
  477. }
  478. {
  479. RepeatedField<int> source;
  480. source.Add(1);
  481. source.Add(2);
  482. Arena arena;
  483. RepeatedField<int>* destination =
  484. Arena::CreateMessage<RepeatedField<int>>(&arena);
  485. destination->Add(3);
  486. *destination = std::move(source);
  487. EXPECT_THAT(*destination, ElementsAre(1, 2));
  488. // This property isn't guaranteed but it's useful to have a test that would
  489. // catch changes in this area.
  490. EXPECT_THAT(source, ElementsAre(1, 2));
  491. }
  492. {
  493. RepeatedField<int> field;
  494. // An alias to defeat -Wself-move.
  495. RepeatedField<int>& alias = field;
  496. field.Add(1);
  497. field.Add(2);
  498. const int* data = field.data();
  499. field = std::move(alias);
  500. EXPECT_EQ(data, field.data());
  501. EXPECT_THAT(field, ElementsAre(1, 2));
  502. }
  503. {
  504. Arena arena;
  505. RepeatedField<int>* field =
  506. Arena::CreateMessage<RepeatedField<int>>(&arena);
  507. field->Add(1);
  508. field->Add(2);
  509. const int* data = field->data();
  510. *field = std::move(*field);
  511. EXPECT_EQ(data, field->data());
  512. EXPECT_THAT(*field, ElementsAre(1, 2));
  513. }
  514. }
  515. TEST(Movable, Works) {
  516. class NonMoveConstructible {
  517. public:
  518. NonMoveConstructible(NonMoveConstructible&&) = delete;
  519. NonMoveConstructible& operator=(NonMoveConstructible&&) { return *this; }
  520. };
  521. class NonMoveAssignable {
  522. public:
  523. NonMoveAssignable(NonMoveAssignable&&) {}
  524. NonMoveAssignable& operator=(NonMoveConstructible&&) = delete;
  525. };
  526. class NonMovable {
  527. public:
  528. NonMovable(NonMovable&&) = delete;
  529. NonMovable& operator=(NonMovable&&) = delete;
  530. };
  531. EXPECT_TRUE(internal::IsMovable<std::string>::value);
  532. EXPECT_FALSE(std::is_move_constructible<NonMoveConstructible>::value);
  533. EXPECT_TRUE(std::is_move_assignable<NonMoveConstructible>::value);
  534. EXPECT_FALSE(internal::IsMovable<NonMoveConstructible>::value);
  535. EXPECT_TRUE(std::is_move_constructible<NonMoveAssignable>::value);
  536. EXPECT_FALSE(std::is_move_assignable<NonMoveAssignable>::value);
  537. EXPECT_FALSE(internal::IsMovable<NonMoveAssignable>::value);
  538. EXPECT_FALSE(internal::IsMovable<NonMovable>::value);
  539. }
  540. TEST(RepeatedField, MoveAdd) {
  541. RepeatedPtrField<TestAllTypes> field;
  542. TestAllTypes test_all_types;
  543. auto* optional_nested_message =
  544. test_all_types.mutable_optional_nested_message();
  545. optional_nested_message->set_bb(42);
  546. field.Add(std::move(test_all_types));
  547. EXPECT_EQ(optional_nested_message,
  548. field.Mutable(0)->mutable_optional_nested_message());
  549. }
  550. TEST(RepeatedField, MutableDataIsMutable) {
  551. RepeatedField<int> field;
  552. field.Add(1);
  553. EXPECT_EQ(1, field.Get(0));
  554. // The fact that this line compiles would be enough, but we'll check the
  555. // value anyway.
  556. *field.mutable_data() = 2;
  557. EXPECT_EQ(2, field.Get(0));
  558. }
  559. TEST(RepeatedField, SubscriptOperators) {
  560. RepeatedField<int> field;
  561. field.Add(1);
  562. EXPECT_EQ(1, field.Get(0));
  563. EXPECT_EQ(1, field[0]);
  564. EXPECT_EQ(field.Mutable(0), &field[0]);
  565. const RepeatedField<int>& const_field = field;
  566. EXPECT_EQ(field.data(), &const_field[0]);
  567. }
  568. TEST(RepeatedField, Truncate) {
  569. RepeatedField<int> field;
  570. field.Add(12);
  571. field.Add(34);
  572. field.Add(56);
  573. field.Add(78);
  574. EXPECT_EQ(4, field.size());
  575. field.Truncate(3);
  576. EXPECT_EQ(3, field.size());
  577. field.Add(90);
  578. EXPECT_EQ(4, field.size());
  579. EXPECT_EQ(90, field.Get(3));
  580. // Truncations that don't change the size are allowed, but growing is not
  581. // allowed.
  582. field.Truncate(field.size());
  583. #ifdef PROTOBUF_HAS_DEATH_TEST
  584. EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size");
  585. #endif
  586. }
  587. TEST(RepeatedField, ExtractSubrange) {
  588. // Exhaustively test every subrange in arrays of all sizes from 0 through 9.
  589. for (int sz = 0; sz < 10; ++sz) {
  590. for (int num = 0; num <= sz; ++num) {
  591. for (int start = 0; start < sz - num; ++start) {
  592. // Create RepeatedField with sz elements having values 0 through sz-1.
  593. RepeatedField<int32> field;
  594. for (int i = 0; i < sz; ++i) field.Add(i);
  595. EXPECT_EQ(field.size(), sz);
  596. // Create a catcher array and call ExtractSubrange.
  597. int32 catcher[10];
  598. for (int i = 0; i < 10; ++i) catcher[i] = -1;
  599. field.ExtractSubrange(start, num, catcher);
  600. // Does the resulting array have the right size?
  601. EXPECT_EQ(field.size(), sz - num);
  602. // Were the removed elements extracted into the catcher array?
  603. for (int i = 0; i < num; ++i) EXPECT_EQ(catcher[i], start + i);
  604. EXPECT_EQ(catcher[num], -1);
  605. // Does the resulting array contain the right values?
  606. for (int i = 0; i < start; ++i) EXPECT_EQ(field.Get(i), i);
  607. for (int i = start; i < field.size(); ++i)
  608. EXPECT_EQ(field.Get(i), i + num);
  609. }
  610. }
  611. }
  612. }
  613. TEST(RepeatedField, ClearThenReserveMore) {
  614. // Test that Reserve properly destroys the old internal array when it's forced
  615. // to allocate a new one, even when cleared-but-not-deleted objects are
  616. // present. Use a 'string' and > 16 bytes length so that the elements are
  617. // non-POD and allocate -- the leak checker will catch any skipped destructor
  618. // calls here.
  619. RepeatedField<std::string> field;
  620. for (int i = 0; i < 32; i++) {
  621. field.Add(std::string("abcdefghijklmnopqrstuvwxyz0123456789"));
  622. }
  623. EXPECT_EQ(32, field.size());
  624. field.Clear();
  625. EXPECT_EQ(0, field.size());
  626. EXPECT_LE(32, field.Capacity());
  627. field.Reserve(1024);
  628. EXPECT_EQ(0, field.size());
  629. EXPECT_LE(1024, field.Capacity());
  630. // Finish test -- |field| should destroy the cleared-but-not-yet-destroyed
  631. // strings.
  632. }
  633. // ===================================================================
  634. // RepeatedPtrField tests. These pretty much just mirror the RepeatedField
  635. // tests above.
  636. TEST(RepeatedPtrField, Small) {
  637. RepeatedPtrField<std::string> field;
  638. EXPECT_TRUE(field.empty());
  639. EXPECT_EQ(field.size(), 0);
  640. field.Add()->assign("foo");
  641. EXPECT_FALSE(field.empty());
  642. EXPECT_EQ(field.size(), 1);
  643. EXPECT_EQ(field.Get(0), "foo");
  644. EXPECT_EQ(field.at(0), "foo");
  645. field.Add()->assign("bar");
  646. EXPECT_FALSE(field.empty());
  647. EXPECT_EQ(field.size(), 2);
  648. EXPECT_EQ(field.Get(0), "foo");
  649. EXPECT_EQ(field.at(0), "foo");
  650. EXPECT_EQ(field.Get(1), "bar");
  651. EXPECT_EQ(field.at(1), "bar");
  652. field.Mutable(1)->assign("baz");
  653. EXPECT_FALSE(field.empty());
  654. EXPECT_EQ(field.size(), 2);
  655. EXPECT_EQ(field.Get(0), "foo");
  656. EXPECT_EQ(field.at(0), "foo");
  657. EXPECT_EQ(field.Get(1), "baz");
  658. EXPECT_EQ(field.at(1), "baz");
  659. field.RemoveLast();
  660. EXPECT_FALSE(field.empty());
  661. EXPECT_EQ(field.size(), 1);
  662. EXPECT_EQ(field.Get(0), "foo");
  663. EXPECT_EQ(field.at(0), "foo");
  664. field.Clear();
  665. EXPECT_TRUE(field.empty());
  666. EXPECT_EQ(field.size(), 0);
  667. }
  668. TEST(RepeatedPtrField, Large) {
  669. RepeatedPtrField<std::string> field;
  670. for (int i = 0; i < 16; i++) {
  671. *field.Add() += 'a' + i;
  672. }
  673. EXPECT_EQ(field.size(), 16);
  674. for (int i = 0; i < 16; i++) {
  675. EXPECT_EQ(field.Get(i).size(), 1);
  676. EXPECT_EQ(field.Get(i)[0], 'a' + i);
  677. }
  678. int min_expected_usage = 16 * sizeof(std::string);
  679. EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage);
  680. }
  681. TEST(RepeatedPtrField, SwapSmallSmall) {
  682. RepeatedPtrField<std::string> field1;
  683. RepeatedPtrField<std::string> field2;
  684. EXPECT_TRUE(field1.empty());
  685. EXPECT_EQ(field1.size(), 0);
  686. EXPECT_TRUE(field2.empty());
  687. EXPECT_EQ(field2.size(), 0);
  688. field1.Add()->assign("foo");
  689. field1.Add()->assign("bar");
  690. EXPECT_FALSE(field1.empty());
  691. EXPECT_EQ(field1.size(), 2);
  692. EXPECT_EQ(field1.Get(0), "foo");
  693. EXPECT_EQ(field1.Get(1), "bar");
  694. EXPECT_TRUE(field2.empty());
  695. EXPECT_EQ(field2.size(), 0);
  696. field1.Swap(&field2);
  697. EXPECT_TRUE(field1.empty());
  698. EXPECT_EQ(field1.size(), 0);
  699. EXPECT_EQ(field2.size(), 2);
  700. EXPECT_EQ(field2.Get(0), "foo");
  701. EXPECT_EQ(field2.Get(1), "bar");
  702. }
  703. TEST(RepeatedPtrField, SwapLargeSmall) {
  704. RepeatedPtrField<std::string> field1;
  705. RepeatedPtrField<std::string> field2;
  706. field2.Add()->assign("foo");
  707. field2.Add()->assign("bar");
  708. for (int i = 0; i < 16; i++) {
  709. *field1.Add() += 'a' + i;
  710. }
  711. field1.Swap(&field2);
  712. EXPECT_EQ(field1.size(), 2);
  713. EXPECT_EQ(field1.Get(0), "foo");
  714. EXPECT_EQ(field1.Get(1), "bar");
  715. EXPECT_EQ(field2.size(), 16);
  716. for (int i = 0; i < 16; i++) {
  717. EXPECT_EQ(field2.Get(i).size(), 1);
  718. EXPECT_EQ(field2.Get(i)[0], 'a' + i);
  719. }
  720. }
  721. TEST(RepeatedPtrField, SwapLargeLarge) {
  722. RepeatedPtrField<std::string> field1;
  723. RepeatedPtrField<std::string> field2;
  724. field1.Add()->assign("foo");
  725. field1.Add()->assign("bar");
  726. for (int i = 0; i < 16; i++) {
  727. *field1.Add() += 'A' + i;
  728. *field2.Add() += 'a' + i;
  729. }
  730. field2.Swap(&field1);
  731. EXPECT_EQ(field1.size(), 16);
  732. for (int i = 0; i < 16; i++) {
  733. EXPECT_EQ(field1.Get(i).size(), 1);
  734. EXPECT_EQ(field1.Get(i)[0], 'a' + i);
  735. }
  736. EXPECT_EQ(field2.size(), 18);
  737. EXPECT_EQ(field2.Get(0), "foo");
  738. EXPECT_EQ(field2.Get(1), "bar");
  739. for (int i = 2; i < 18; i++) {
  740. EXPECT_EQ(field2.Get(i).size(), 1);
  741. EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2);
  742. }
  743. }
  744. static int ReservedSpace(RepeatedPtrField<std::string>* field) {
  745. const std::string* const* ptr = field->data();
  746. do {
  747. field->Add();
  748. } while (field->data() == ptr);
  749. return field->size() - 1;
  750. }
  751. TEST(RepeatedPtrField, ReserveMoreThanDouble) {
  752. RepeatedPtrField<std::string> field;
  753. field.Reserve(20);
  754. EXPECT_LE(20, ReservedSpace(&field));
  755. }
  756. TEST(RepeatedPtrField, ReserveLessThanDouble) {
  757. RepeatedPtrField<std::string> field;
  758. field.Reserve(20);
  759. int capacity = field.Capacity();
  760. // Grow by 1.5x
  761. field.Reserve(capacity + (capacity >> 2));
  762. EXPECT_LE(2 * capacity, ReservedSpace(&field));
  763. }
  764. TEST(RepeatedPtrField, ReserveLessThanExisting) {
  765. RepeatedPtrField<std::string> field;
  766. field.Reserve(20);
  767. const std::string* const* previous_ptr = field.data();
  768. field.Reserve(10);
  769. EXPECT_EQ(previous_ptr, field.data());
  770. EXPECT_LE(20, ReservedSpace(&field));
  771. }
  772. TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) {
  773. // Check that a bug is fixed: An earlier implementation of Reserve()
  774. // failed to copy pointers to allocated-but-cleared objects, possibly
  775. // leading to segfaults.
  776. RepeatedPtrField<std::string> field;
  777. std::string* first = field.Add();
  778. field.RemoveLast();
  779. field.Reserve(20);
  780. EXPECT_EQ(first, field.Add());
  781. }
  782. // Clearing elements is tricky with RepeatedPtrFields since the memory for
  783. // the elements is retained and reused.
  784. TEST(RepeatedPtrField, ClearedElements) {
  785. RepeatedPtrField<std::string> field;
  786. std::string* original = field.Add();
  787. *original = "foo";
  788. EXPECT_EQ(field.ClearedCount(), 0);
  789. field.RemoveLast();
  790. EXPECT_TRUE(original->empty());
  791. EXPECT_EQ(field.ClearedCount(), 1);
  792. EXPECT_EQ(field.Add(),
  793. original); // Should return same string for reuse.
  794. EXPECT_EQ(field.ReleaseLast(), original); // We take ownership.
  795. EXPECT_EQ(field.ClearedCount(), 0);
  796. EXPECT_NE(field.Add(), original); // Should NOT return the same string.
  797. EXPECT_EQ(field.ClearedCount(), 0);
  798. field.AddAllocated(original); // Give ownership back.
  799. EXPECT_EQ(field.ClearedCount(), 0);
  800. EXPECT_EQ(field.Mutable(1), original);
  801. field.Clear();
  802. EXPECT_EQ(field.ClearedCount(), 2);
  803. EXPECT_EQ(field.ReleaseCleared(), original); // Take ownership again.
  804. EXPECT_EQ(field.ClearedCount(), 1);
  805. EXPECT_NE(field.Add(), original);
  806. EXPECT_EQ(field.ClearedCount(), 0);
  807. EXPECT_NE(field.Add(), original);
  808. EXPECT_EQ(field.ClearedCount(), 0);
  809. field.AddCleared(original); // Give ownership back, but as a cleared object.
  810. EXPECT_EQ(field.ClearedCount(), 1);
  811. EXPECT_EQ(field.Add(), original);
  812. EXPECT_EQ(field.ClearedCount(), 0);
  813. }
  814. // Test all code paths in AddAllocated().
  815. TEST(RepeatedPtrField, AddAlocated) {
  816. RepeatedPtrField<std::string> field;
  817. while (field.size() < field.Capacity()) {
  818. field.Add()->assign("filler");
  819. }
  820. int index = field.size();
  821. // First branch: Field is at capacity with no cleared objects.
  822. std::string* foo = new std::string("foo");
  823. field.AddAllocated(foo);
  824. EXPECT_EQ(index + 1, field.size());
  825. EXPECT_EQ(0, field.ClearedCount());
  826. EXPECT_EQ(foo, &field.Get(index));
  827. // Last branch: Field is not at capacity and there are no cleared objects.
  828. std::string* bar = new std::string("bar");
  829. field.AddAllocated(bar);
  830. ++index;
  831. EXPECT_EQ(index + 1, field.size());
  832. EXPECT_EQ(0, field.ClearedCount());
  833. EXPECT_EQ(bar, &field.Get(index));
  834. // Third branch: Field is not at capacity and there are no cleared objects.
  835. field.RemoveLast();
  836. std::string* baz = new std::string("baz");
  837. field.AddAllocated(baz);
  838. EXPECT_EQ(index + 1, field.size());
  839. EXPECT_EQ(1, field.ClearedCount());
  840. EXPECT_EQ(baz, &field.Get(index));
  841. // Second branch: Field is at capacity but has some cleared objects.
  842. while (field.size() < field.Capacity()) {
  843. field.Add()->assign("filler2");
  844. }
  845. field.RemoveLast();
  846. index = field.size();
  847. std::string* qux = new std::string("qux");
  848. field.AddAllocated(qux);
  849. EXPECT_EQ(index + 1, field.size());
  850. // We should have discarded the cleared object.
  851. EXPECT_EQ(0, field.ClearedCount());
  852. EXPECT_EQ(qux, &field.Get(index));
  853. }
  854. TEST(RepeatedPtrField, MergeFrom) {
  855. RepeatedPtrField<std::string> source, destination;
  856. source.Add()->assign("4");
  857. source.Add()->assign("5");
  858. destination.Add()->assign("1");
  859. destination.Add()->assign("2");
  860. destination.Add()->assign("3");
  861. destination.MergeFrom(source);
  862. ASSERT_EQ(5, destination.size());
  863. EXPECT_EQ("1", destination.Get(0));
  864. EXPECT_EQ("2", destination.Get(1));
  865. EXPECT_EQ("3", destination.Get(2));
  866. EXPECT_EQ("4", destination.Get(3));
  867. EXPECT_EQ("5", destination.Get(4));
  868. }
  869. TEST(RepeatedPtrField, CopyFrom) {
  870. RepeatedPtrField<std::string> source, destination;
  871. source.Add()->assign("4");
  872. source.Add()->assign("5");
  873. destination.Add()->assign("1");
  874. destination.Add()->assign("2");
  875. destination.Add()->assign("3");
  876. destination.CopyFrom(source);
  877. ASSERT_EQ(2, destination.size());
  878. EXPECT_EQ("4", destination.Get(0));
  879. EXPECT_EQ("5", destination.Get(1));
  880. }
  881. TEST(RepeatedPtrField, CopyFromSelf) {
  882. RepeatedPtrField<std::string> me;
  883. me.Add()->assign("1");
  884. me.CopyFrom(me);
  885. ASSERT_EQ(1, me.size());
  886. EXPECT_EQ("1", me.Get(0));
  887. }
  888. TEST(RepeatedPtrField, Erase) {
  889. RepeatedPtrField<std::string> me;
  890. RepeatedPtrField<std::string>::iterator it = me.erase(me.begin(), me.end());
  891. EXPECT_TRUE(me.begin() == it);
  892. EXPECT_EQ(0, me.size());
  893. *me.Add() = "1";
  894. *me.Add() = "2";
  895. *me.Add() = "3";
  896. it = me.erase(me.begin(), me.end());
  897. EXPECT_TRUE(me.begin() == it);
  898. EXPECT_EQ(0, me.size());
  899. *me.Add() = "4";
  900. *me.Add() = "5";
  901. *me.Add() = "6";
  902. it = me.erase(me.begin() + 2, me.end());
  903. EXPECT_TRUE(me.begin() + 2 == it);
  904. EXPECT_EQ(2, me.size());
  905. EXPECT_EQ("4", me.Get(0));
  906. EXPECT_EQ("5", me.Get(1));
  907. *me.Add() = "6";
  908. *me.Add() = "7";
  909. *me.Add() = "8";
  910. it = me.erase(me.begin() + 1, me.begin() + 3);
  911. EXPECT_TRUE(me.begin() + 1 == it);
  912. EXPECT_EQ(3, me.size());
  913. EXPECT_EQ("4", me.Get(0));
  914. EXPECT_EQ("7", me.Get(1));
  915. EXPECT_EQ("8", me.Get(2));
  916. }
  917. TEST(RepeatedPtrField, CopyConstruct) {
  918. RepeatedPtrField<std::string> source;
  919. source.Add()->assign("1");
  920. source.Add()->assign("2");
  921. RepeatedPtrField<std::string> destination(source);
  922. ASSERT_EQ(2, destination.size());
  923. EXPECT_EQ("1", destination.Get(0));
  924. EXPECT_EQ("2", destination.Get(1));
  925. }
  926. TEST(RepeatedPtrField, IteratorConstruct_String) {
  927. std::vector<std::string> values;
  928. values.push_back("1");
  929. values.push_back("2");
  930. RepeatedPtrField<std::string> field(values.begin(), values.end());
  931. ASSERT_EQ(values.size(), field.size());
  932. EXPECT_EQ(values[0], field.Get(0));
  933. EXPECT_EQ(values[1], field.Get(1));
  934. RepeatedPtrField<std::string> other(field.begin(), field.end());
  935. ASSERT_EQ(values.size(), other.size());
  936. EXPECT_EQ(values[0], other.Get(0));
  937. EXPECT_EQ(values[1], other.Get(1));
  938. }
  939. TEST(RepeatedPtrField, IteratorConstruct_Proto) {
  940. typedef TestAllTypes::NestedMessage Nested;
  941. std::vector<Nested> values;
  942. values.push_back(Nested());
  943. values.back().set_bb(1);
  944. values.push_back(Nested());
  945. values.back().set_bb(2);
  946. RepeatedPtrField<Nested> field(values.begin(), values.end());
  947. ASSERT_EQ(values.size(), field.size());
  948. EXPECT_EQ(values[0].bb(), field.Get(0).bb());
  949. EXPECT_EQ(values[1].bb(), field.Get(1).bb());
  950. RepeatedPtrField<Nested> other(field.begin(), field.end());
  951. ASSERT_EQ(values.size(), other.size());
  952. EXPECT_EQ(values[0].bb(), other.Get(0).bb());
  953. EXPECT_EQ(values[1].bb(), other.Get(1).bb());
  954. }
  955. TEST(RepeatedPtrField, CopyAssign) {
  956. RepeatedPtrField<std::string> source, destination;
  957. source.Add()->assign("4");
  958. source.Add()->assign("5");
  959. destination.Add()->assign("1");
  960. destination.Add()->assign("2");
  961. destination.Add()->assign("3");
  962. destination = source;
  963. ASSERT_EQ(2, destination.size());
  964. EXPECT_EQ("4", destination.Get(0));
  965. EXPECT_EQ("5", destination.Get(1));
  966. }
  967. TEST(RepeatedPtrField, SelfAssign) {
  968. // Verify that assignment to self does not destroy data.
  969. RepeatedPtrField<std::string> source, *p;
  970. p = &source;
  971. source.Add()->assign("7");
  972. source.Add()->assign("8");
  973. *p = source;
  974. ASSERT_EQ(2, source.size());
  975. EXPECT_EQ("7", source.Get(0));
  976. EXPECT_EQ("8", source.Get(1));
  977. }
  978. TEST(RepeatedPtrField, MoveConstruct) {
  979. {
  980. RepeatedPtrField<std::string> source;
  981. *source.Add() = "1";
  982. *source.Add() = "2";
  983. const std::string* const* data = source.data();
  984. RepeatedPtrField<std::string> destination = std::move(source);
  985. EXPECT_EQ(data, destination.data());
  986. EXPECT_THAT(destination, ElementsAre("1", "2"));
  987. // This property isn't guaranteed but it's useful to have a test that would
  988. // catch changes in this area.
  989. EXPECT_TRUE(source.empty());
  990. }
  991. {
  992. Arena arena;
  993. RepeatedPtrField<std::string>* source =
  994. Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
  995. *source->Add() = "1";
  996. *source->Add() = "2";
  997. RepeatedPtrField<std::string> destination = std::move(*source);
  998. EXPECT_EQ(nullptr, destination.GetArena());
  999. EXPECT_THAT(destination, ElementsAre("1", "2"));
  1000. // This property isn't guaranteed but it's useful to have a test that would
  1001. // catch changes in this area.
  1002. EXPECT_THAT(*source, ElementsAre("1", "2"));
  1003. }
  1004. }
  1005. TEST(RepeatedPtrField, MoveAssign) {
  1006. {
  1007. RepeatedPtrField<std::string> source;
  1008. *source.Add() = "1";
  1009. *source.Add() = "2";
  1010. RepeatedPtrField<std::string> destination;
  1011. *destination.Add() = "3";
  1012. const std::string* const* source_data = source.data();
  1013. const std::string* const* destination_data = destination.data();
  1014. destination = std::move(source);
  1015. EXPECT_EQ(source_data, destination.data());
  1016. EXPECT_THAT(destination, ElementsAre("1", "2"));
  1017. // This property isn't guaranteed but it's useful to have a test that would
  1018. // catch changes in this area.
  1019. EXPECT_EQ(destination_data, source.data());
  1020. EXPECT_THAT(source, ElementsAre("3"));
  1021. }
  1022. {
  1023. Arena arena;
  1024. RepeatedPtrField<std::string>* source =
  1025. Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
  1026. *source->Add() = "1";
  1027. *source->Add() = "2";
  1028. RepeatedPtrField<std::string>* destination =
  1029. Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
  1030. *destination->Add() = "3";
  1031. const std::string* const* source_data = source->data();
  1032. const std::string* const* destination_data = destination->data();
  1033. *destination = std::move(*source);
  1034. EXPECT_EQ(source_data, destination->data());
  1035. EXPECT_THAT(*destination, ElementsAre("1", "2"));
  1036. // This property isn't guaranteed but it's useful to have a test that would
  1037. // catch changes in this area.
  1038. EXPECT_EQ(destination_data, source->data());
  1039. EXPECT_THAT(*source, ElementsAre("3"));
  1040. }
  1041. {
  1042. Arena source_arena;
  1043. RepeatedPtrField<std::string>* source =
  1044. Arena::CreateMessage<RepeatedPtrField<std::string>>(&source_arena);
  1045. *source->Add() = "1";
  1046. *source->Add() = "2";
  1047. Arena destination_arena;
  1048. RepeatedPtrField<std::string>* destination =
  1049. Arena::CreateMessage<RepeatedPtrField<std::string>>(&destination_arena);
  1050. *destination->Add() = "3";
  1051. *destination = std::move(*source);
  1052. EXPECT_THAT(*destination, ElementsAre("1", "2"));
  1053. // This property isn't guaranteed but it's useful to have a test that would
  1054. // catch changes in this area.
  1055. EXPECT_THAT(*source, ElementsAre("1", "2"));
  1056. }
  1057. {
  1058. Arena arena;
  1059. RepeatedPtrField<std::string>* source =
  1060. Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
  1061. *source->Add() = "1";
  1062. *source->Add() = "2";
  1063. RepeatedPtrField<std::string> destination;
  1064. *destination.Add() = "3";
  1065. destination = std::move(*source);
  1066. EXPECT_THAT(destination, ElementsAre("1", "2"));
  1067. // This property isn't guaranteed but it's useful to have a test that would
  1068. // catch changes in this area.
  1069. EXPECT_THAT(*source, ElementsAre("1", "2"));
  1070. }
  1071. {
  1072. RepeatedPtrField<std::string> source;
  1073. *source.Add() = "1";
  1074. *source.Add() = "2";
  1075. Arena arena;
  1076. RepeatedPtrField<std::string>* destination =
  1077. Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
  1078. *destination->Add() = "3";
  1079. *destination = std::move(source);
  1080. EXPECT_THAT(*destination, ElementsAre("1", "2"));
  1081. // This property isn't guaranteed but it's useful to have a test that would
  1082. // catch changes in this area.
  1083. EXPECT_THAT(source, ElementsAre("1", "2"));
  1084. }
  1085. {
  1086. RepeatedPtrField<std::string> field;
  1087. // An alias to defeat -Wself-move.
  1088. RepeatedPtrField<std::string>& alias = field;
  1089. *field.Add() = "1";
  1090. *field.Add() = "2";
  1091. const std::string* const* data = field.data();
  1092. field = std::move(alias);
  1093. EXPECT_EQ(data, field.data());
  1094. EXPECT_THAT(field, ElementsAre("1", "2"));
  1095. }
  1096. {
  1097. Arena arena;
  1098. RepeatedPtrField<std::string>* field =
  1099. Arena::CreateMessage<RepeatedPtrField<std::string>>(&arena);
  1100. *field->Add() = "1";
  1101. *field->Add() = "2";
  1102. const std::string* const* data = field->data();
  1103. *field = std::move(*field);
  1104. EXPECT_EQ(data, field->data());
  1105. EXPECT_THAT(*field, ElementsAre("1", "2"));
  1106. }
  1107. }
  1108. TEST(RepeatedPtrField, MutableDataIsMutable) {
  1109. RepeatedPtrField<std::string> field;
  1110. *field.Add() = "1";
  1111. EXPECT_EQ("1", field.Get(0));
  1112. // The fact that this line compiles would be enough, but we'll check the
  1113. // value anyway.
  1114. std::string** data = field.mutable_data();
  1115. **data = "2";
  1116. EXPECT_EQ("2", field.Get(0));
  1117. }
  1118. TEST(RepeatedPtrField, SubscriptOperators) {
  1119. RepeatedPtrField<std::string> field;
  1120. *field.Add() = "1";
  1121. EXPECT_EQ("1", field.Get(0));
  1122. EXPECT_EQ("1", field[0]);
  1123. EXPECT_EQ(field.Mutable(0), &field[0]);
  1124. const RepeatedPtrField<std::string>& const_field = field;
  1125. EXPECT_EQ(*field.data(), &const_field[0]);
  1126. }
  1127. TEST(RepeatedPtrField, ExtractSubrange) {
  1128. // Exhaustively test every subrange in arrays of all sizes from 0 through 9
  1129. // with 0 through 3 cleared elements at the end.
  1130. for (int sz = 0; sz < 10; ++sz) {
  1131. for (int num = 0; num <= sz; ++num) {
  1132. for (int start = 0; start < sz - num; ++start) {
  1133. for (int extra = 0; extra < 4; ++extra) {
  1134. std::vector<std::string*> subject;
  1135. // Create an array with "sz" elements and "extra" cleared elements.
  1136. RepeatedPtrField<std::string> field;
  1137. for (int i = 0; i < sz + extra; ++i) {
  1138. subject.push_back(new std::string());
  1139. field.AddAllocated(subject[i]);
  1140. }
  1141. EXPECT_EQ(field.size(), sz + extra);
  1142. for (int i = 0; i < extra; ++i) field.RemoveLast();
  1143. EXPECT_EQ(field.size(), sz);
  1144. EXPECT_EQ(field.ClearedCount(), extra);
  1145. // Create a catcher array and call ExtractSubrange.
  1146. std::string* catcher[10];
  1147. for (int i = 0; i < 10; ++i) catcher[i] = NULL;
  1148. field.ExtractSubrange(start, num, catcher);
  1149. // Does the resulting array have the right size?
  1150. EXPECT_EQ(field.size(), sz - num);
  1151. // Were the removed elements extracted into the catcher array?
  1152. for (int i = 0; i < num; ++i)
  1153. EXPECT_EQ(catcher[i], subject[start + i]);
  1154. EXPECT_EQ(NULL, catcher[num]);
  1155. // Does the resulting array contain the right values?
  1156. for (int i = 0; i < start; ++i)
  1157. EXPECT_EQ(field.Mutable(i), subject[i]);
  1158. for (int i = start; i < field.size(); ++i)
  1159. EXPECT_EQ(field.Mutable(i), subject[i + num]);
  1160. // Reinstate the cleared elements.
  1161. EXPECT_EQ(field.ClearedCount(), extra);
  1162. for (int i = 0; i < extra; ++i) field.Add();
  1163. EXPECT_EQ(field.ClearedCount(), 0);
  1164. EXPECT_EQ(field.size(), sz - num + extra);
  1165. // Make sure the extra elements are all there (in some order).
  1166. for (int i = sz; i < sz + extra; ++i) {
  1167. int count = 0;
  1168. for (int j = sz; j < sz + extra; ++j) {
  1169. if (field.Mutable(j - num) == subject[i]) count += 1;
  1170. }
  1171. EXPECT_EQ(count, 1);
  1172. }
  1173. // Release the caught elements.
  1174. for (int i = 0; i < num; ++i) delete catcher[i];
  1175. }
  1176. }
  1177. }
  1178. }
  1179. }
  1180. TEST(RepeatedPtrField, DeleteSubrange) {
  1181. // DeleteSubrange is a trivial extension of ExtendSubrange.
  1182. }
  1183. // ===================================================================
  1184. // Iterator tests stolen from net/proto/proto-array_unittest.
  1185. class RepeatedFieldIteratorTest : public testing::Test {
  1186. protected:
  1187. virtual void SetUp() {
  1188. for (int i = 0; i < 3; ++i) {
  1189. proto_array_.Add(i);
  1190. }
  1191. }
  1192. RepeatedField<int> proto_array_;
  1193. };
  1194. TEST_F(RepeatedFieldIteratorTest, Convertible) {
  1195. RepeatedField<int>::iterator iter = proto_array_.begin();
  1196. RepeatedField<int>::const_iterator c_iter = iter;
  1197. RepeatedField<int>::value_type value = *c_iter;
  1198. EXPECT_EQ(0, value);
  1199. }
  1200. TEST_F(RepeatedFieldIteratorTest, MutableIteration) {
  1201. RepeatedField<int>::iterator iter = proto_array_.begin();
  1202. EXPECT_EQ(0, *iter);
  1203. ++iter;
  1204. EXPECT_EQ(1, *iter++);
  1205. EXPECT_EQ(2, *iter);
  1206. ++iter;
  1207. EXPECT_TRUE(proto_array_.end() == iter);
  1208. EXPECT_EQ(2, *(proto_array_.end() - 1));
  1209. }
  1210. TEST_F(RepeatedFieldIteratorTest, ConstIteration) {
  1211. const RepeatedField<int>& const_proto_array = proto_array_;
  1212. RepeatedField<int>::const_iterator iter = const_proto_array.begin();
  1213. EXPECT_EQ(0, *iter);
  1214. ++iter;
  1215. EXPECT_EQ(1, *iter++);
  1216. EXPECT_EQ(2, *iter);
  1217. ++iter;
  1218. EXPECT_TRUE(proto_array_.end() == iter);
  1219. EXPECT_EQ(2, *(proto_array_.end() - 1));
  1220. }
  1221. TEST_F(RepeatedFieldIteratorTest, Mutation) {
  1222. RepeatedField<int>::iterator iter = proto_array_.begin();
  1223. *iter = 7;
  1224. EXPECT_EQ(7, proto_array_.Get(0));
  1225. }
  1226. // -------------------------------------------------------------------
  1227. class RepeatedPtrFieldIteratorTest : public testing::Test {
  1228. protected:
  1229. virtual void SetUp() {
  1230. proto_array_.Add()->assign("foo");
  1231. proto_array_.Add()->assign("bar");
  1232. proto_array_.Add()->assign("baz");
  1233. }
  1234. RepeatedPtrField<std::string> proto_array_;
  1235. };
  1236. TEST_F(RepeatedPtrFieldIteratorTest, Convertible) {
  1237. RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
  1238. RepeatedPtrField<std::string>::const_iterator c_iter = iter;
  1239. RepeatedPtrField<std::string>::value_type value = *c_iter;
  1240. EXPECT_EQ("foo", value);
  1241. }
  1242. TEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) {
  1243. RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
  1244. EXPECT_EQ("foo", *iter);
  1245. ++iter;
  1246. EXPECT_EQ("bar", *(iter++));
  1247. EXPECT_EQ("baz", *iter);
  1248. ++iter;
  1249. EXPECT_TRUE(proto_array_.end() == iter);
  1250. EXPECT_EQ("baz", *(--proto_array_.end()));
  1251. }
  1252. TEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) {
  1253. const RepeatedPtrField<std::string>& const_proto_array = proto_array_;
  1254. RepeatedPtrField<std::string>::const_iterator iter =
  1255. const_proto_array.begin();
  1256. EXPECT_EQ("foo", *iter);
  1257. ++iter;
  1258. EXPECT_EQ("bar", *(iter++));
  1259. EXPECT_EQ("baz", *iter);
  1260. ++iter;
  1261. EXPECT_TRUE(const_proto_array.end() == iter);
  1262. EXPECT_EQ("baz", *(--const_proto_array.end()));
  1263. }
  1264. TEST_F(RepeatedPtrFieldIteratorTest, MutableReverseIteration) {
  1265. RepeatedPtrField<std::string>::reverse_iterator iter = proto_array_.rbegin();
  1266. EXPECT_EQ("baz", *iter);
  1267. ++iter;
  1268. EXPECT_EQ("bar", *(iter++));
  1269. EXPECT_EQ("foo", *iter);
  1270. ++iter;
  1271. EXPECT_TRUE(proto_array_.rend() == iter);
  1272. EXPECT_EQ("foo", *(--proto_array_.rend()));
  1273. }
  1274. TEST_F(RepeatedPtrFieldIteratorTest, ConstReverseIteration) {
  1275. const RepeatedPtrField<std::string>& const_proto_array = proto_array_;
  1276. RepeatedPtrField<std::string>::const_reverse_iterator iter =
  1277. const_proto_array.rbegin();
  1278. EXPECT_EQ("baz", *iter);
  1279. ++iter;
  1280. EXPECT_EQ("bar", *(iter++));
  1281. EXPECT_EQ("foo", *iter);
  1282. ++iter;
  1283. EXPECT_TRUE(const_proto_array.rend() == iter);
  1284. EXPECT_EQ("foo", *(--const_proto_array.rend()));
  1285. }
  1286. TEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) {
  1287. RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
  1288. RepeatedPtrField<std::string>::iterator iter2 = iter;
  1289. ++iter2;
  1290. ++iter2;
  1291. EXPECT_TRUE(iter + 2 == iter2);
  1292. EXPECT_TRUE(iter == iter2 - 2);
  1293. EXPECT_EQ("baz", iter[2]);
  1294. EXPECT_EQ("baz", *(iter + 2));
  1295. EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
  1296. }
  1297. TEST_F(RepeatedPtrFieldIteratorTest, Comparable) {
  1298. RepeatedPtrField<std::string>::const_iterator iter = proto_array_.begin();
  1299. RepeatedPtrField<std::string>::const_iterator iter2 = iter + 1;
  1300. EXPECT_TRUE(iter == iter);
  1301. EXPECT_TRUE(iter != iter2);
  1302. EXPECT_TRUE(iter < iter2);
  1303. EXPECT_TRUE(iter <= iter2);
  1304. EXPECT_TRUE(iter <= iter);
  1305. EXPECT_TRUE(iter2 > iter);
  1306. EXPECT_TRUE(iter2 >= iter);
  1307. EXPECT_TRUE(iter >= iter);
  1308. }
  1309. // Uninitialized iterator does not point to any of the RepeatedPtrField.
  1310. TEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) {
  1311. RepeatedPtrField<std::string>::iterator iter;
  1312. EXPECT_TRUE(iter != proto_array_.begin());
  1313. EXPECT_TRUE(iter != proto_array_.begin() + 1);
  1314. EXPECT_TRUE(iter != proto_array_.begin() + 2);
  1315. EXPECT_TRUE(iter != proto_array_.begin() + 3);
  1316. EXPECT_TRUE(iter != proto_array_.end());
  1317. }
  1318. TEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) {
  1319. proto_array_.Clear();
  1320. proto_array_.Add()->assign("a");
  1321. proto_array_.Add()->assign("c");
  1322. proto_array_.Add()->assign("d");
  1323. proto_array_.Add()->assign("n");
  1324. proto_array_.Add()->assign("p");
  1325. proto_array_.Add()->assign("x");
  1326. proto_array_.Add()->assign("y");
  1327. std::string v = "f";
  1328. RepeatedPtrField<std::string>::const_iterator it =
  1329. std::lower_bound(proto_array_.begin(), proto_array_.end(), v);
  1330. EXPECT_EQ(*it, "n");
  1331. EXPECT_TRUE(it == proto_array_.begin() + 3);
  1332. }
  1333. TEST_F(RepeatedPtrFieldIteratorTest, Mutation) {
  1334. RepeatedPtrField<std::string>::iterator iter = proto_array_.begin();
  1335. *iter = "qux";
  1336. EXPECT_EQ("qux", proto_array_.Get(0));
  1337. }
  1338. // -------------------------------------------------------------------
  1339. class RepeatedPtrFieldPtrsIteratorTest : public testing::Test {
  1340. protected:
  1341. virtual void SetUp() {
  1342. proto_array_.Add()->assign("foo");
  1343. proto_array_.Add()->assign("bar");
  1344. proto_array_.Add()->assign("baz");
  1345. const_proto_array_ = &proto_array_;
  1346. }
  1347. RepeatedPtrField<std::string> proto_array_;
  1348. const RepeatedPtrField<std::string>* const_proto_array_;
  1349. };
  1350. TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) {
  1351. RepeatedPtrField<std::string>::pointer_iterator iter =
  1352. proto_array_.pointer_begin();
  1353. static_cast<void>(iter);
  1354. }
  1355. TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertibleConstPtr) {
  1356. RepeatedPtrField<std::string>::const_pointer_iterator iter =
  1357. const_proto_array_->pointer_begin();
  1358. static_cast<void>(iter);
  1359. }
  1360. TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) {
  1361. RepeatedPtrField<std::string>::pointer_iterator iter =
  1362. proto_array_.pointer_begin();
  1363. EXPECT_EQ("foo", **iter);
  1364. ++iter;
  1365. EXPECT_EQ("bar", **(iter++));
  1366. EXPECT_EQ("baz", **iter);
  1367. ++iter;
  1368. EXPECT_TRUE(proto_array_.pointer_end() == iter);
  1369. EXPECT_EQ("baz", **(--proto_array_.pointer_end()));
  1370. }
  1371. TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutableConstPtrIteration) {
  1372. RepeatedPtrField<std::string>::const_pointer_iterator iter =
  1373. const_proto_array_->pointer_begin();
  1374. EXPECT_EQ("foo", **iter);
  1375. ++iter;
  1376. EXPECT_EQ("bar", **(iter++));
  1377. EXPECT_EQ("baz", **iter);
  1378. ++iter;
  1379. EXPECT_TRUE(const_proto_array_->pointer_end() == iter);
  1380. EXPECT_EQ("baz", **(--const_proto_array_->pointer_end()));
  1381. }
  1382. TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) {
  1383. RepeatedPtrField<std::string>::pointer_iterator iter =
  1384. proto_array_.pointer_begin();
  1385. RepeatedPtrField<std::string>::pointer_iterator iter2 = iter;
  1386. ++iter2;
  1387. ++iter2;
  1388. EXPECT_TRUE(iter + 2 == iter2);
  1389. EXPECT_TRUE(iter == iter2 - 2);
  1390. EXPECT_EQ("baz", *iter[2]);
  1391. EXPECT_EQ("baz", **(iter + 2));
  1392. EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());
  1393. }
  1394. TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomConstPtrAccess) {
  1395. RepeatedPtrField<std::string>::const_pointer_iterator iter =
  1396. const_proto_array_->pointer_begin();
  1397. RepeatedPtrField<std::string>::const_pointer_iterator iter2 = iter;
  1398. ++iter2;
  1399. ++iter2;
  1400. EXPECT_TRUE(iter + 2 == iter2);
  1401. EXPECT_TRUE(iter == iter2 - 2);
  1402. EXPECT_EQ("baz", *iter[2]);
  1403. EXPECT_EQ("baz", **(iter + 2));
  1404. EXPECT_EQ(3, const_proto_array_->end() - const_proto_array_->begin());
  1405. }
  1406. TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) {
  1407. RepeatedPtrField<std::string>::pointer_iterator iter =
  1408. proto_array_.pointer_begin();
  1409. RepeatedPtrField<std::string>::pointer_iterator iter2 = iter + 1;
  1410. EXPECT_TRUE(iter == iter);
  1411. EXPECT_TRUE(iter != iter2);
  1412. EXPECT_TRUE(iter < iter2);
  1413. EXPECT_TRUE(iter <= iter2);
  1414. EXPECT_TRUE(iter <= iter);
  1415. EXPECT_TRUE(iter2 > iter);
  1416. EXPECT_TRUE(iter2 >= iter);
  1417. EXPECT_TRUE(iter >= iter);
  1418. }
  1419. TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparableConstPtr) {
  1420. RepeatedPtrField<std::string>::const_pointer_iterator iter =
  1421. const_proto_array_->pointer_begin();
  1422. RepeatedPtrField<std::string>::const_pointer_iterator iter2 = iter + 1;
  1423. EXPECT_TRUE(iter == iter);
  1424. EXPECT_TRUE(iter != iter2);
  1425. EXPECT_TRUE(iter < iter2);
  1426. EXPECT_TRUE(iter <= iter2);
  1427. EXPECT_TRUE(iter <= iter);
  1428. EXPECT_TRUE(iter2 > iter);
  1429. EXPECT_TRUE(iter2 >= iter);
  1430. EXPECT_TRUE(iter >= iter);
  1431. }
  1432. // Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs.
  1433. // Dereferencing an uninitialized iterator crashes the process.
  1434. TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) {
  1435. RepeatedPtrField<std::string>::pointer_iterator iter;
  1436. EXPECT_TRUE(iter != proto_array_.pointer_begin());
  1437. EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1);
  1438. EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2);
  1439. EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3);
  1440. EXPECT_TRUE(iter != proto_array_.pointer_end());
  1441. }
  1442. TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedConstPtrIterator) {
  1443. RepeatedPtrField<std::string>::const_pointer_iterator iter;
  1444. EXPECT_TRUE(iter != const_proto_array_->pointer_begin());
  1445. EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 1);
  1446. EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 2);
  1447. EXPECT_TRUE(iter != const_proto_array_->pointer_begin() + 3);
  1448. EXPECT_TRUE(iter != const_proto_array_->pointer_end());
  1449. }
  1450. // This comparison functor is required by the tests for RepeatedPtrOverPtrs.
  1451. // They operate on strings and need to compare strings as strings in
  1452. // any stl algorithm, even though the iterator returns a pointer to a
  1453. // string
  1454. // - i.e. *iter has type std::string*.
  1455. struct StringLessThan {
  1456. bool operator()(const std::string* z, const std::string* y) const {
  1457. return *z < *y;
  1458. }
  1459. };
  1460. TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {
  1461. proto_array_.Clear();
  1462. proto_array_.Add()->assign("a");
  1463. proto_array_.Add()->assign("c");
  1464. proto_array_.Add()->assign("d");
  1465. proto_array_.Add()->assign("n");
  1466. proto_array_.Add()->assign("p");
  1467. proto_array_.Add()->assign("x");
  1468. proto_array_.Add()->assign("y");
  1469. {
  1470. std::string v = "f";
  1471. RepeatedPtrField<std::string>::pointer_iterator it =
  1472. std::lower_bound(proto_array_.pointer_begin(),
  1473. proto_array_.pointer_end(), &v, StringLessThan());
  1474. GOOGLE_CHECK(*it != NULL);
  1475. EXPECT_EQ(**it, "n");
  1476. EXPECT_TRUE(it == proto_array_.pointer_begin() + 3);
  1477. }
  1478. {
  1479. std::string v = "f";
  1480. RepeatedPtrField<std::string>::const_pointer_iterator it = std::lower_bound(
  1481. const_proto_array_->pointer_begin(), const_proto_array_->pointer_end(),
  1482. &v, StringLessThan());
  1483. GOOGLE_CHECK(*it != NULL);
  1484. EXPECT_EQ(**it, "n");
  1485. EXPECT_TRUE(it == const_proto_array_->pointer_begin() + 3);
  1486. }
  1487. }
  1488. TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) {
  1489. RepeatedPtrField<std::string>::pointer_iterator iter =
  1490. proto_array_.pointer_begin();
  1491. **iter = "qux";
  1492. EXPECT_EQ("qux", proto_array_.Get(0));
  1493. EXPECT_EQ("bar", proto_array_.Get(1));
  1494. EXPECT_EQ("baz", proto_array_.Get(2));
  1495. ++iter;
  1496. delete *iter;
  1497. *iter = new std::string("a");
  1498. ++iter;
  1499. delete *iter;
  1500. *iter = new std::string("b");
  1501. EXPECT_EQ("a", proto_array_.Get(1));
  1502. EXPECT_EQ("b", proto_array_.Get(2));
  1503. }
  1504. TEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) {
  1505. proto_array_.Add()->assign("c");
  1506. proto_array_.Add()->assign("d");
  1507. proto_array_.Add()->assign("n");
  1508. proto_array_.Add()->assign("p");
  1509. proto_array_.Add()->assign("a");
  1510. proto_array_.Add()->assign("y");
  1511. proto_array_.Add()->assign("x");
  1512. EXPECT_EQ("foo", proto_array_.Get(0));
  1513. EXPECT_EQ("n", proto_array_.Get(5));
  1514. EXPECT_EQ("x", proto_array_.Get(9));
  1515. std::sort(proto_array_.pointer_begin(), proto_array_.pointer_end(),
  1516. StringLessThan());
  1517. EXPECT_EQ("a", proto_array_.Get(0));
  1518. EXPECT_EQ("baz", proto_array_.Get(2));
  1519. EXPECT_EQ("y", proto_array_.Get(9));
  1520. }
  1521. // -----------------------------------------------------------------------------
  1522. // Unit-tests for the insert iterators
  1523. // google::protobuf::RepeatedFieldBackInserter,
  1524. // google::protobuf::AllocatedRepeatedPtrFieldBackInserter
  1525. // Ported from util/gtl/proto-array-iterators_unittest.
  1526. class RepeatedFieldInsertionIteratorsTest : public testing::Test {
  1527. protected:
  1528. std::list<double> halves;
  1529. std::list<int> fibonacci;
  1530. std::vector<std::string> words;
  1531. typedef TestAllTypes::NestedMessage Nested;
  1532. Nested nesteds[2];
  1533. std::vector<Nested*> nested_ptrs;
  1534. TestAllTypes protobuffer;
  1535. virtual void SetUp() {
  1536. fibonacci.push_back(1);
  1537. fibonacci.push_back(1);
  1538. fibonacci.push_back(2);
  1539. fibonacci.push_back(3);
  1540. fibonacci.push_back(5);
  1541. fibonacci.push_back(8);
  1542. std::copy(fibonacci.begin(), fibonacci.end(),
  1543. RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32()));
  1544. halves.push_back(1.0);
  1545. halves.push_back(0.5);
  1546. halves.push_back(0.25);
  1547. halves.push_back(0.125);
  1548. halves.push_back(0.0625);
  1549. std::copy(halves.begin(), halves.end(),
  1550. RepeatedFieldBackInserter(protobuffer.mutable_repeated_double()));
  1551. words.push_back("Able");
  1552. words.push_back("was");
  1553. words.push_back("I");
  1554. words.push_back("ere");
  1555. words.push_back("I");
  1556. words.push_back("saw");
  1557. words.push_back("Elba");
  1558. std::copy(words.begin(), words.end(),
  1559. RepeatedFieldBackInserter(protobuffer.mutable_repeated_string()));
  1560. nesteds[0].set_bb(17);
  1561. nesteds[1].set_bb(4711);
  1562. std::copy(&nesteds[0], &nesteds[2],
  1563. RepeatedFieldBackInserter(
  1564. protobuffer.mutable_repeated_nested_message()));
  1565. nested_ptrs.push_back(new Nested);
  1566. nested_ptrs.back()->set_bb(170);
  1567. nested_ptrs.push_back(new Nested);
  1568. nested_ptrs.back()->set_bb(47110);
  1569. std::copy(nested_ptrs.begin(), nested_ptrs.end(),
  1570. RepeatedFieldBackInserter(
  1571. protobuffer.mutable_repeated_nested_message()));
  1572. }
  1573. virtual void TearDown() {
  1574. for (auto ptr : nested_ptrs) {
  1575. delete ptr;
  1576. }
  1577. }
  1578. };
  1579. TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) {
  1580. EXPECT_TRUE(std::equal(fibonacci.begin(), fibonacci.end(),
  1581. protobuffer.repeated_int32().begin()));
  1582. EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(),
  1583. protobuffer.repeated_int32().end(),
  1584. fibonacci.begin()));
  1585. }
  1586. TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) {
  1587. EXPECT_TRUE(std::equal(halves.begin(), halves.end(),
  1588. protobuffer.repeated_double().begin()));
  1589. EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(),
  1590. protobuffer.repeated_double().end(), halves.begin()));
  1591. }
  1592. TEST_F(RepeatedFieldInsertionIteratorsTest, Words) {
  1593. ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
  1594. for (int i = 0; i < words.size(); ++i)
  1595. EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
  1596. }
  1597. TEST_F(RepeatedFieldInsertionIteratorsTest, Words2) {
  1598. words.clear();
  1599. words.push_back("sing");
  1600. words.push_back("a");
  1601. words.push_back("song");
  1602. words.push_back("of");
  1603. words.push_back("six");
  1604. words.push_back("pence");
  1605. protobuffer.mutable_repeated_string()->Clear();
  1606. std::copy(
  1607. words.begin(), words.end(),
  1608. RepeatedPtrFieldBackInserter(protobuffer.mutable_repeated_string()));
  1609. ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
  1610. for (int i = 0; i < words.size(); ++i)
  1611. EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
  1612. }
  1613. TEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) {
  1614. ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4);
  1615. EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17);
  1616. EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711);
  1617. EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170);
  1618. EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110);
  1619. }
  1620. TEST_F(RepeatedFieldInsertionIteratorsTest,
  1621. AllocatedRepeatedPtrFieldWithStringIntData) {
  1622. std::vector<Nested*> data;
  1623. TestAllTypes goldenproto;
  1624. for (int i = 0; i < 10; ++i) {
  1625. Nested* new_data = new Nested;
  1626. new_data->set_bb(i);
  1627. data.push_back(new_data);
  1628. new_data = goldenproto.add_repeated_nested_message();
  1629. new_data->set_bb(i);
  1630. }
  1631. TestAllTypes testproto;
  1632. std::copy(data.begin(), data.end(),
  1633. AllocatedRepeatedPtrFieldBackInserter(
  1634. testproto.mutable_repeated_nested_message()));
  1635. EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
  1636. }
  1637. TEST_F(RepeatedFieldInsertionIteratorsTest,
  1638. AllocatedRepeatedPtrFieldWithString) {
  1639. std::vector<std::string*> data;
  1640. TestAllTypes goldenproto;
  1641. for (int i = 0; i < 10; ++i) {
  1642. std::string* new_data = new std::string;
  1643. *new_data = "name-" + StrCat(i);
  1644. data.push_back(new_data);
  1645. new_data = goldenproto.add_repeated_string();
  1646. *new_data = "name-" + StrCat(i);
  1647. }
  1648. TestAllTypes testproto;
  1649. std::copy(data.begin(), data.end(),
  1650. AllocatedRepeatedPtrFieldBackInserter(
  1651. testproto.mutable_repeated_string()));
  1652. EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
  1653. }
  1654. TEST_F(RepeatedFieldInsertionIteratorsTest,
  1655. UnsafeArenaAllocatedRepeatedPtrFieldWithStringIntData) {
  1656. std::vector<Nested*> data;
  1657. TestAllTypes goldenproto;
  1658. for (int i = 0; i < 10; ++i) {
  1659. Nested* new_data = new Nested;
  1660. new_data->set_bb(i);
  1661. data.push_back(new_data);
  1662. new_data = goldenproto.add_repeated_nested_message();
  1663. new_data->set_bb(i);
  1664. }
  1665. TestAllTypes testproto;
  1666. std::copy(data.begin(), data.end(),
  1667. UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
  1668. testproto.mutable_repeated_nested_message()));
  1669. EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
  1670. }
  1671. TEST_F(RepeatedFieldInsertionIteratorsTest,
  1672. UnsafeArenaAllocatedRepeatedPtrFieldWithString) {
  1673. std::vector<std::string*> data;
  1674. TestAllTypes goldenproto;
  1675. for (int i = 0; i < 10; ++i) {
  1676. std::string* new_data = new std::string;
  1677. *new_data = "name-" + StrCat(i);
  1678. data.push_back(new_data);
  1679. new_data = goldenproto.add_repeated_string();
  1680. *new_data = "name-" + StrCat(i);
  1681. }
  1682. TestAllTypes testproto;
  1683. std::copy(data.begin(), data.end(),
  1684. UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
  1685. testproto.mutable_repeated_string()));
  1686. EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
  1687. }
  1688. TEST_F(RepeatedFieldInsertionIteratorsTest, MoveStrings) {
  1689. std::vector<std::string> src = {"a", "b", "c", "d"};
  1690. std::vector<std::string> copy =
  1691. src; // copy since move leaves in undefined state
  1692. TestAllTypes testproto;
  1693. std::move(copy.begin(), copy.end(),
  1694. RepeatedFieldBackInserter(testproto.mutable_repeated_string()));
  1695. ASSERT_THAT(testproto.repeated_string(), testing::ElementsAreArray(src));
  1696. }
  1697. TEST_F(RepeatedFieldInsertionIteratorsTest, MoveProtos) {
  1698. auto make_nested = [](int32 x) {
  1699. Nested ret;
  1700. ret.set_bb(x);
  1701. return ret;
  1702. };
  1703. std::vector<Nested> src = {make_nested(3), make_nested(5), make_nested(7)};
  1704. std::vector<Nested> copy = src; // copy since move leaves in undefined state
  1705. TestAllTypes testproto;
  1706. std::move(
  1707. copy.begin(), copy.end(),
  1708. RepeatedFieldBackInserter(testproto.mutable_repeated_nested_message()));
  1709. ASSERT_EQ(src.size(), testproto.repeated_nested_message_size());
  1710. for (int i = 0; i < src.size(); ++i) {
  1711. EXPECT_EQ(src[i].DebugString(),
  1712. testproto.repeated_nested_message(i).DebugString());
  1713. }
  1714. }
  1715. } // namespace
  1716. } // namespace protobuf
  1717. } // namespace google