MessageFieldTest.cc 9.6 KB

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