MessageFieldTest.cc 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. // Copyright: All Rights Reserved
  2. // Author: egametang@gmail.com (tanghai)
  3. #include <sstream>
  4. #include <memory>
  5. #include <gtest/gtest.h>
  6. #include <gmock/gmock.h>
  7. #include <glog/logging.h>
  8. #include <gflags/gflags.h>
  9. #include <google/protobuf/descriptor.h>
  10. #include "Orm/MessageField.h"
  11. #include "Orm/Person.pb.h"
  12. #include "Orm/ResultSetMock.h"
  13. namespace Egametang {
  14. using testing::_;
  15. using testing::Invoke;
  16. using testing::Return;
  17. using testing::An;
  18. class MessageFieldTest: public testing::Test
  19. {
  20. };
  21. TEST_F(MessageFieldTest, GetField_FieldIsInt32)
  22. {
  23. Person person;
  24. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  25. const google::protobuf::FieldDescriptor* field = descriptor->field(1);
  26. std::string str;
  27. MessageField messageField(person, field);
  28. person.set_age(10);
  29. str = messageField.GetField();
  30. ASSERT_EQ("10", str);
  31. person.set_age(-10);
  32. str = messageField.GetField();
  33. ASSERT_EQ("-10", str);
  34. }
  35. TEST_F(MessageFieldTest, GetField_FieldIsUInt32)
  36. {
  37. Person person;
  38. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  39. const google::protobuf::FieldDescriptor* field = descriptor->field(2);
  40. std::string str;
  41. MessageField messageField(person, field);
  42. person.set_number(10);
  43. str = messageField.GetField();
  44. ASSERT_EQ("10", str);
  45. person.set_number(-10);
  46. str = messageField.GetField();
  47. ASSERT_EQ("4294967286", str);
  48. }
  49. TEST_F(MessageFieldTest, GetField_FieldIsUInt64)
  50. {
  51. Person person;
  52. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  53. const google::protobuf::FieldDescriptor* field = descriptor->field(3);
  54. std::string str;
  55. MessageField messageField(person, field);
  56. person.set_time(33333333333333LL);
  57. str = messageField.GetField();
  58. ASSERT_EQ("33333333333333", str);
  59. person.set_time(-33333333333333LL);
  60. str = messageField.GetField();
  61. ASSERT_EQ("18446710740376218283", str);
  62. }
  63. TEST_F(MessageFieldTest, GetField_FieldIsInt64)
  64. {
  65. Person person;
  66. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  67. const google::protobuf::FieldDescriptor* field = descriptor->field(0);
  68. std::string str;
  69. MessageField messageField(person, field);
  70. person.set_guid(33333333333333LL);
  71. str = messageField.GetField();
  72. ASSERT_EQ("33333333333333", str);
  73. person.set_guid(-33333333333333LL);
  74. str = messageField.GetField();
  75. ASSERT_EQ("-33333333333333", str);
  76. }
  77. TEST_F(MessageFieldTest, GetField_FieldIsString)
  78. {
  79. Person person;
  80. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  81. const google::protobuf::FieldDescriptor* field = descriptor->field(4);
  82. std::string str;
  83. MessageField messageField(person, field);
  84. person.set_name("tanghai");
  85. str = messageField.GetField();
  86. ASSERT_EQ("'tanghai'", str);
  87. }
  88. TEST_F(MessageFieldTest, GetField_FieldIsDouble)
  89. {
  90. Person person;
  91. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  92. const google::protobuf::FieldDescriptor* field = descriptor->field(5);
  93. std::string str;
  94. MessageField messageField(person, field);
  95. person.set_height(1.78);
  96. str = messageField.GetField();
  97. ASSERT_EQ("1.78", str);
  98. }
  99. TEST_F(MessageFieldTest, GetField_FieldIsBytes)
  100. {
  101. Person person;
  102. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  103. const google::protobuf::FieldDescriptor* field = descriptor->field(6);
  104. std::string str;
  105. MessageField messageField(person, field);
  106. person.set_comment("tanghai is a good student!");
  107. str = messageField.GetField();
  108. ASSERT_EQ("'tanghai is a good student!'", str);
  109. }
  110. TEST_F(MessageFieldTest, GetField_FieldIsBool)
  111. {
  112. Person person;
  113. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  114. const google::protobuf::FieldDescriptor* field = descriptor->field(7);
  115. std::string str;
  116. MessageField messageField(person, field);
  117. person.set_marry(false);
  118. str = messageField.GetField();
  119. ASSERT_EQ("0", str);
  120. person.set_marry(true);
  121. str = messageField.GetField();
  122. ASSERT_EQ("1", str);
  123. }
  124. TEST_F(MessageFieldTest, GetField_FieldIsMessage)
  125. {
  126. Person person;
  127. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  128. const google::protobuf::FieldDescriptor* field = descriptor->field(8);
  129. std::string str;
  130. MessageField messageField(person, field);
  131. person.mutable_item()->set_id(123);
  132. person.mutable_item()->set_name("pen");
  133. str = messageField.GetField();
  134. ASSERT_EQ("id: 123 name: \"pen\"", str);
  135. }
  136. TEST_F(MessageFieldTest, SetField_FieldIsBool)
  137. {
  138. auto resultSetMock = std::make_shared<ResultSetMock>();
  139. EXPECT_CALL(*resultSetMock, getBoolean(8))
  140. .WillOnce(Return(true))
  141. .WillOnce(Return(false));
  142. Person person;
  143. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  144. const google::protobuf::FieldDescriptor* field = descriptor->field(7);
  145. MessageField messageField(person, field);
  146. messageField.SetField(resultSetMock);
  147. ASSERT_TRUE(person.marry());
  148. messageField.SetField(resultSetMock);
  149. ASSERT_FALSE(person.marry());
  150. }
  151. TEST_F(MessageFieldTest, SetField_FieldIsDouble)
  152. {
  153. auto resultSetMock = std::make_shared<ResultSetMock>();
  154. EXPECT_CALL(*resultSetMock, getDouble(6))
  155. .WillOnce(Return(1.00))
  156. .WillOnce(Return(12345.6789));
  157. Person person;
  158. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  159. const google::protobuf::FieldDescriptor* field = descriptor->field(5);
  160. MessageField messageField(person, field);
  161. messageField.SetField(resultSetMock);
  162. ASSERT_FLOAT_EQ(1.00, person.height());
  163. messageField.SetField(resultSetMock);
  164. ASSERT_FLOAT_EQ(12345.6789, person.height());
  165. }
  166. TEST_F(MessageFieldTest, SetField_FieldIsInt32)
  167. {
  168. auto resultSetMock = std::make_shared<ResultSetMock>();
  169. EXPECT_CALL(*resultSetMock, getInt(2))
  170. .WillOnce(Return(1))
  171. .WillOnce(Return(0xFFFFFFFF));
  172. Person person;
  173. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  174. const google::protobuf::FieldDescriptor* field = descriptor->field(1);
  175. MessageField messageField(person, field);
  176. messageField.SetField(resultSetMock);
  177. ASSERT_EQ(1, person.age());
  178. messageField.SetField(resultSetMock);
  179. ASSERT_EQ(-1, person.age());
  180. }
  181. TEST_F(MessageFieldTest, SetField_FieldIsInt64)
  182. {
  183. auto resultSetMock = std::make_shared<ResultSetMock>();
  184. EXPECT_CALL(*resultSetMock, getInt64(1))
  185. .WillOnce(Return(1))
  186. .WillOnce(Return(0xFFFFFFFFFFFFFFFF));
  187. Person person;
  188. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  189. const google::protobuf::FieldDescriptor* field = descriptor->field(0);
  190. MessageField messageField(person, field);
  191. messageField.SetField(resultSetMock);
  192. ASSERT_EQ(1, person.guid());
  193. messageField.SetField(resultSetMock);
  194. ASSERT_EQ(-1, person.guid());
  195. }
  196. TEST_F(MessageFieldTest, SetField_FieldIsUInt32)
  197. {
  198. auto resultSetMock = std::make_shared<ResultSetMock>();
  199. EXPECT_CALL(*resultSetMock, getUInt(3))
  200. .WillOnce(Return(1))
  201. .WillOnce(Return(0xFFFFFFFF));
  202. Person person;
  203. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  204. const google::protobuf::FieldDescriptor* field = descriptor->field(2);
  205. MessageField messageField(person, field);
  206. messageField.SetField(resultSetMock);
  207. ASSERT_EQ(1, person.number());
  208. messageField.SetField(resultSetMock);
  209. ASSERT_EQ(4294967295, person.number());
  210. }
  211. TEST_F(MessageFieldTest, SetField_FieldIsUInt64)
  212. {
  213. auto resultSetMock = std::make_shared<ResultSetMock>();
  214. EXPECT_CALL(*resultSetMock, getUInt64(4))
  215. .WillOnce(Return(1))
  216. .WillOnce(Return(0xFFFFFFFFFFFFFFFF));
  217. Person person;
  218. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  219. const google::protobuf::FieldDescriptor* field = descriptor->field(3);
  220. MessageField messageField(person, field);
  221. messageField.SetField(resultSetMock);
  222. ASSERT_EQ(1, person.time());
  223. messageField.SetField(resultSetMock);
  224. ASSERT_EQ(18446744073709551615ULL, person.time());
  225. }
  226. TEST_F(MessageFieldTest, SetField_FieldIsString)
  227. {
  228. auto resultSetMock = std::make_shared<ResultSetMock>();
  229. EXPECT_CALL(*resultSetMock, getString(5))
  230. .WillOnce(Return("1"))
  231. .WillOnce(Return("tanghai"));
  232. Person person;
  233. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  234. const google::protobuf::FieldDescriptor* field = descriptor->field(4);
  235. MessageField messageField(person, field);
  236. messageField.SetField(resultSetMock);
  237. ASSERT_EQ("1", person.name());
  238. messageField.SetField(resultSetMock);
  239. ASSERT_EQ("tanghai", person.name());
  240. }
  241. TEST_F(MessageFieldTest, SetField_FieldIsBytes)
  242. {
  243. auto resultSetMock = std::make_shared<ResultSetMock>();
  244. EXPECT_CALL(*resultSetMock, getString(7))
  245. .WillOnce(Return("1"))
  246. .WillOnce(Return("tanghai is a good student"));
  247. Person person;
  248. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  249. const google::protobuf::FieldDescriptor* field = descriptor->field(6);
  250. MessageField messageField(person, field);
  251. messageField.SetField(resultSetMock);
  252. ASSERT_EQ("1", person.comment());
  253. messageField.SetField(resultSetMock);
  254. ASSERT_EQ("tanghai is a good student", person.comment());
  255. }
  256. TEST_F(MessageFieldTest, SetField_FieldIsMessage)
  257. {
  258. std::istringstream is;
  259. is.str("id: 123 name: \"pen\"");
  260. auto resultSetMock = std::make_shared<ResultSetMock>();
  261. EXPECT_CALL(*resultSetMock, getBlob(9))
  262. .WillOnce(Return(&is));
  263. Person person;
  264. const google::protobuf::Descriptor* descriptor = person.GetDescriptor();
  265. const google::protobuf::FieldDescriptor* field = descriptor->field(8);
  266. MessageField messageField(person, field);
  267. messageField.SetField(resultSetMock);
  268. ASSERT_EQ(123, person.item().id());
  269. ASSERT_EQ("pen", person.item().name());
  270. }
  271. } // namespace Egametang
  272. int main(int argc, char* argv[])
  273. {
  274. testing::InitGoogleTest(&argc, argv);
  275. google::InitGoogleLogging(argv[0]);
  276. google::ParseCommandLineFlags(&argc, &argv, true);
  277. return RUN_ALL_TESTS();
  278. }