诸暨麻将添加redis
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

480 rader
17 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. #include <google/protobuf/reflection_ops.h>
  34. #include <google/protobuf/test_util.h>
  35. #include <google/protobuf/unittest.pb.h>
  36. #include <google/protobuf/descriptor.h>
  37. #include <google/protobuf/stubs/logging.h>
  38. #include <google/protobuf/stubs/common.h>
  39. #include <google/protobuf/testing/googletest.h>
  40. #include <gtest/gtest.h>
  41. #include <google/protobuf/stubs/strutil.h>
  42. namespace google {
  43. namespace protobuf {
  44. namespace internal {
  45. namespace {
  46. TEST(ReflectionOpsTest, SanityCheck) {
  47. unittest::TestAllTypes message;
  48. TestUtil::SetAllFields(&message);
  49. TestUtil::ExpectAllFieldsSet(message);
  50. }
  51. TEST(ReflectionOpsTest, Copy) {
  52. unittest::TestAllTypes message, message2;
  53. TestUtil::SetAllFields(&message);
  54. ReflectionOps::Copy(message, &message2);
  55. TestUtil::ExpectAllFieldsSet(message2);
  56. // Copying from self should be a no-op.
  57. ReflectionOps::Copy(message2, &message2);
  58. TestUtil::ExpectAllFieldsSet(message2);
  59. }
  60. TEST(ReflectionOpsTest, CopyExtensions) {
  61. unittest::TestAllExtensions message, message2;
  62. TestUtil::SetAllExtensions(&message);
  63. ReflectionOps::Copy(message, &message2);
  64. TestUtil::ExpectAllExtensionsSet(message2);
  65. }
  66. TEST(ReflectionOpsTest, CopyOneof) {
  67. unittest::TestOneof2 message, message2;
  68. TestUtil::SetOneof1(&message);
  69. ReflectionOps::Copy(message, &message2);
  70. TestUtil::ExpectOneofSet1(message2);
  71. TestUtil::SetOneof2(&message);
  72. TestUtil::ExpectOneofSet2(message);
  73. ReflectionOps::Copy(message, &message2);
  74. TestUtil::ExpectOneofSet2(message2);
  75. }
  76. TEST(ReflectionOpsTest, Merge) {
  77. // Note: Copy is implemented in terms of Merge() so technically the Copy
  78. // test already tested most of this.
  79. unittest::TestAllTypes message, message2;
  80. TestUtil::SetAllFields(&message);
  81. // This field will test merging into an empty spot.
  82. message2.set_optional_int32(message.optional_int32());
  83. message.clear_optional_int32();
  84. // This tests overwriting.
  85. message2.set_optional_string(message.optional_string());
  86. message.set_optional_string("something else");
  87. // This tests concatenating.
  88. message2.add_repeated_int32(message.repeated_int32(1));
  89. int32 i = message.repeated_int32(0);
  90. message.clear_repeated_int32();
  91. message.add_repeated_int32(i);
  92. ReflectionOps::Merge(message2, &message);
  93. TestUtil::ExpectAllFieldsSet(message);
  94. }
  95. TEST(ReflectionOpsTest, MergeExtensions) {
  96. // Note: Copy is implemented in terms of Merge() so technically the Copy
  97. // test already tested most of this.
  98. unittest::TestAllExtensions message, message2;
  99. TestUtil::SetAllExtensions(&message);
  100. // This field will test merging into an empty spot.
  101. message2.SetExtension(
  102. unittest::optional_int32_extension,
  103. message.GetExtension(unittest::optional_int32_extension));
  104. message.ClearExtension(unittest::optional_int32_extension);
  105. // This tests overwriting.
  106. message2.SetExtension(
  107. unittest::optional_string_extension,
  108. message.GetExtension(unittest::optional_string_extension));
  109. message.SetExtension(unittest::optional_string_extension, "something else");
  110. // This tests concatenating.
  111. message2.AddExtension(
  112. unittest::repeated_int32_extension,
  113. message.GetExtension(unittest::repeated_int32_extension, 1));
  114. int32 i = message.GetExtension(unittest::repeated_int32_extension, 0);
  115. message.ClearExtension(unittest::repeated_int32_extension);
  116. message.AddExtension(unittest::repeated_int32_extension, i);
  117. ReflectionOps::Merge(message2, &message);
  118. TestUtil::ExpectAllExtensionsSet(message);
  119. }
  120. TEST(ReflectionOpsTest, MergeUnknown) {
  121. // Test that the messages' UnknownFieldSets are correctly merged.
  122. unittest::TestEmptyMessage message1, message2;
  123. message1.mutable_unknown_fields()->AddVarint(1234, 1);
  124. message2.mutable_unknown_fields()->AddVarint(1234, 2);
  125. ReflectionOps::Merge(message2, &message1);
  126. ASSERT_EQ(2, message1.unknown_fields().field_count());
  127. ASSERT_EQ(UnknownField::TYPE_VARINT,
  128. message1.unknown_fields().field(0).type());
  129. EXPECT_EQ(1, message1.unknown_fields().field(0).varint());
  130. ASSERT_EQ(UnknownField::TYPE_VARINT,
  131. message1.unknown_fields().field(1).type());
  132. EXPECT_EQ(2, message1.unknown_fields().field(1).varint());
  133. }
  134. TEST(ReflectionOpsTest, MergeOneof) {
  135. unittest::TestOneof2 message1, message2;
  136. TestUtil::SetOneof1(&message1);
  137. // Merge to empty message
  138. ReflectionOps::Merge(message1, &message2);
  139. TestUtil::ExpectOneofSet1(message2);
  140. // Merge with the same oneof fields
  141. ReflectionOps::Merge(message1, &message2);
  142. TestUtil::ExpectOneofSet1(message2);
  143. // Merge with different oneof fields
  144. TestUtil::SetOneof2(&message1);
  145. ReflectionOps::Merge(message1, &message2);
  146. TestUtil::ExpectOneofSet2(message2);
  147. }
  148. #ifdef PROTOBUF_HAS_DEATH_TEST
  149. TEST(ReflectionOpsTest, MergeFromSelf) {
  150. // Note: Copy is implemented in terms of Merge() so technically the Copy
  151. // test already tested most of this.
  152. unittest::TestAllTypes message;
  153. EXPECT_DEATH(ReflectionOps::Merge(message, &message), "&from");
  154. }
  155. #endif // PROTOBUF_HAS_DEATH_TEST
  156. TEST(ReflectionOpsTest, Clear) {
  157. unittest::TestAllTypes message;
  158. TestUtil::SetAllFields(&message);
  159. ReflectionOps::Clear(&message);
  160. TestUtil::ExpectClear(message);
  161. // Check that getting embedded messages returns the objects created during
  162. // SetAllFields() rather than default instances.
  163. EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),
  164. &message.optionalgroup());
  165. EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
  166. &message.optional_nested_message());
  167. EXPECT_NE(&unittest::ForeignMessage::default_instance(),
  168. &message.optional_foreign_message());
  169. EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
  170. &message.optional_import_message());
  171. }
  172. TEST(ReflectionOpsTest, ClearExtensions) {
  173. unittest::TestAllExtensions message;
  174. TestUtil::SetAllExtensions(&message);
  175. ReflectionOps::Clear(&message);
  176. TestUtil::ExpectExtensionsClear(message);
  177. // Check that getting embedded messages returns the objects created during
  178. // SetAllExtensions() rather than default instances.
  179. EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),
  180. &message.GetExtension(unittest::optionalgroup_extension));
  181. EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
  182. &message.GetExtension(unittest::optional_nested_message_extension));
  183. EXPECT_NE(
  184. &unittest::ForeignMessage::default_instance(),
  185. &message.GetExtension(unittest::optional_foreign_message_extension));
  186. EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
  187. &message.GetExtension(unittest::optional_import_message_extension));
  188. }
  189. TEST(ReflectionOpsTest, ClearUnknown) {
  190. // Test that the message's UnknownFieldSet is correctly cleared.
  191. unittest::TestEmptyMessage message;
  192. message.mutable_unknown_fields()->AddVarint(1234, 1);
  193. ReflectionOps::Clear(&message);
  194. EXPECT_EQ(0, message.unknown_fields().field_count());
  195. }
  196. TEST(ReflectionOpsTest, ClearOneof) {
  197. unittest::TestOneof2 message;
  198. TestUtil::ExpectOneofClear(message);
  199. TestUtil::SetOneof1(&message);
  200. TestUtil::ExpectOneofSet1(message);
  201. ReflectionOps::Clear(&message);
  202. TestUtil::ExpectOneofClear(message);
  203. TestUtil::SetOneof1(&message);
  204. TestUtil::ExpectOneofSet1(message);
  205. TestUtil::SetOneof2(&message);
  206. TestUtil::ExpectOneofSet2(message);
  207. ReflectionOps::Clear(&message);
  208. TestUtil::ExpectOneofClear(message);
  209. }
  210. TEST(ReflectionOpsTest, DiscardUnknownFields) {
  211. unittest::TestAllTypes message;
  212. TestUtil::SetAllFields(&message);
  213. // Set some unknown fields in message.
  214. message.mutable_unknown_fields()->AddVarint(123456, 654321);
  215. message.mutable_optional_nested_message()
  216. ->mutable_unknown_fields()
  217. ->AddVarint(123456, 654321);
  218. message.mutable_repeated_nested_message(0)
  219. ->mutable_unknown_fields()
  220. ->AddVarint(123456, 654321);
  221. EXPECT_EQ(1, message.unknown_fields().field_count());
  222. EXPECT_EQ(1,
  223. message.optional_nested_message().unknown_fields().field_count());
  224. EXPECT_EQ(1,
  225. message.repeated_nested_message(0).unknown_fields().field_count());
  226. // Discard them.
  227. ReflectionOps::DiscardUnknownFields(&message);
  228. TestUtil::ExpectAllFieldsSet(message);
  229. EXPECT_EQ(0, message.unknown_fields().field_count());
  230. EXPECT_EQ(0,
  231. message.optional_nested_message().unknown_fields().field_count());
  232. EXPECT_EQ(0,
  233. message.repeated_nested_message(0).unknown_fields().field_count());
  234. }
  235. TEST(ReflectionOpsTest, DiscardUnknownExtensions) {
  236. unittest::TestAllExtensions message;
  237. TestUtil::SetAllExtensions(&message);
  238. // Set some unknown fields.
  239. message.mutable_unknown_fields()->AddVarint(123456, 654321);
  240. message.MutableExtension(unittest::optional_nested_message_extension)
  241. ->mutable_unknown_fields()
  242. ->AddVarint(123456, 654321);
  243. message.MutableExtension(unittest::repeated_nested_message_extension, 0)
  244. ->mutable_unknown_fields()
  245. ->AddVarint(123456, 654321);
  246. EXPECT_EQ(1, message.unknown_fields().field_count());
  247. EXPECT_EQ(1, message.GetExtension(unittest::optional_nested_message_extension)
  248. .unknown_fields()
  249. .field_count());
  250. EXPECT_EQ(1,
  251. message.GetExtension(unittest::repeated_nested_message_extension, 0)
  252. .unknown_fields()
  253. .field_count());
  254. // Discard them.
  255. ReflectionOps::DiscardUnknownFields(&message);
  256. TestUtil::ExpectAllExtensionsSet(message);
  257. EXPECT_EQ(0, message.unknown_fields().field_count());
  258. EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension)
  259. .unknown_fields()
  260. .field_count());
  261. EXPECT_EQ(0,
  262. message.GetExtension(unittest::repeated_nested_message_extension, 0)
  263. .unknown_fields()
  264. .field_count());
  265. }
  266. TEST(ReflectionOpsTest, IsInitialized) {
  267. unittest::TestRequired message;
  268. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  269. message.set_a(1);
  270. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  271. message.set_b(2);
  272. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  273. message.set_c(3);
  274. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  275. }
  276. TEST(ReflectionOpsTest, ForeignIsInitialized) {
  277. unittest::TestRequiredForeign message;
  278. // Starts out initialized because the foreign message is itself an optional
  279. // field.
  280. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  281. // Once we create that field, the message is no longer initialized.
  282. message.mutable_optional_message();
  283. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  284. // Initialize it. Now we're initialized.
  285. message.mutable_optional_message()->set_a(1);
  286. message.mutable_optional_message()->set_b(2);
  287. message.mutable_optional_message()->set_c(3);
  288. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  289. // Add a repeated version of the message. No longer initialized.
  290. unittest::TestRequired* sub_message = message.add_repeated_message();
  291. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  292. // Initialize that repeated version.
  293. sub_message->set_a(1);
  294. sub_message->set_b(2);
  295. sub_message->set_c(3);
  296. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  297. }
  298. TEST(ReflectionOpsTest, ExtensionIsInitialized) {
  299. unittest::TestAllExtensions message;
  300. // Starts out initialized because the foreign message is itself an optional
  301. // field.
  302. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  303. // Once we create that field, the message is no longer initialized.
  304. message.MutableExtension(unittest::TestRequired::single);
  305. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  306. // Initialize it. Now we're initialized.
  307. message.MutableExtension(unittest::TestRequired::single)->set_a(1);
  308. message.MutableExtension(unittest::TestRequired::single)->set_b(2);
  309. message.MutableExtension(unittest::TestRequired::single)->set_c(3);
  310. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  311. // Add a repeated version of the message. No longer initialized.
  312. message.AddExtension(unittest::TestRequired::multi);
  313. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  314. // Initialize that repeated version.
  315. message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);
  316. message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);
  317. message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);
  318. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  319. }
  320. TEST(ReflectionOpsTest, OneofIsInitialized) {
  321. unittest::TestRequiredOneof message;
  322. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  323. message.mutable_foo_message();
  324. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  325. message.set_foo_int(1);
  326. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  327. message.mutable_foo_message();
  328. EXPECT_FALSE(ReflectionOps::IsInitialized(message));
  329. message.mutable_foo_message()->set_required_double(0.1);
  330. EXPECT_TRUE(ReflectionOps::IsInitialized(message));
  331. }
  332. static std::string FindInitializationErrors(const Message& message) {
  333. std::vector<std::string> errors;
  334. ReflectionOps::FindInitializationErrors(message, "", &errors);
  335. return Join(errors, ",");
  336. }
  337. TEST(ReflectionOpsTest, FindInitializationErrors) {
  338. unittest::TestRequired message;
  339. EXPECT_EQ("a,b,c", FindInitializationErrors(message));
  340. }
  341. TEST(ReflectionOpsTest, FindForeignInitializationErrors) {
  342. unittest::TestRequiredForeign message;
  343. message.mutable_optional_message();
  344. message.add_repeated_message();
  345. message.add_repeated_message();
  346. EXPECT_EQ(
  347. "optional_message.a,"
  348. "optional_message.b,"
  349. "optional_message.c,"
  350. "repeated_message[0].a,"
  351. "repeated_message[0].b,"
  352. "repeated_message[0].c,"
  353. "repeated_message[1].a,"
  354. "repeated_message[1].b,"
  355. "repeated_message[1].c",
  356. FindInitializationErrors(message));
  357. }
  358. TEST(ReflectionOpsTest, FindExtensionInitializationErrors) {
  359. unittest::TestAllExtensions message;
  360. message.MutableExtension(unittest::TestRequired::single);
  361. message.AddExtension(unittest::TestRequired::multi);
  362. message.AddExtension(unittest::TestRequired::multi);
  363. EXPECT_EQ(
  364. "(protobuf_unittest.TestRequired.single).a,"
  365. "(protobuf_unittest.TestRequired.single).b,"
  366. "(protobuf_unittest.TestRequired.single).c,"
  367. "(protobuf_unittest.TestRequired.multi)[0].a,"
  368. "(protobuf_unittest.TestRequired.multi)[0].b,"
  369. "(protobuf_unittest.TestRequired.multi)[0].c,"
  370. "(protobuf_unittest.TestRequired.multi)[1].a,"
  371. "(protobuf_unittest.TestRequired.multi)[1].b,"
  372. "(protobuf_unittest.TestRequired.multi)[1].c",
  373. FindInitializationErrors(message));
  374. }
  375. TEST(ReflectionOpsTest, FindOneofInitializationErrors) {
  376. unittest::TestRequiredOneof message;
  377. message.mutable_foo_message();
  378. EXPECT_EQ("foo_message.required_double", FindInitializationErrors(message));
  379. }
  380. } // namespace
  381. } // namespace internal
  382. } // namespace protobuf
  383. } // namespace google