1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker // 15*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 16*9356374aSAndroid Build Coastguard Worker // File: mock_distributions.h 17*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 18*9356374aSAndroid Build Coastguard Worker // 19*9356374aSAndroid Build Coastguard Worker // This file contains mock distribution functions for use alongside an 20*9356374aSAndroid Build Coastguard Worker // `absl::MockingBitGen` object within the Googletest testing framework. Such 21*9356374aSAndroid Build Coastguard Worker // mocks are useful to provide deterministic values as return values within 22*9356374aSAndroid Build Coastguard Worker // (otherwise random) Abseil distribution functions. 23*9356374aSAndroid Build Coastguard Worker // 24*9356374aSAndroid Build Coastguard Worker // The return type of each function is a mock expectation object which 25*9356374aSAndroid Build Coastguard Worker // is used to set the match result. 26*9356374aSAndroid Build Coastguard Worker // 27*9356374aSAndroid Build Coastguard Worker // More information about the Googletest testing framework is available at 28*9356374aSAndroid Build Coastguard Worker // https://github.com/google/googletest 29*9356374aSAndroid Build Coastguard Worker // 30*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL and ON_CALL need to be made within the same DLL component as 31*9356374aSAndroid Build Coastguard Worker // the call to absl::Uniform and related methods, otherwise mocking will fail 32*9356374aSAndroid Build Coastguard Worker // since the underlying implementation creates a type-specific pointer which 33*9356374aSAndroid Build Coastguard Worker // will be distinct across different DLL boundaries. 34*9356374aSAndroid Build Coastguard Worker // 35*9356374aSAndroid Build Coastguard Worker // Example: 36*9356374aSAndroid Build Coastguard Worker // 37*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 38*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockUniform<int>(), Call(mock, 1, 1000)) 39*9356374aSAndroid Build Coastguard Worker // .WillRepeatedly(testing::ReturnRoundRobin({20, 40})); 40*9356374aSAndroid Build Coastguard Worker // 41*9356374aSAndroid Build Coastguard Worker // EXPECT_EQ(absl::Uniform<int>(gen, 1, 1000), 20); 42*9356374aSAndroid Build Coastguard Worker // EXPECT_EQ(absl::Uniform<int>(gen, 1, 1000), 40); 43*9356374aSAndroid Build Coastguard Worker // EXPECT_EQ(absl::Uniform<int>(gen, 1, 1000), 20); 44*9356374aSAndroid Build Coastguard Worker // EXPECT_EQ(absl::Uniform<int>(gen, 1, 1000), 40); 45*9356374aSAndroid Build Coastguard Worker 46*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_RANDOM_MOCK_DISTRIBUTIONS_H_ 47*9356374aSAndroid Build Coastguard Worker #define ABSL_RANDOM_MOCK_DISTRIBUTIONS_H_ 48*9356374aSAndroid Build Coastguard Worker 49*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h" 50*9356374aSAndroid Build Coastguard Worker #include "absl/random/bernoulli_distribution.h" 51*9356374aSAndroid Build Coastguard Worker #include "absl/random/beta_distribution.h" 52*9356374aSAndroid Build Coastguard Worker #include "absl/random/distributions.h" 53*9356374aSAndroid Build Coastguard Worker #include "absl/random/exponential_distribution.h" 54*9356374aSAndroid Build Coastguard Worker #include "absl/random/gaussian_distribution.h" 55*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/mock_overload_set.h" 56*9356374aSAndroid Build Coastguard Worker #include "absl/random/internal/mock_validators.h" 57*9356374aSAndroid Build Coastguard Worker #include "absl/random/log_uniform_int_distribution.h" 58*9356374aSAndroid Build Coastguard Worker #include "absl/random/mocking_bit_gen.h" 59*9356374aSAndroid Build Coastguard Worker #include "absl/random/poisson_distribution.h" 60*9356374aSAndroid Build Coastguard Worker #include "absl/random/zipf_distribution.h" 61*9356374aSAndroid Build Coastguard Worker 62*9356374aSAndroid Build Coastguard Worker namespace absl { 63*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 64*9356374aSAndroid Build Coastguard Worker 65*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 66*9356374aSAndroid Build Coastguard Worker // absl::MockUniform 67*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 68*9356374aSAndroid Build Coastguard Worker // 69*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Uniform. 70*9356374aSAndroid Build Coastguard Worker // 71*9356374aSAndroid Build Coastguard Worker // `absl::MockUniform` is a class template used in conjunction with Googletest's 72*9356374aSAndroid Build Coastguard Worker // `ON_CALL()` and `EXPECT_CALL()` macros. To use it, default-construct an 73*9356374aSAndroid Build Coastguard Worker // instance of it inside `ON_CALL()` or `EXPECT_CALL()`, and use `Call(...)` the 74*9356374aSAndroid Build Coastguard Worker // same way one would define mocks on a Googletest `MockFunction()`. 75*9356374aSAndroid Build Coastguard Worker // 76*9356374aSAndroid Build Coastguard Worker // Example: 77*9356374aSAndroid Build Coastguard Worker // 78*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 79*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockUniform<uint32_t>(), Call(mock)) 80*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(123456)); 81*9356374aSAndroid Build Coastguard Worker // auto x = absl::Uniform<uint32_t>(mock); 82*9356374aSAndroid Build Coastguard Worker // assert(x == 123456) 83*9356374aSAndroid Build Coastguard Worker // 84*9356374aSAndroid Build Coastguard Worker template <typename R> 85*9356374aSAndroid Build Coastguard Worker using MockUniform = random_internal::MockOverloadSetWithValidator< 86*9356374aSAndroid Build Coastguard Worker random_internal::UniformDistributionWrapper<R>, 87*9356374aSAndroid Build Coastguard Worker random_internal::UniformDistributionValidator<R>, 88*9356374aSAndroid Build Coastguard Worker R(IntervalClosedOpenTag, MockingBitGen&, R, R), 89*9356374aSAndroid Build Coastguard Worker R(IntervalClosedClosedTag, MockingBitGen&, R, R), 90*9356374aSAndroid Build Coastguard Worker R(IntervalOpenOpenTag, MockingBitGen&, R, R), 91*9356374aSAndroid Build Coastguard Worker R(IntervalOpenClosedTag, MockingBitGen&, R, R), R(MockingBitGen&, R, R), 92*9356374aSAndroid Build Coastguard Worker R(MockingBitGen&)>; 93*9356374aSAndroid Build Coastguard Worker 94*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 95*9356374aSAndroid Build Coastguard Worker // absl::MockBernoulli 96*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 97*9356374aSAndroid Build Coastguard Worker // 98*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Bernoulli. 99*9356374aSAndroid Build Coastguard Worker // 100*9356374aSAndroid Build Coastguard Worker // `absl::MockBernoulli` is a class used in conjunction with Googletest's 101*9356374aSAndroid Build Coastguard Worker // `ON_CALL()` and `EXPECT_CALL()` macros. To use it, default-construct an 102*9356374aSAndroid Build Coastguard Worker // instance of it inside `ON_CALL()` or `EXPECT_CALL()`, and use `Call(...)` the 103*9356374aSAndroid Build Coastguard Worker // same way one would define mocks on a Googletest `MockFunction()`. 104*9356374aSAndroid Build Coastguard Worker // 105*9356374aSAndroid Build Coastguard Worker // Example: 106*9356374aSAndroid Build Coastguard Worker // 107*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 108*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockBernoulli(), Call(mock, testing::_)) 109*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(false)); 110*9356374aSAndroid Build Coastguard Worker // assert(absl::Bernoulli(mock, 0.5) == false); 111*9356374aSAndroid Build Coastguard Worker // 112*9356374aSAndroid Build Coastguard Worker using MockBernoulli = 113*9356374aSAndroid Build Coastguard Worker random_internal::MockOverloadSet<absl::bernoulli_distribution, 114*9356374aSAndroid Build Coastguard Worker bool(MockingBitGen&, double)>; 115*9356374aSAndroid Build Coastguard Worker 116*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 117*9356374aSAndroid Build Coastguard Worker // absl::MockBeta 118*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 119*9356374aSAndroid Build Coastguard Worker // 120*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Beta. 121*9356374aSAndroid Build Coastguard Worker // 122*9356374aSAndroid Build Coastguard Worker // `absl::MockBeta` is a class used in conjunction with Googletest's `ON_CALL()` 123*9356374aSAndroid Build Coastguard Worker // and `EXPECT_CALL()` macros. To use it, default-construct an instance of it 124*9356374aSAndroid Build Coastguard Worker // inside `ON_CALL()` or `EXPECT_CALL()`, and use `Call(...)` the same way one 125*9356374aSAndroid Build Coastguard Worker // would define mocks on a Googletest `MockFunction()`. 126*9356374aSAndroid Build Coastguard Worker // 127*9356374aSAndroid Build Coastguard Worker // Example: 128*9356374aSAndroid Build Coastguard Worker // 129*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 130*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockBeta(), Call(mock, 3.0, 2.0)) 131*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(0.567)); 132*9356374aSAndroid Build Coastguard Worker // auto x = absl::Beta<double>(mock, 3.0, 2.0); 133*9356374aSAndroid Build Coastguard Worker // assert(x == 0.567); 134*9356374aSAndroid Build Coastguard Worker // 135*9356374aSAndroid Build Coastguard Worker template <typename RealType> 136*9356374aSAndroid Build Coastguard Worker using MockBeta = 137*9356374aSAndroid Build Coastguard Worker random_internal::MockOverloadSet<absl::beta_distribution<RealType>, 138*9356374aSAndroid Build Coastguard Worker RealType(MockingBitGen&, RealType, 139*9356374aSAndroid Build Coastguard Worker RealType)>; 140*9356374aSAndroid Build Coastguard Worker 141*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 142*9356374aSAndroid Build Coastguard Worker // absl::MockExponential 143*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 144*9356374aSAndroid Build Coastguard Worker // 145*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Exponential. 146*9356374aSAndroid Build Coastguard Worker // 147*9356374aSAndroid Build Coastguard Worker // `absl::MockExponential` is a class template used in conjunction with 148*9356374aSAndroid Build Coastguard Worker // Googletest's `ON_CALL()` and `EXPECT_CALL()` macros. To use it, 149*9356374aSAndroid Build Coastguard Worker // default-construct an instance of it inside `ON_CALL()` or `EXPECT_CALL()`, 150*9356374aSAndroid Build Coastguard Worker // and use `Call(...)` the same way one would define mocks on a 151*9356374aSAndroid Build Coastguard Worker // Googletest `MockFunction()`. 152*9356374aSAndroid Build Coastguard Worker // 153*9356374aSAndroid Build Coastguard Worker // Example: 154*9356374aSAndroid Build Coastguard Worker // 155*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 156*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockExponential<double>(), Call(mock, 0.5)) 157*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(12.3456789)); 158*9356374aSAndroid Build Coastguard Worker // auto x = absl::Exponential<double>(mock, 0.5); 159*9356374aSAndroid Build Coastguard Worker // assert(x == 12.3456789) 160*9356374aSAndroid Build Coastguard Worker // 161*9356374aSAndroid Build Coastguard Worker template <typename RealType> 162*9356374aSAndroid Build Coastguard Worker using MockExponential = 163*9356374aSAndroid Build Coastguard Worker random_internal::MockOverloadSet<absl::exponential_distribution<RealType>, 164*9356374aSAndroid Build Coastguard Worker RealType(MockingBitGen&, RealType)>; 165*9356374aSAndroid Build Coastguard Worker 166*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 167*9356374aSAndroid Build Coastguard Worker // absl::MockGaussian 168*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 169*9356374aSAndroid Build Coastguard Worker // 170*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Gaussian. 171*9356374aSAndroid Build Coastguard Worker // 172*9356374aSAndroid Build Coastguard Worker // `absl::MockGaussian` is a class template used in conjunction with 173*9356374aSAndroid Build Coastguard Worker // Googletest's `ON_CALL()` and `EXPECT_CALL()` macros. To use it, 174*9356374aSAndroid Build Coastguard Worker // default-construct an instance of it inside `ON_CALL()` or `EXPECT_CALL()`, 175*9356374aSAndroid Build Coastguard Worker // and use `Call(...)` the same way one would define mocks on a 176*9356374aSAndroid Build Coastguard Worker // Googletest `MockFunction()`. 177*9356374aSAndroid Build Coastguard Worker // 178*9356374aSAndroid Build Coastguard Worker // Example: 179*9356374aSAndroid Build Coastguard Worker // 180*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 181*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockGaussian<double>(), Call(mock, 16.3, 3.3)) 182*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(12.3456789)); 183*9356374aSAndroid Build Coastguard Worker // auto x = absl::Gaussian<double>(mock, 16.3, 3.3); 184*9356374aSAndroid Build Coastguard Worker // assert(x == 12.3456789) 185*9356374aSAndroid Build Coastguard Worker // 186*9356374aSAndroid Build Coastguard Worker template <typename RealType> 187*9356374aSAndroid Build Coastguard Worker using MockGaussian = 188*9356374aSAndroid Build Coastguard Worker random_internal::MockOverloadSet<absl::gaussian_distribution<RealType>, 189*9356374aSAndroid Build Coastguard Worker RealType(MockingBitGen&, RealType, 190*9356374aSAndroid Build Coastguard Worker RealType)>; 191*9356374aSAndroid Build Coastguard Worker 192*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 193*9356374aSAndroid Build Coastguard Worker // absl::MockLogUniform 194*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 195*9356374aSAndroid Build Coastguard Worker // 196*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::LogUniform. 197*9356374aSAndroid Build Coastguard Worker // 198*9356374aSAndroid Build Coastguard Worker // `absl::MockLogUniform` is a class template used in conjunction with 199*9356374aSAndroid Build Coastguard Worker // Googletest's `ON_CALL()` and `EXPECT_CALL()` macros. To use it, 200*9356374aSAndroid Build Coastguard Worker // default-construct an instance of it inside `ON_CALL()` or `EXPECT_CALL()`, 201*9356374aSAndroid Build Coastguard Worker // and use `Call(...)` the same way one would define mocks on a 202*9356374aSAndroid Build Coastguard Worker // Googletest `MockFunction()`. 203*9356374aSAndroid Build Coastguard Worker // 204*9356374aSAndroid Build Coastguard Worker // Example: 205*9356374aSAndroid Build Coastguard Worker // 206*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 207*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockLogUniform<int>(), Call(mock, 10, 10000, 10)) 208*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(1221)); 209*9356374aSAndroid Build Coastguard Worker // auto x = absl::LogUniform<int>(mock, 10, 10000, 10); 210*9356374aSAndroid Build Coastguard Worker // assert(x == 1221) 211*9356374aSAndroid Build Coastguard Worker // 212*9356374aSAndroid Build Coastguard Worker template <typename IntType> 213*9356374aSAndroid Build Coastguard Worker using MockLogUniform = random_internal::MockOverloadSet< 214*9356374aSAndroid Build Coastguard Worker absl::log_uniform_int_distribution<IntType>, 215*9356374aSAndroid Build Coastguard Worker IntType(MockingBitGen&, IntType, IntType, IntType)>; 216*9356374aSAndroid Build Coastguard Worker 217*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 218*9356374aSAndroid Build Coastguard Worker // absl::MockPoisson 219*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 220*9356374aSAndroid Build Coastguard Worker // 221*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Poisson. 222*9356374aSAndroid Build Coastguard Worker // 223*9356374aSAndroid Build Coastguard Worker // `absl::MockPoisson` is a class template used in conjunction with Googletest's 224*9356374aSAndroid Build Coastguard Worker // `ON_CALL()` and `EXPECT_CALL()` macros. To use it, default-construct an 225*9356374aSAndroid Build Coastguard Worker // instance of it inside `ON_CALL()` or `EXPECT_CALL()`, and use `Call(...)` the 226*9356374aSAndroid Build Coastguard Worker // same way one would define mocks on a Googletest `MockFunction()`. 227*9356374aSAndroid Build Coastguard Worker // 228*9356374aSAndroid Build Coastguard Worker // Example: 229*9356374aSAndroid Build Coastguard Worker // 230*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 231*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockPoisson<int>(), Call(mock, 2.0)) 232*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(1221)); 233*9356374aSAndroid Build Coastguard Worker // auto x = absl::Poisson<int>(mock, 2.0); 234*9356374aSAndroid Build Coastguard Worker // assert(x == 1221) 235*9356374aSAndroid Build Coastguard Worker // 236*9356374aSAndroid Build Coastguard Worker template <typename IntType> 237*9356374aSAndroid Build Coastguard Worker using MockPoisson = 238*9356374aSAndroid Build Coastguard Worker random_internal::MockOverloadSet<absl::poisson_distribution<IntType>, 239*9356374aSAndroid Build Coastguard Worker IntType(MockingBitGen&, double)>; 240*9356374aSAndroid Build Coastguard Worker 241*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 242*9356374aSAndroid Build Coastguard Worker // absl::MockZipf 243*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 244*9356374aSAndroid Build Coastguard Worker // 245*9356374aSAndroid Build Coastguard Worker // Matches calls to absl::Zipf. 246*9356374aSAndroid Build Coastguard Worker // 247*9356374aSAndroid Build Coastguard Worker // `absl::MockZipf` is a class template used in conjunction with Googletest's 248*9356374aSAndroid Build Coastguard Worker // `ON_CALL()` and `EXPECT_CALL()` macros. To use it, default-construct an 249*9356374aSAndroid Build Coastguard Worker // instance of it inside `ON_CALL()` or `EXPECT_CALL()`, and use `Call(...)` the 250*9356374aSAndroid Build Coastguard Worker // same way one would define mocks on a Googletest `MockFunction()`. 251*9356374aSAndroid Build Coastguard Worker // 252*9356374aSAndroid Build Coastguard Worker // Example: 253*9356374aSAndroid Build Coastguard Worker // 254*9356374aSAndroid Build Coastguard Worker // absl::MockingBitGen mock; 255*9356374aSAndroid Build Coastguard Worker // EXPECT_CALL(absl::MockZipf<int>(), Call(mock, 1000000, 2.0, 1.0)) 256*9356374aSAndroid Build Coastguard Worker // .WillOnce(Return(1221)); 257*9356374aSAndroid Build Coastguard Worker // auto x = absl::Zipf<int>(mock, 1000000, 2.0, 1.0); 258*9356374aSAndroid Build Coastguard Worker // assert(x == 1221) 259*9356374aSAndroid Build Coastguard Worker // 260*9356374aSAndroid Build Coastguard Worker template <typename IntType> 261*9356374aSAndroid Build Coastguard Worker using MockZipf = 262*9356374aSAndroid Build Coastguard Worker random_internal::MockOverloadSet<absl::zipf_distribution<IntType>, 263*9356374aSAndroid Build Coastguard Worker IntType(MockingBitGen&, IntType, double, 264*9356374aSAndroid Build Coastguard Worker double)>; 265*9356374aSAndroid Build Coastguard Worker 266*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 267*9356374aSAndroid Build Coastguard Worker } // namespace absl 268*9356374aSAndroid Build Coastguard Worker 269*9356374aSAndroid Build Coastguard Worker #endif // ABSL_RANDOM_MOCK_DISTRIBUTIONS_H_ 270