expecting_objectwriter.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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. #ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__
  31. #define GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__
  32. // An implementation of ObjectWriter that automatically sets the
  33. // gmock expectations for the response to a method. Every method
  34. // returns the object itself for chaining.
  35. //
  36. // Usage:
  37. // // Setup
  38. // MockObjectWriter mock;
  39. // ExpectingObjectWriter ow(&mock);
  40. //
  41. // // Set expectation
  42. // ow.StartObject("")
  43. // ->RenderString("key", "value")
  44. // ->EndObject();
  45. //
  46. // // Actual testing
  47. // mock.StartObject(StringPiece())
  48. // ->RenderString("key", "value")
  49. // ->EndObject();
  50. #include <google/protobuf/stubs/common.h>
  51. #include <google/protobuf/util/internal/object_writer.h>
  52. #include <gmock/gmock.h>
  53. namespace google {
  54. namespace protobuf {
  55. namespace util {
  56. namespace converter {
  57. using testing::IsEmpty;
  58. using testing::NanSensitiveDoubleEq;
  59. using testing::NanSensitiveFloatEq;
  60. using testing::Return;
  61. using testing::StrEq;
  62. using testing::TypedEq;
  63. class MockObjectWriter : public ObjectWriter {
  64. public:
  65. MockObjectWriter() {}
  66. MOCK_METHOD1(StartObject, ObjectWriter*(StringPiece));
  67. MOCK_METHOD0(EndObject, ObjectWriter*());
  68. MOCK_METHOD1(StartList, ObjectWriter*(StringPiece));
  69. MOCK_METHOD0(EndList, ObjectWriter*());
  70. MOCK_METHOD2(RenderBool, ObjectWriter*(StringPiece, bool));
  71. MOCK_METHOD2(RenderInt32, ObjectWriter*(StringPiece, int32));
  72. MOCK_METHOD2(RenderUint32, ObjectWriter*(StringPiece, uint32));
  73. MOCK_METHOD2(RenderInt64, ObjectWriter*(StringPiece, int64));
  74. MOCK_METHOD2(RenderUint64, ObjectWriter*(StringPiece, uint64));
  75. MOCK_METHOD2(RenderDouble, ObjectWriter*(StringPiece, double));
  76. MOCK_METHOD2(RenderFloat, ObjectWriter*(StringPiece, float));
  77. MOCK_METHOD2(RenderString, ObjectWriter*(StringPiece, StringPiece));
  78. MOCK_METHOD2(RenderBytes, ObjectWriter*(StringPiece, StringPiece));
  79. MOCK_METHOD1(RenderNull, ObjectWriter*(StringPiece));
  80. };
  81. class ExpectingObjectWriter : public ObjectWriter {
  82. public:
  83. explicit ExpectingObjectWriter(MockObjectWriter* mock) : mock_(mock) {}
  84. virtual ObjectWriter* StartObject(StringPiece name) {
  85. (name.empty()
  86. ? EXPECT_CALL(*mock_, StartObject(IsEmpty()))
  87. : EXPECT_CALL(*mock_, StartObject(StrEq(name.ToString()))))
  88. .WillOnce(Return(mock_))
  89. .RetiresOnSaturation();
  90. return this;
  91. }
  92. virtual ObjectWriter* EndObject() {
  93. EXPECT_CALL(*mock_, EndObject())
  94. .WillOnce(Return(mock_))
  95. .RetiresOnSaturation();
  96. return this;
  97. }
  98. virtual ObjectWriter* StartList(StringPiece name) {
  99. (name.empty()
  100. ? EXPECT_CALL(*mock_, StartList(IsEmpty()))
  101. : EXPECT_CALL(*mock_, StartList(StrEq(name.ToString()))))
  102. .WillOnce(Return(mock_))
  103. .RetiresOnSaturation();
  104. return this;
  105. }
  106. virtual ObjectWriter* EndList() {
  107. EXPECT_CALL(*mock_, EndList())
  108. .WillOnce(Return(mock_))
  109. .RetiresOnSaturation();
  110. return this;
  111. }
  112. virtual ObjectWriter* RenderBool(StringPiece name, bool value) {
  113. (name.empty()
  114. ? EXPECT_CALL(*mock_, RenderBool(IsEmpty(), TypedEq<bool>(value)))
  115. : EXPECT_CALL(*mock_, RenderBool(StrEq(name.ToString()),
  116. TypedEq<bool>(value))))
  117. .WillOnce(Return(mock_))
  118. .RetiresOnSaturation();
  119. return this;
  120. }
  121. virtual ObjectWriter* RenderInt32(StringPiece name, int32 value) {
  122. (name.empty()
  123. ? EXPECT_CALL(*mock_, RenderInt32(IsEmpty(), TypedEq<int32>(value)))
  124. : EXPECT_CALL(*mock_, RenderInt32(StrEq(name.ToString()),
  125. TypedEq<int32>(value))))
  126. .WillOnce(Return(mock_))
  127. .RetiresOnSaturation();
  128. return this;
  129. }
  130. virtual ObjectWriter* RenderUint32(StringPiece name, uint32 value) {
  131. (name.empty()
  132. ? EXPECT_CALL(*mock_, RenderUint32(IsEmpty(), TypedEq<uint32>(value)))
  133. : EXPECT_CALL(*mock_, RenderUint32(StrEq(name.ToString()),
  134. TypedEq<uint32>(value))))
  135. .WillOnce(Return(mock_))
  136. .RetiresOnSaturation();
  137. return this;
  138. }
  139. virtual ObjectWriter* RenderInt64(StringPiece name, int64 value) {
  140. (name.empty()
  141. ? EXPECT_CALL(*mock_, RenderInt64(IsEmpty(), TypedEq<int64>(value)))
  142. : EXPECT_CALL(*mock_, RenderInt64(StrEq(name.ToString()),
  143. TypedEq<int64>(value))))
  144. .WillOnce(Return(mock_))
  145. .RetiresOnSaturation();
  146. return this;
  147. }
  148. virtual ObjectWriter* RenderUint64(StringPiece name, uint64 value) {
  149. (name.empty()
  150. ? EXPECT_CALL(*mock_, RenderUint64(IsEmpty(), TypedEq<uint64>(value)))
  151. : EXPECT_CALL(*mock_, RenderUint64(StrEq(name.ToString()),
  152. TypedEq<uint64>(value))))
  153. .WillOnce(Return(mock_))
  154. .RetiresOnSaturation();
  155. return this;
  156. }
  157. virtual ObjectWriter* RenderDouble(StringPiece name, double value) {
  158. (name.empty()
  159. ? EXPECT_CALL(*mock_, RenderDouble(IsEmpty(),
  160. NanSensitiveDoubleEq(value)))
  161. : EXPECT_CALL(*mock_, RenderDouble(StrEq(name.ToString()),
  162. NanSensitiveDoubleEq(value))))
  163. .WillOnce(Return(mock_))
  164. .RetiresOnSaturation();
  165. return this;
  166. }
  167. virtual ObjectWriter* RenderFloat(StringPiece name, float value) {
  168. (name.empty()
  169. ? EXPECT_CALL(*mock_, RenderFloat(IsEmpty(),
  170. NanSensitiveFloatEq(value)))
  171. : EXPECT_CALL(*mock_, RenderFloat(StrEq(name.ToString()),
  172. NanSensitiveFloatEq(value))))
  173. .WillOnce(Return(mock_))
  174. .RetiresOnSaturation();
  175. return this;
  176. }
  177. virtual ObjectWriter* RenderString(StringPiece name, StringPiece value) {
  178. (name.empty()
  179. ? EXPECT_CALL(*mock_, RenderString(IsEmpty(),
  180. TypedEq<StringPiece>(value.ToString())))
  181. : EXPECT_CALL(*mock_, RenderString(StrEq(name.ToString()),
  182. TypedEq<StringPiece>(value.ToString()))))
  183. .WillOnce(Return(mock_))
  184. .RetiresOnSaturation();
  185. return this;
  186. }
  187. virtual ObjectWriter* RenderBytes(StringPiece name, StringPiece value) {
  188. (name.empty()
  189. ? EXPECT_CALL(*mock_, RenderBytes(IsEmpty(), TypedEq<StringPiece>(
  190. value.ToString())))
  191. : EXPECT_CALL(*mock_,
  192. RenderBytes(StrEq(name.ToString()),
  193. TypedEq<StringPiece>(value.ToString()))))
  194. .WillOnce(Return(mock_))
  195. .RetiresOnSaturation();
  196. return this;
  197. }
  198. virtual ObjectWriter* RenderNull(StringPiece name) {
  199. (name.empty() ? EXPECT_CALL(*mock_, RenderNull(IsEmpty()))
  200. : EXPECT_CALL(*mock_, RenderNull(StrEq(name.ToString())))
  201. .WillOnce(Return(mock_))
  202. .RetiresOnSaturation());
  203. return this;
  204. }
  205. private:
  206. MockObjectWriter* mock_;
  207. GOOGLE_DISALLOW_IMPLICIT_CONSTRUCTORS(ExpectingObjectWriter);
  208. };
  209. } // namespace converter
  210. } // namespace util
  211. } // namespace protobuf
  212. } // namespace google
  213. #endif // GOOGLE_PROTOBUF_UTIL_CONVERTER_EXPECTING_OBJECTWRITER_H__