15 #include "absl/random/internal/uniform_helper.h"
21 #include "gtest/gtest.h"
35 TEST_F(UniformHelperTest, UniformBoundFunctionsGeneral) {
36 constexpr IntervalClosedClosedTag IntervalClosedClosed;
37 constexpr IntervalClosedOpenTag IntervalClosedOpen;
38 constexpr IntervalOpenClosedTag IntervalOpenClosed;
39 constexpr IntervalOpenOpenTag IntervalOpenOpen;
46 EXPECT_GT(uniform_lower_bound<float>(IntervalOpenClosed, 0, 1.0), 0);
47 EXPECT_GT(uniform_lower_bound<float>(IntervalOpenOpen, 0, 1.0), 0);
48 EXPECT_GT(uniform_lower_bound<double>(IntervalOpenClosed, 0, 1.0), 0);
49 EXPECT_GT(uniform_lower_bound<double>(IntervalOpenOpen, 0, 1.0), 0);
53 EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedClosed, 0, 1.0), 0);
54 EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedOpen, 0, 1.0), 0);
55 EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedClosed, 0, 1.0), 0);
56 EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedOpen, 0, 1.0), 0);
60 EXPECT_EQ(uniform_upper_bound<float>(IntervalOpenOpen, 0, 1.0), 1.0);
61 EXPECT_EQ(uniform_upper_bound<float>(IntervalClosedOpen, 0, 1.0), 1.0);
62 EXPECT_EQ(uniform_upper_bound<double>(IntervalOpenOpen, 0, 1.0), 1.0);
63 EXPECT_EQ(uniform_upper_bound<double>(IntervalClosedOpen, 0, 1.0), 1.0);
67 EXPECT_GT(uniform_upper_bound<float>(IntervalOpenClosed, 0, 1.0), 1.0);
68 EXPECT_GT(uniform_upper_bound<float>(IntervalClosedClosed, 0, 1.0), 1.0);
69 EXPECT_GT(uniform_upper_bound<double>(IntervalOpenClosed, 0, 1.0), 1.0);
70 EXPECT_GT(uniform_upper_bound<double>(IntervalClosedClosed, 0, 1.0), 1.0);
75 EXPECT_GT(uniform_lower_bound<float>(IntervalOpenClosed, -2.0, -1.0), -2.0);
76 EXPECT_GT(uniform_lower_bound<float>(IntervalOpenOpen, -2.0, -1.0), -2.0);
77 EXPECT_GT(uniform_lower_bound<double>(IntervalOpenClosed, -2.0, -1.0), -2.0);
78 EXPECT_GT(uniform_lower_bound<double>(IntervalOpenOpen, -2.0, -1.0), -2.0);
82 EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedClosed, -2.0, -1.0), -2.0);
83 EXPECT_EQ(uniform_lower_bound<float>(IntervalClosedOpen, -2.0, -1.0), -2.0);
84 EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedClosed, -2.0, -1.0),
86 EXPECT_EQ(uniform_lower_bound<double>(IntervalClosedOpen, -2.0, -1.0), -2.0);
90 EXPECT_EQ(uniform_upper_bound<float>(IntervalOpenOpen, -2.0, -1.0), -1.0);
91 EXPECT_EQ(uniform_upper_bound<float>(IntervalClosedOpen, -2.0, -1.0), -1.0);
92 EXPECT_EQ(uniform_upper_bound<double>(IntervalOpenOpen, -2.0, -1.0), -1.0);
93 EXPECT_EQ(uniform_upper_bound<double>(IntervalClosedOpen, -2.0, -1.0), -1.0);
97 EXPECT_GT(uniform_upper_bound<float>(IntervalOpenClosed, -2.0, -1.0), -1.0);
98 EXPECT_GT(uniform_upper_bound<float>(IntervalClosedClosed, -2.0, -1.0), -1.0);
99 EXPECT_GT(uniform_upper_bound<double>(IntervalOpenClosed, -2.0, -1.0), -1.0);
100 EXPECT_GT(uniform_upper_bound<double>(IntervalClosedClosed, -2.0, -1.0),
109 TEST_F(UniformHelperTest, UniformBoundFunctionsIntBounds) {
112 constexpr IntervalOpenOpenTag IntervalOpenOpen;
135 TEST_F(UniformHelperTest, UniformBoundFunctionsRealBounds) {
138 constexpr IntervalOpenClosedTag IntervalOpenClosed;
146 const auto re = std::nexttoward(
r, 0.0);
147 constexpr
auto l = -
r;
148 const auto le = std::nexttoward(
l, 0.0);
165 const double e = std::nextafter(1.0, 2.0);
166 const double f = std::nextafter(1.0, 0.0);
178 const double g = std::numeric_limits<double>::denorm_min();
179 const double h = std::nextafter(
g, 1.0);
195 template <
typename A,
typename B>
196 auto InferredUniformReturnT(
int) -> uniform_inferred_return_t<A, B>;
198 template <
typename,
typename>
199 Invalid InferredUniformReturnT(...);
214 template <
typename A,
typename B,
typename Expect>
215 void CheckArgsInferType() {
218 std::is_same<
Expect, decltype(InferredUniformReturnT<A, B>(0))>,
220 decltype(InferredUniformReturnT<B, A>(0))>>::
value,
224 TEST_F(UniformHelperTest, UniformTypeInference) {
226 CheckArgsInferType<uint16_t, uint16_t, uint16_t>();
227 CheckArgsInferType<uint32_t, uint32_t, uint32_t>();
228 CheckArgsInferType<uint64_t, uint64_t, uint64_t>();
229 CheckArgsInferType<int16_t, int16_t, int16_t>();
230 CheckArgsInferType<int32_t, int32_t, int32_t>();
231 CheckArgsInferType<int64_t, int64_t, int64_t>();
232 CheckArgsInferType<float, float, float>();
233 CheckArgsInferType<double, double, double>();
236 CheckArgsInferType<uint16_t, uint32_t, uint32_t>();
237 CheckArgsInferType<uint16_t, uint64_t, uint64_t>();
238 CheckArgsInferType<uint16_t, int32_t, int32_t>();
239 CheckArgsInferType<uint16_t, int64_t, int64_t>();
240 CheckArgsInferType<uint16_t, float, float>();
241 CheckArgsInferType<uint16_t, double, double>();
244 CheckArgsInferType<int16_t, int32_t, int32_t>();
245 CheckArgsInferType<int16_t, int64_t, int64_t>();
246 CheckArgsInferType<int16_t, float, float>();
247 CheckArgsInferType<int16_t, double, double>();
251 CheckArgsInferType<uint16_t, int16_t, Invalid>();
252 CheckArgsInferType<int16_t, uint32_t, Invalid>();
253 CheckArgsInferType<int16_t, uint64_t, Invalid>();
256 CheckArgsInferType<uint32_t, uint64_t, uint64_t>();
257 CheckArgsInferType<uint32_t, int64_t, int64_t>();
258 CheckArgsInferType<uint32_t, double, double>();
261 CheckArgsInferType<int32_t, int64_t, int64_t>();
262 CheckArgsInferType<int32_t, double, double>();
265 CheckArgsInferType<uint32_t, int32_t, Invalid>();
266 CheckArgsInferType<int32_t, uint64_t, Invalid>();
267 CheckArgsInferType<int32_t, float, Invalid>();
268 CheckArgsInferType<uint32_t, float, Invalid>();
271 CheckArgsInferType<uint64_t, int64_t, Invalid>();
272 CheckArgsInferType<int64_t, float, Invalid>();
273 CheckArgsInferType<int64_t, double, Invalid>();
276 CheckArgsInferType<float, double, double>();