sliding_window_ut.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "sliding_window.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. using namespace NSlidingWindow;
  4. Y_UNIT_TEST_SUITE(TSlidingWindowTest) {
  5. Y_UNIT_TEST(TestSlidingWindowMax) {
  6. TSlidingWindow<TMaxOperation<unsigned>> w(TDuration::Minutes(5), 5);
  7. TInstant start = TInstant::MicroSeconds(TDuration::Hours(1).MicroSeconds());
  8. TInstant now = start;
  9. w.Update(5, start); // ~ ~ ~ ~ 5
  10. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  11. now += TDuration::Minutes(1) + TDuration::Seconds(1);
  12. w.Update(5, now); // 5 ~ ~ ~ 5
  13. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  14. now += TDuration::Minutes(1);
  15. w.Update(3, now); // 5 3 ~ ~ 5
  16. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  17. now += TDuration::Minutes(3);
  18. w.Update(2, now); // 5 3 ~ ~ 2
  19. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  20. now += TDuration::Minutes(1);
  21. w.Update(2, now); // 2 3 ~ ~ 2
  22. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 3); // ^
  23. now += TDuration::Minutes(1);
  24. w.Update(2, now); // 2 2 ~ ~ 2
  25. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 2); // ^
  26. now += TDuration::Minutes(5);
  27. w.Update(1, now); // ~ 1 ~ ~ ~
  28. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 1); // ^
  29. // update current bucket
  30. w.Update(2, now); // ~ 2 ~ ~ ~
  31. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 2); // ^
  32. w.Update(1, now + TDuration::Seconds(30)); // ~ 2 ~ ~ ~
  33. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 2); // ^
  34. // test idle
  35. now += TDuration::Minutes(1);
  36. w.Update(now); // ~ 2 ~ ~ ~
  37. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 2); // ^
  38. now += TDuration::Minutes(5); // ~ ~ ~ ~ ~
  39. UNIT_ASSERT_VALUES_EQUAL(w.Update(now), 0);
  40. }
  41. Y_UNIT_TEST(TestSlidingWindowMin) {
  42. TSlidingWindow<TMinOperation<unsigned>> w(TDuration::Minutes(5), 5);
  43. TInstant start = TInstant::MicroSeconds(TDuration::Hours(1).MicroSeconds());
  44. TInstant now = start;
  45. w.Update(5, start); // ~ ~ ~ ~ 5
  46. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  47. now += TDuration::Minutes(1) + TDuration::Seconds(1);
  48. w.Update(5, now); // 5 ~ ~ ~ 5
  49. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  50. now += TDuration::Minutes(1);
  51. w.Update(7, now); // 5 7 ~ ~ 5
  52. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  53. now += TDuration::Minutes(3);
  54. w.Update(8, now); // 5 7 ~ ~ 8
  55. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  56. now += TDuration::Minutes(1);
  57. w.Update(8, now); // 8 7 ~ ~ 8
  58. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 7); // ^
  59. now += TDuration::Minutes(1);
  60. w.Update(8, now); // 8 8 ~ ~ 8
  61. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 8); // ^
  62. now += TDuration::Minutes(5);
  63. w.Update(6, now); // ~ 6 ~ ~ ~
  64. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 6); // ^
  65. // update current bucket
  66. w.Update(5, now); // ~ 5 ~ ~ ~
  67. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  68. w.Update(6, now + TDuration::Seconds(30)); // ~ 5 ~ ~ ~
  69. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  70. // test idle
  71. now += TDuration::Minutes(1);
  72. w.Update(now); // ~ 5 ~ ~ ~
  73. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  74. now += TDuration::Minutes(5); // ~ ~ ~ ~ ~
  75. UNIT_ASSERT_VALUES_EQUAL(w.Update(now), std::numeric_limits<unsigned>::max());
  76. }
  77. Y_UNIT_TEST(TestSlidingWindowSum) {
  78. TSlidingWindow<TSumOperation<unsigned>> w(TDuration::Minutes(5), 5);
  79. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 0); // current sum
  80. TInstant start = TInstant::MicroSeconds(TDuration::Hours(1).MicroSeconds());
  81. TInstant now = start;
  82. w.Update(5, start); // 0 0 0 0 5
  83. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 5); // ^
  84. now += TDuration::Minutes(1) + TDuration::Seconds(1);
  85. w.Update(5, now); // 5 0 0 0 5
  86. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 10); // ^
  87. now += TDuration::Minutes(1);
  88. w.Update(3, now); // 5 3 0 0 5
  89. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 13); // ^
  90. now += TDuration::Minutes(3);
  91. w.Update(2, now); // 5 3 0 0 2
  92. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 10); // ^
  93. now += TDuration::Minutes(1);
  94. w.Update(2, now); // 2 3 0 0 2
  95. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 7); // ^
  96. now += TDuration::Minutes(1);
  97. w.Update(2, now); // 2 2 0 0 2
  98. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 6); // ^
  99. now += TDuration::Minutes(5);
  100. w.Update(1, now); // 0 1 0 0 0
  101. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 1); // ^
  102. // update current bucket
  103. w.Update(2, now); // 0 3 0 0 0
  104. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 3); // ^
  105. w.Update(1, now + TDuration::Seconds(30)); // 0 4 0 0 0
  106. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 4); // ^
  107. // test idle
  108. now += TDuration::Minutes(1);
  109. w.Update(now); // 0 4 0 0 0
  110. UNIT_ASSERT_VALUES_EQUAL(w.GetValue(), 4); // ^
  111. now += TDuration::Minutes(5); // 0 0 0 0 0
  112. UNIT_ASSERT_VALUES_EQUAL(w.Update(now), 0);
  113. }
  114. }