jitter_calculator_unittest.cc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Copyright 2022 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 "ash/ambient/ui/jitter_calculator.h"
  5. #include <limits>
  6. #include "base/bind.h"
  7. #include "testing/gmock/include/gmock/gmock.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. #include "ui/gfx/geometry/vector2d.h"
  10. namespace ash {
  11. namespace {
  12. using ::testing::AnyOf;
  13. using ::testing::Eq;
  14. using ::testing::Ge;
  15. using ::testing::Le;
  16. } // namespace
  17. class JitterCalculatorTest : public ::testing::Test {
  18. protected:
  19. void set_random_binary(int random_binary) { random_binary_ = random_binary; }
  20. JitterCalculator::RandomBinaryGenerator GetRandomBinaryGenerator() {
  21. return base::BindRepeating(&JitterCalculatorTest::GenerateRandomBinary,
  22. base::Unretained(this));
  23. }
  24. private:
  25. int GenerateRandomBinary() { return random_binary_; }
  26. int random_binary_ = 1;
  27. };
  28. TEST_F(JitterCalculatorTest, CalculateHonorsConfig) {
  29. JitterCalculator::Config config;
  30. config.step_size = 2;
  31. config.x_min_translation = -10;
  32. config.x_max_translation = 10;
  33. config.y_min_translation = -20;
  34. config.y_max_translation = 20;
  35. JitterCalculator calculator(config, GetRandomBinaryGenerator());
  36. int max_x_translation_observed = std::numeric_limits<int>::min();
  37. int min_x_translation_observed = std::numeric_limits<int>::max();
  38. int max_y_translation_observed = std::numeric_limits<int>::min();
  39. int min_y_translation_observed = std::numeric_limits<int>::max();
  40. gfx::Vector2d previous_translation;
  41. for (int i = 0; i < 200; ++i, set_random_binary(i % 2)) {
  42. gfx::Vector2d translation = calculator.Calculate();
  43. gfx::Vector2d step(translation);
  44. step.Subtract(previous_translation);
  45. max_x_translation_observed =
  46. std::max(translation.x(), max_x_translation_observed);
  47. min_x_translation_observed =
  48. std::min(translation.x(), min_x_translation_observed);
  49. max_y_translation_observed =
  50. std::max(translation.y(), max_y_translation_observed);
  51. min_y_translation_observed =
  52. std::min(translation.y(), min_y_translation_observed);
  53. ASSERT_THAT(step.x(), AnyOf(Eq(0), Eq(2), Eq(-2)));
  54. ASSERT_THAT(step.y(), AnyOf(Eq(0), Eq(2), Eq(-2)));
  55. previous_translation = translation;
  56. }
  57. EXPECT_THAT(max_x_translation_observed, Eq(10));
  58. EXPECT_THAT(min_x_translation_observed, Eq(-10));
  59. EXPECT_THAT(max_y_translation_observed, Eq(20));
  60. EXPECT_THAT(min_y_translation_observed, Eq(-20));
  61. }
  62. TEST_F(JitterCalculatorTest, AllowsFor0MinMaxTranslation) {
  63. JitterCalculator::Config config;
  64. config.step_size = 2;
  65. config.x_min_translation = 0;
  66. config.x_max_translation = 10;
  67. config.y_min_translation = -20;
  68. config.y_max_translation = 0;
  69. JitterCalculator calculator(config, GetRandomBinaryGenerator());
  70. int min_x_translation_observed = std::numeric_limits<int>::max();
  71. int max_y_translation_observed = std::numeric_limits<int>::min();
  72. for (int i = 0; i < 200; ++i, set_random_binary(i % 2)) {
  73. gfx::Vector2d translation = calculator.Calculate();
  74. min_x_translation_observed =
  75. std::min(translation.x(), min_x_translation_observed);
  76. max_y_translation_observed =
  77. std::max(translation.y(), max_y_translation_observed);
  78. }
  79. EXPECT_THAT(min_x_translation_observed, Eq(0));
  80. EXPECT_THAT(max_y_translation_observed, Eq(0));
  81. }
  82. } // namespace ash