1 #include <gtest/gtest.h>
2 
3 #include <private/dvr/numeric.h>
4 
5 using TestTypes = ::testing::Types<float, double, int>;
6 
7 using android::dvr::RandomInRange;
8 
9 template <typename T>
10 class NumericTest : public ::testing::TestWithParam<T> {
11  public:
12   using FT = T;
13 };
14 
15 TYPED_TEST_CASE(NumericTest, TestTypes);
16 
TYPED_TEST(NumericTest,RandomInRange)17 TYPED_TEST(NumericTest, RandomInRange) {
18   using FT = typename TestFixture::FT;
19 
20   const int kNumTrials = 50;
21   const FT kLowRange = static_cast<FT>(-100);
22   const FT kHighRange = static_cast<FT>(100);
23 
24   for (int i = 0; i < kNumTrials; ++i) {
25     FT value = RandomInRange(kLowRange, kHighRange);
26 
27     EXPECT_LE(kLowRange, value);
28     EXPECT_GE(kHighRange, value);
29   }
30 }
31 
TEST(RandomInRange,TestIntVersion)32 TEST(RandomInRange, TestIntVersion) {
33   // This checks specifically that the function does not always give the lo
34   // value (this was previously a bug)
35 
36   const int kNumTrials = 50;
37   const int kLowRange = -100;
38   const int kHighRange = 100;
39 
40   for (int i = 0; i < kNumTrials; ++i) {
41     int value = RandomInRange(kLowRange, kHighRange);
42 
43     if (value != kLowRange) {
44       SUCCEED();
45       return;
46     }
47   }
48 
49   FAIL() << "Did not produce a value other than the range minimum for "
50          << "integers.";
51 }
52 
TEST(RandomInRange,TestVectorVersion)53 TEST(RandomInRange, TestVectorVersion) {
54   Eigen::Vector3d lo(-3.0, -4.0, -5.0);
55   Eigen::Vector3d hi(5.0, 4.0, 3.0);
56 
57   const int kNumTrials = 50;
58 
59   for (int i = 0; i < kNumTrials; ++i) {
60     Eigen::Vector3d result = RandomInRange(lo, hi);
61 
62     for (int j = 0; j < 3; ++j) {
63       EXPECT_LE(lo[j], result[j]);
64       EXPECT_GE(hi[j], result[j]);
65     }
66   }
67 }
68