platform_sensor_util_unittest.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/device/generic_sensor/platform_sensor_util.h"
  5. #include <limits>
  6. #include "testing/gmock/include/gmock/gmock.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace device {
  9. using mojom::SensorType;
  10. TEST(PlatformSensorUtil, RoundPositive) {
  11. EXPECT_DOUBLE_EQ(1.2, RoundToMultiple(1.20, 0.1));
  12. EXPECT_DOUBLE_EQ(1.2, RoundToMultiple(1.24, 0.1));
  13. EXPECT_DOUBLE_EQ(1.3, RoundToMultiple(1.25, 0.1));
  14. EXPECT_DOUBLE_EQ(1.3, RoundToMultiple(1.29, 0.1));
  15. }
  16. TEST(PlatformSensorUtil, RoundNegative) {
  17. EXPECT_DOUBLE_EQ(-1.2, RoundToMultiple(-1.20, 0.1));
  18. EXPECT_DOUBLE_EQ(-1.2, RoundToMultiple(-1.24, 0.1));
  19. EXPECT_DOUBLE_EQ(-1.3, RoundToMultiple(-1.25, 0.1));
  20. EXPECT_DOUBLE_EQ(-1.3, RoundToMultiple(-1.29, 0.1));
  21. }
  22. TEST(PlatformSensorUtil, RoundZero) {
  23. EXPECT_DOUBLE_EQ(0.0, RoundToMultiple(0.0, 0.1));
  24. }
  25. TEST(PlatformSensorUtil, RoundMax) {
  26. EXPECT_DOUBLE_EQ(std::numeric_limits<double>::max(),
  27. RoundToMultiple(std::numeric_limits<double>::max(), 0.1));
  28. EXPECT_DOUBLE_EQ(std::numeric_limits<double>::max(),
  29. RoundToMultiple(std::numeric_limits<double>::max(), 5.0));
  30. }
  31. TEST(PlatformSensorUtil, RoundLowest) {
  32. EXPECT_DOUBLE_EQ(std::numeric_limits<double>::lowest(),
  33. RoundToMultiple(std::numeric_limits<double>::lowest(), 0.1));
  34. EXPECT_DOUBLE_EQ(std::numeric_limits<double>::lowest(),
  35. RoundToMultiple(std::numeric_limits<double>::lowest(), 5.0));
  36. }
  37. TEST(PlatformSensorUtil, RoundMin) {
  38. EXPECT_DOUBLE_EQ(0.0,
  39. RoundToMultiple(std::numeric_limits<double>::min(), 0.1));
  40. EXPECT_DOUBLE_EQ(0.0,
  41. RoundToMultiple(std::numeric_limits<double>::min(), 5.0));
  42. }
  43. TEST(PlatformSensorUtil, RoundQuaternion) {
  44. // A hard coded quaternion and known outputs.
  45. SensorReadingQuat quat;
  46. quat.x = 0.408333;
  47. quat.y = -0.694318;
  48. quat.z = -0.107955;
  49. quat.w = 0.582693;
  50. RoundOrientationQuaternionReading(&quat);
  51. EXPECT_DOUBLE_EQ(0.40879894045956067, quat.x);
  52. EXPECT_DOUBLE_EQ(-0.69400288443777802, quat.y);
  53. EXPECT_DOUBLE_EQ(-0.10747054463443845, quat.z);
  54. EXPECT_DOUBLE_EQ(0.58283231268278346, quat.w);
  55. // Test Quaternion with zero angle to detect division by zero.
  56. quat.x = 0.408333;
  57. quat.y = -0.694318;
  58. quat.z = -0.107955;
  59. quat.w = 1.0; // This is a zero rotation value.
  60. RoundOrientationQuaternionReading(&quat);
  61. EXPECT_DOUBLE_EQ(0.0, quat.x);
  62. EXPECT_DOUBLE_EQ(0.0, quat.y);
  63. EXPECT_DOUBLE_EQ(0.0, quat.z);
  64. EXPECT_DOUBLE_EQ(1.0, quat.w);
  65. // w is set to cos(angle/2), but when rounding this operation is done:
  66. //
  67. // cos(round(acos(w)*2)/2)
  68. //
  69. // Which results is a bit more floating point error than EXPECT_DOUBLE_EQ
  70. // can tolerate, so explicitly verify less than some small value.
  71. const double epsilon = 1.0e-15;
  72. quat.x = std::sqrt(2.0) / 2.0;
  73. quat.y = 0.0;
  74. quat.z = std::sqrt(2.0) / 2.0;
  75. quat.w = 0.0;
  76. RoundOrientationQuaternionReading(&quat);
  77. EXPECT_DOUBLE_EQ(std::sqrt(2.0) / 2.0, quat.x);
  78. EXPECT_LT(std::abs(quat.y), epsilon);
  79. EXPECT_DOUBLE_EQ(std::sqrt(2.0) / 2.0, quat.z);
  80. EXPECT_LT(std::abs(quat.w), epsilon);
  81. }
  82. } // namespace device