OLD | NEW |
| (Empty) |
1 // Copyright 2007, Google Inc. | |
2 // All rights reserved. | |
3 // | |
4 // Redistribution and use in source and binary forms, with or without | |
5 // modification, are permitted provided that the following conditions are | |
6 // met: | |
7 // | |
8 // * Redistributions of source code must retain the above copyright | |
9 // notice, this list of conditions and the following disclaimer. | |
10 // * Redistributions in binary form must reproduce the above | |
11 // copyright notice, this list of conditions and the following disclaimer | |
12 // in the documentation and/or other materials provided with the | |
13 // distribution. | |
14 // * Neither the name of Google Inc. nor the names of its | |
15 // contributors may be used to endorse or promote products derived from | |
16 // this software without specific prior written permission. | |
17 // | |
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 // | |
30 // Author: wan@google.com (Zhanyong Wan) | |
31 | |
32 // Google Mock - a framework for writing C++ mock classes. | |
33 // | |
34 // This file tests the built-in cardinalities. | |
35 | |
36 #include <gmock/gmock.h> | |
37 #include <gtest/gtest.h> | |
38 #include <gtest/gtest-spi.h> | |
39 | |
40 namespace { | |
41 | |
42 using std::stringstream; | |
43 using testing::AnyNumber; | |
44 using testing::AtLeast; | |
45 using testing::AtMost; | |
46 using testing::Between; | |
47 using testing::Cardinality; | |
48 using testing::CardinalityInterface; | |
49 using testing::Exactly; | |
50 using testing::IsSubstring; | |
51 using testing::MakeCardinality; | |
52 | |
53 class MockFoo { | |
54 public: | |
55 MockFoo() {} | |
56 MOCK_METHOD0(Bar, int()); // NOLINT | |
57 | |
58 private: | |
59 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo); | |
60 }; | |
61 | |
62 // Tests that Cardinality objects can be default constructed. | |
63 TEST(CardinalityTest, IsDefaultConstructable) { | |
64 Cardinality c; | |
65 } | |
66 | |
67 // Tests that Cardinality objects are copyable. | |
68 TEST(CardinalityTest, IsCopyable) { | |
69 // Tests the copy constructor. | |
70 Cardinality c = Exactly(1); | |
71 EXPECT_FALSE(c.IsSatisfiedByCallCount(0)); | |
72 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
73 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
74 | |
75 // Tests the assignment operator. | |
76 c = Exactly(2); | |
77 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
78 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
79 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
80 } | |
81 | |
82 TEST(CardinalityTest, IsOverSaturatedByCallCountWorks) { | |
83 const Cardinality c = AtMost(5); | |
84 EXPECT_FALSE(c.IsOverSaturatedByCallCount(4)); | |
85 EXPECT_FALSE(c.IsOverSaturatedByCallCount(5)); | |
86 EXPECT_TRUE(c.IsOverSaturatedByCallCount(6)); | |
87 } | |
88 | |
89 // Tests that Cardinality::DescribeActualCallCountTo() creates the | |
90 // correct description. | |
91 TEST(CardinalityTest, CanDescribeActualCallCount) { | |
92 stringstream ss0; | |
93 Cardinality::DescribeActualCallCountTo(0, &ss0); | |
94 EXPECT_EQ("never called", ss0.str()); | |
95 | |
96 stringstream ss1; | |
97 Cardinality::DescribeActualCallCountTo(1, &ss1); | |
98 EXPECT_EQ("called once", ss1.str()); | |
99 | |
100 stringstream ss2; | |
101 Cardinality::DescribeActualCallCountTo(2, &ss2); | |
102 EXPECT_EQ("called twice", ss2.str()); | |
103 | |
104 stringstream ss3; | |
105 Cardinality::DescribeActualCallCountTo(3, &ss3); | |
106 EXPECT_EQ("called 3 times", ss3.str()); | |
107 } | |
108 | |
109 // Tests AnyNumber() | |
110 TEST(AnyNumber, Works) { | |
111 const Cardinality c = AnyNumber(); | |
112 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
113 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
114 | |
115 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
116 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
117 | |
118 EXPECT_TRUE(c.IsSatisfiedByCallCount(9)); | |
119 EXPECT_FALSE(c.IsSaturatedByCallCount(9)); | |
120 | |
121 stringstream ss; | |
122 c.DescribeTo(&ss); | |
123 EXPECT_PRED_FORMAT2(IsSubstring, "called any number of times", | |
124 ss.str()); | |
125 } | |
126 | |
127 TEST(AnyNumberTest, HasCorrectBounds) { | |
128 const Cardinality c = AnyNumber(); | |
129 EXPECT_EQ(0, c.ConservativeLowerBound()); | |
130 EXPECT_EQ(INT_MAX, c.ConservativeUpperBound()); | |
131 } | |
132 | |
133 // Tests AtLeast(n). | |
134 | |
135 TEST(AtLeastTest, OnNegativeNumber) { | |
136 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
137 AtLeast(-1); | |
138 }, "The invocation lower bound must be >= 0"); | |
139 } | |
140 | |
141 TEST(AtLeastTest, OnZero) { | |
142 const Cardinality c = AtLeast(0); | |
143 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
144 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
145 | |
146 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
147 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
148 | |
149 stringstream ss; | |
150 c.DescribeTo(&ss); | |
151 EXPECT_PRED_FORMAT2(IsSubstring, "any number of times", | |
152 ss.str()); | |
153 } | |
154 | |
155 TEST(AtLeastTest, OnPositiveNumber) { | |
156 const Cardinality c = AtLeast(2); | |
157 EXPECT_FALSE(c.IsSatisfiedByCallCount(0)); | |
158 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
159 | |
160 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
161 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
162 | |
163 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
164 EXPECT_FALSE(c.IsSaturatedByCallCount(2)); | |
165 | |
166 stringstream ss1; | |
167 AtLeast(1).DescribeTo(&ss1); | |
168 EXPECT_PRED_FORMAT2(IsSubstring, "at least once", | |
169 ss1.str()); | |
170 | |
171 stringstream ss2; | |
172 c.DescribeTo(&ss2); | |
173 EXPECT_PRED_FORMAT2(IsSubstring, "at least twice", | |
174 ss2.str()); | |
175 | |
176 stringstream ss3; | |
177 AtLeast(3).DescribeTo(&ss3); | |
178 EXPECT_PRED_FORMAT2(IsSubstring, "at least 3 times", | |
179 ss3.str()); | |
180 } | |
181 | |
182 TEST(AtLeastTest, HasCorrectBounds) { | |
183 const Cardinality c = AtLeast(2); | |
184 EXPECT_EQ(2, c.ConservativeLowerBound()); | |
185 EXPECT_EQ(INT_MAX, c.ConservativeUpperBound()); | |
186 } | |
187 | |
188 // Tests AtMost(n). | |
189 | |
190 TEST(AtMostTest, OnNegativeNumber) { | |
191 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
192 AtMost(-1); | |
193 }, "The invocation upper bound must be >= 0"); | |
194 } | |
195 | |
196 TEST(AtMostTest, OnZero) { | |
197 const Cardinality c = AtMost(0); | |
198 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
199 EXPECT_TRUE(c.IsSaturatedByCallCount(0)); | |
200 | |
201 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
202 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
203 | |
204 stringstream ss; | |
205 c.DescribeTo(&ss); | |
206 EXPECT_PRED_FORMAT2(IsSubstring, "never called", | |
207 ss.str()); | |
208 } | |
209 | |
210 TEST(AtMostTest, OnPositiveNumber) { | |
211 const Cardinality c = AtMost(2); | |
212 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
213 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
214 | |
215 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
216 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
217 | |
218 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
219 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
220 | |
221 stringstream ss1; | |
222 AtMost(1).DescribeTo(&ss1); | |
223 EXPECT_PRED_FORMAT2(IsSubstring, "called at most once", | |
224 ss1.str()); | |
225 | |
226 stringstream ss2; | |
227 c.DescribeTo(&ss2); | |
228 EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", | |
229 ss2.str()); | |
230 | |
231 stringstream ss3; | |
232 AtMost(3).DescribeTo(&ss3); | |
233 EXPECT_PRED_FORMAT2(IsSubstring, "called at most 3 times", | |
234 ss3.str()); | |
235 } | |
236 | |
237 TEST(AtMostTest, HasCorrectBounds) { | |
238 const Cardinality c = AtMost(2); | |
239 EXPECT_EQ(0, c.ConservativeLowerBound()); | |
240 EXPECT_EQ(2, c.ConservativeUpperBound()); | |
241 } | |
242 | |
243 // Tests Between(m, n). | |
244 | |
245 TEST(BetweenTest, OnNegativeStart) { | |
246 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
247 Between(-1, 2); | |
248 }, "The invocation lower bound must be >= 0, but is actually -1"); | |
249 } | |
250 | |
251 TEST(BetweenTest, OnNegativeEnd) { | |
252 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
253 Between(1, -2); | |
254 }, "The invocation upper bound must be >= 0, but is actually -2"); | |
255 } | |
256 | |
257 TEST(BetweenTest, OnStartBiggerThanEnd) { | |
258 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
259 Between(2, 1); | |
260 }, "The invocation upper bound (1) must be >= " | |
261 "the invocation lower bound (2)"); | |
262 } | |
263 | |
264 TEST(BetweenTest, OnZeroStartAndZeroEnd) { | |
265 const Cardinality c = Between(0, 0); | |
266 | |
267 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
268 EXPECT_TRUE(c.IsSaturatedByCallCount(0)); | |
269 | |
270 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
271 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
272 | |
273 stringstream ss; | |
274 c.DescribeTo(&ss); | |
275 EXPECT_PRED_FORMAT2(IsSubstring, "never called", | |
276 ss.str()); | |
277 } | |
278 | |
279 TEST(BetweenTest, OnZeroStartAndNonZeroEnd) { | |
280 const Cardinality c = Between(0, 2); | |
281 | |
282 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
283 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
284 | |
285 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
286 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
287 | |
288 EXPECT_FALSE(c.IsSatisfiedByCallCount(4)); | |
289 EXPECT_TRUE(c.IsSaturatedByCallCount(4)); | |
290 | |
291 stringstream ss; | |
292 c.DescribeTo(&ss); | |
293 EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", | |
294 ss.str()); | |
295 } | |
296 | |
297 TEST(BetweenTest, OnSameStartAndEnd) { | |
298 const Cardinality c = Between(3, 3); | |
299 | |
300 EXPECT_FALSE(c.IsSatisfiedByCallCount(2)); | |
301 EXPECT_FALSE(c.IsSaturatedByCallCount(2)); | |
302 | |
303 EXPECT_TRUE(c.IsSatisfiedByCallCount(3)); | |
304 EXPECT_TRUE(c.IsSaturatedByCallCount(3)); | |
305 | |
306 EXPECT_FALSE(c.IsSatisfiedByCallCount(4)); | |
307 EXPECT_TRUE(c.IsSaturatedByCallCount(4)); | |
308 | |
309 stringstream ss; | |
310 c.DescribeTo(&ss); | |
311 EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", | |
312 ss.str()); | |
313 } | |
314 | |
315 TEST(BetweenTest, OnDifferentStartAndEnd) { | |
316 const Cardinality c = Between(3, 5); | |
317 | |
318 EXPECT_FALSE(c.IsSatisfiedByCallCount(2)); | |
319 EXPECT_FALSE(c.IsSaturatedByCallCount(2)); | |
320 | |
321 EXPECT_TRUE(c.IsSatisfiedByCallCount(3)); | |
322 EXPECT_FALSE(c.IsSaturatedByCallCount(3)); | |
323 | |
324 EXPECT_TRUE(c.IsSatisfiedByCallCount(5)); | |
325 EXPECT_TRUE(c.IsSaturatedByCallCount(5)); | |
326 | |
327 EXPECT_FALSE(c.IsSatisfiedByCallCount(6)); | |
328 EXPECT_TRUE(c.IsSaturatedByCallCount(6)); | |
329 | |
330 stringstream ss; | |
331 c.DescribeTo(&ss); | |
332 EXPECT_PRED_FORMAT2(IsSubstring, "called between 3 and 5 times", | |
333 ss.str()); | |
334 } | |
335 | |
336 TEST(BetweenTest, HasCorrectBounds) { | |
337 const Cardinality c = Between(3, 5); | |
338 EXPECT_EQ(3, c.ConservativeLowerBound()); | |
339 EXPECT_EQ(5, c.ConservativeUpperBound()); | |
340 } | |
341 | |
342 // Tests Exactly(n). | |
343 | |
344 TEST(ExactlyTest, OnNegativeNumber) { | |
345 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
346 Exactly(-1); | |
347 }, "The invocation lower bound must be >= 0"); | |
348 } | |
349 | |
350 TEST(ExactlyTest, OnZero) { | |
351 const Cardinality c = Exactly(0); | |
352 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
353 EXPECT_TRUE(c.IsSaturatedByCallCount(0)); | |
354 | |
355 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
356 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
357 | |
358 stringstream ss; | |
359 c.DescribeTo(&ss); | |
360 EXPECT_PRED_FORMAT2(IsSubstring, "never called", | |
361 ss.str()); | |
362 } | |
363 | |
364 TEST(ExactlyTest, OnPositiveNumber) { | |
365 const Cardinality c = Exactly(2); | |
366 EXPECT_FALSE(c.IsSatisfiedByCallCount(0)); | |
367 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
368 | |
369 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
370 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
371 | |
372 stringstream ss1; | |
373 Exactly(1).DescribeTo(&ss1); | |
374 EXPECT_PRED_FORMAT2(IsSubstring, "called once", | |
375 ss1.str()); | |
376 | |
377 stringstream ss2; | |
378 c.DescribeTo(&ss2); | |
379 EXPECT_PRED_FORMAT2(IsSubstring, "called twice", | |
380 ss2.str()); | |
381 | |
382 stringstream ss3; | |
383 Exactly(3).DescribeTo(&ss3); | |
384 EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", | |
385 ss3.str()); | |
386 } | |
387 | |
388 TEST(ExactlyTest, HasCorrectBounds) { | |
389 const Cardinality c = Exactly(3); | |
390 EXPECT_EQ(3, c.ConservativeLowerBound()); | |
391 EXPECT_EQ(3, c.ConservativeUpperBound()); | |
392 } | |
393 | |
394 // Tests that a user can make his own cardinality by implementing | |
395 // CardinalityInterface and calling MakeCardinality(). | |
396 | |
397 class EvenCardinality : public CardinalityInterface { | |
398 public: | |
399 // Returns true iff call_count calls will satisfy this cardinality. | |
400 virtual bool IsSatisfiedByCallCount(int call_count) const { | |
401 return (call_count % 2 == 0); | |
402 } | |
403 | |
404 // Returns true iff call_count calls will saturate this cardinality. | |
405 virtual bool IsSaturatedByCallCount(int /* call_count */) const { | |
406 return false; | |
407 } | |
408 | |
409 // Describes self to an ostream. | |
410 virtual void DescribeTo(::std::ostream* ss) const { | |
411 *ss << "called even number of times"; | |
412 } | |
413 }; | |
414 | |
415 TEST(MakeCardinalityTest, ConstructsCardinalityFromInterface) { | |
416 const Cardinality c = MakeCardinality(new EvenCardinality); | |
417 | |
418 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
419 EXPECT_FALSE(c.IsSatisfiedByCallCount(3)); | |
420 | |
421 EXPECT_FALSE(c.IsSaturatedByCallCount(10000)); | |
422 | |
423 stringstream ss; | |
424 c.DescribeTo(&ss); | |
425 EXPECT_EQ("called even number of times", ss.str()); | |
426 } | |
427 | |
428 } // Unnamed namespace | |
OLD | NEW |