// Copyright 2018 The Abseil Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "absl/random/mock_distributions.h" #include #include #include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/numeric/int128.h" #include "absl/random/distributions.h" #include "absl/random/mocking_bit_gen.h" #include "absl/random/random.h" namespace { using ::testing::Return; TEST(MockDistributions, Examples) { absl::MockingBitGen gen; EXPECT_NE(absl::Uniform(gen, 1, 1000000), 20); EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 1000000)) .WillOnce(Return(20)); EXPECT_EQ(absl::Uniform(gen, 1, 1000000), 20); EXPECT_NE(absl::Uniform(gen, 0.0, 100.0), 5.0); EXPECT_CALL(absl::MockUniform(), Call(gen, 0.0, 100.0)) .WillOnce(Return(5.0)); EXPECT_EQ(absl::Uniform(gen, 0.0, 100.0), 5.0); EXPECT_NE(absl::Exponential(gen, 1.0), 42); EXPECT_CALL(absl::MockExponential(), Call(gen, 1.0)) .WillOnce(Return(42)); EXPECT_EQ(absl::Exponential(gen, 1.0), 42); EXPECT_NE(absl::Poisson(gen, 1.0), 500); EXPECT_CALL(absl::MockPoisson(), Call(gen, 1.0)).WillOnce(Return(500)); EXPECT_EQ(absl::Poisson(gen, 1.0), 500); EXPECT_NE(absl::Bernoulli(gen, 0.000001), true); EXPECT_CALL(absl::MockBernoulli(), Call(gen, 0.000001)) .WillOnce(Return(true)); EXPECT_EQ(absl::Bernoulli(gen, 0.000001), true); EXPECT_NE(absl::Beta(gen, 3.0, 2.0), 0.567); EXPECT_CALL(absl::MockBeta(), Call(gen, 3.0, 2.0)) .WillOnce(Return(0.567)); EXPECT_EQ(absl::Beta(gen, 3.0, 2.0), 0.567); EXPECT_NE(absl::Zipf(gen, 1000000, 2.0, 1.0), 1221); EXPECT_CALL(absl::MockZipf(), Call(gen, 1000000, 2.0, 1.0)) .WillOnce(Return(1221)); EXPECT_EQ(absl::Zipf(gen, 1000000, 2.0, 1.0), 1221); EXPECT_NE(absl::Gaussian(gen, 0.0, 1.0), 0.001); EXPECT_CALL(absl::MockGaussian(), Call(gen, 0.0, 1.0)) .WillOnce(Return(0.001)); EXPECT_EQ(absl::Gaussian(gen, 0.0, 1.0), 0.001); EXPECT_NE(absl::LogUniform(gen, 0, 1000000, 2), 2040); EXPECT_CALL(absl::MockLogUniform(), Call(gen, 0, 1000000, 2)) .WillOnce(Return(2040)); EXPECT_EQ(absl::LogUniform(gen, 0, 1000000, 2), 2040); } TEST(MockUniform, OutOfBoundsIsAllowed) { absl::UnvalidatedMockingBitGen gen; EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)).WillOnce(Return(0)); EXPECT_EQ(absl::Uniform(gen, 1, 100), 0); } TEST(ValidatedMockDistributions, UniformUInt128Works) { absl::MockingBitGen gen; EXPECT_CALL(absl::MockUniform(), Call(gen)) .WillOnce(Return(absl::Uint128Max())); EXPECT_EQ(absl::Uniform(gen), absl::Uint128Max()); } TEST(ValidatedMockDistributions, UniformDoubleBoundaryCases) { absl::MockingBitGen gen; EXPECT_CALL(absl::MockUniform(), Call(gen, 1.0, 10.0)) .WillOnce(Return( std::nextafter(10.0, -std::numeric_limits::infinity()))); EXPECT_EQ(absl::Uniform(gen, 1.0, 10.0), std::nextafter(10.0, -std::numeric_limits::infinity())); EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1.0, 10.0)) .WillOnce(Return( std::nextafter(10.0, -std::numeric_limits::infinity()))); EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), std::nextafter(10.0, -std::numeric_limits::infinity())); EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1.0, 10.0)) .WillOnce( Return(std::nextafter(1.0, std::numeric_limits::infinity()))); EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), std::nextafter(1.0, std::numeric_limits::infinity())); } TEST(ValidatedMockDistributions, UniformDoubleEmptyRangeCases) { absl::MockingBitGen gen; ON_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1.0, 1.0)) .WillByDefault(Return(1.0)); EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 1.0), 1.0); ON_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1.0, 1.0)) .WillByDefault(Return(1.0)); EXPECT_EQ(absl::Uniform(absl::IntervalOpenClosed, gen, 1.0, 1.0), 1.0); ON_CALL(absl::MockUniform(), Call(absl::IntervalClosedOpen, gen, 1.0, 1.0)) .WillByDefault(Return(1.0)); EXPECT_EQ(absl::Uniform(absl::IntervalClosedOpen, gen, 1.0, 1.0), 1.0); } TEST(ValidatedMockDistributions, UniformIntEmptyRangeCases) { absl::MockingBitGen gen; ON_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1, 1)) .WillByDefault(Return(1)); EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1, 1), 1); ON_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1, 1)) .WillByDefault(Return(1)); EXPECT_EQ(absl::Uniform(absl::IntervalOpenClosed, gen, 1, 1), 1); ON_CALL(absl::MockUniform(), Call(absl::IntervalClosedOpen, gen, 1, 1)) .WillByDefault(Return(1)); EXPECT_EQ(absl::Uniform(absl::IntervalClosedOpen, gen, 1, 1), 1); } TEST(ValidatedMockUniformDeathTest, Examples) { absl::MockingBitGen gen; EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)) .WillOnce(Return(0)); absl::Uniform(gen, 1, 100); }, " 0 is not in \\[1, 100\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)) .WillOnce(Return(101)); absl::Uniform(gen, 1, 100); }, " 101 is not in \\[1, 100\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(gen, 1, 100)) .WillOnce(Return(100)); absl::Uniform(gen, 1, 100); }, " 100 is not in \\[1, 100\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1, 100)) .WillOnce(Return(1)); absl::Uniform(absl::IntervalOpen, gen, 1, 100); }, " 1 is not in \\(1, 100\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1, 100)) .WillOnce(Return(101)); absl::Uniform(absl::IntervalOpen, gen, 1, 100); }, " 101 is not in \\(1, 100\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1, 100)) .WillOnce(Return(100)); absl::Uniform(absl::IntervalOpen, gen, 1, 100); }, " 100 is not in \\(1, 100\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1, 100)) .WillOnce(Return(1)); absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); }, " 1 is not in \\(1, 100\\]"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1, 100)) .WillOnce(Return(101)); absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); }, " 101 is not in \\(1, 100\\]"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1, 100)) .WillOnce(Return(0)); absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); }, " 0 is not in \\(1, 100\\]"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpenClosed, gen, 1, 100)) .WillOnce(Return(101)); absl::Uniform(absl::IntervalOpenClosed, gen, 1, 100); }, " 101 is not in \\(1, 100\\]"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalClosed, gen, 1, 100)) .WillOnce(Return(0)); absl::Uniform(absl::IntervalClosed, gen, 1, 100); }, " 0 is not in \\[1, 100\\]"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalClosed, gen, 1, 100)) .WillOnce(Return(101)); absl::Uniform(absl::IntervalClosed, gen, 1, 100); }, " 101 is not in \\[1, 100\\]"); } TEST(ValidatedMockUniformDeathTest, DoubleBoundaryCases) { absl::MockingBitGen gen; EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(gen, 1.0, 10.0)) .WillOnce(Return(10.0)); EXPECT_EQ(absl::Uniform(gen, 1.0, 10.0), 10.0); }, " 10 is not in \\[1, 10\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1.0, 10.0)) .WillOnce(Return(10.0)); EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), 10.0); }, " 10 is not in \\(1, 10\\)"); EXPECT_DEATH_IF_SUPPORTED( { EXPECT_CALL(absl::MockUniform(), Call(absl::IntervalOpen, gen, 1.0, 10.0)) .WillOnce(Return(1.0)); EXPECT_EQ(absl::Uniform(absl::IntervalOpen, gen, 1.0, 10.0), 1.0); }, " 1 is not in \\(1, 10\\)"); } } // namespace