lazy_value_ut.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "lazy_value.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. Y_UNIT_TEST_SUITE(TLazyValueTestSuite) {
  4. Y_UNIT_TEST(TestLazyValue) {
  5. TLazyValue<int> value([]() {
  6. return 5;
  7. });
  8. UNIT_ASSERT(!value.WasLazilyInitialized());
  9. UNIT_ASSERT_EQUAL(*value, 5);
  10. UNIT_ASSERT(value.WasLazilyInitialized());
  11. }
  12. Y_UNIT_TEST(TestLazyValueInitialization) {
  13. TLazyValue<int> value1([]() { return 5; });
  14. TLazyValue<int> value2 = []() { return 5; };
  15. TLazyValue<int> notInitialized{};
  16. TLazyValue<int> copy1(value1);
  17. copy1 = value2;
  18. }
  19. Y_UNIT_TEST(TestLazyValueCopy) {
  20. TLazyValue<int> value([]() { return 5; });
  21. UNIT_ASSERT(!value.WasLazilyInitialized());
  22. TLazyValue<int> emptyCopy = value;
  23. UNIT_ASSERT(!emptyCopy.WasLazilyInitialized());
  24. UNIT_ASSERT_EQUAL(*emptyCopy, 5);
  25. UNIT_ASSERT(emptyCopy.WasLazilyInitialized());
  26. UNIT_ASSERT(!value.WasLazilyInitialized());
  27. UNIT_ASSERT_EQUAL(*value, 5);
  28. TLazyValue<int> notEmptyCopy = value;
  29. UNIT_ASSERT(notEmptyCopy.WasLazilyInitialized());
  30. UNIT_ASSERT_EQUAL(*notEmptyCopy, 5);
  31. }
  32. struct TCopyCounter {
  33. TCopyCounter(size_t& numCopies)
  34. : NumCopies(&numCopies)
  35. {
  36. }
  37. TCopyCounter() = default;
  38. TCopyCounter(const TCopyCounter& other)
  39. : NumCopies(other.NumCopies)
  40. {
  41. ++(*NumCopies);
  42. }
  43. TCopyCounter(TCopyCounter&&) = default;
  44. TCopyCounter& operator=(const TCopyCounter& other) {
  45. if (this == &other) {
  46. return *this;
  47. }
  48. NumCopies = other.NumCopies;
  49. ++(*NumCopies);
  50. return *this;
  51. }
  52. TCopyCounter& operator=(TCopyCounter&&) = default;
  53. size_t* NumCopies = nullptr;
  54. };
  55. Y_UNIT_TEST(TestLazyValueMoveValueInitialization) {
  56. size_t numCopies = 0;
  57. TCopyCounter counter{numCopies};
  58. TLazyValue<TCopyCounter> value{[v = std::move(counter)]() mutable { return std::move(v); }};
  59. value.InitDefault();
  60. UNIT_ASSERT_EQUAL(numCopies, 0);
  61. }
  62. Y_UNIT_TEST(TestLazyValueCopyValueInitialization) {
  63. size_t numCopies = 0;
  64. TCopyCounter counter{numCopies};
  65. TLazyValue<TCopyCounter> value{[&counter]() { return counter; }};
  66. UNIT_ASSERT_EQUAL(numCopies, 0);
  67. value.InitDefault();
  68. UNIT_ASSERT_EQUAL(numCopies, 1);
  69. }
  70. class TValueProvider {
  71. public:
  72. static size_t CountParseDataCalled;
  73. TValueProvider()
  74. : Data_([&] { return this->ParseData(); })
  75. {
  76. }
  77. const TString& GetData() const {
  78. return *Data_;
  79. }
  80. private:
  81. TLazyValue<TString> Data_;
  82. TString ParseData() {
  83. CountParseDataCalled++;
  84. return "hi";
  85. }
  86. };
  87. size_t TValueProvider::CountParseDataCalled = 0;
  88. Y_UNIT_TEST(TestValueProvider) {
  89. TValueProvider provider;
  90. UNIT_ASSERT(provider.GetData() == "hi");
  91. }
  92. Y_UNIT_TEST(TestValueProviderCopy) {
  93. TValueProvider provider;
  94. provider.GetData();
  95. const auto countParsed = TValueProvider::CountParseDataCalled;
  96. provider.GetData();
  97. UNIT_ASSERT_EQUAL(countParsed, TValueProvider::CountParseDataCalled);
  98. TValueProvider providerCopy;
  99. providerCopy = provider;
  100. providerCopy.GetData();
  101. UNIT_ASSERT_EQUAL(countParsed, TValueProvider::CountParseDataCalled);
  102. }
  103. Y_UNIT_TEST(TestEmptyProviderCopy) {
  104. TValueProvider provider;
  105. TValueProvider copy(provider);
  106. const auto countParsed = TValueProvider::CountParseDataCalled;
  107. provider.GetData();
  108. UNIT_ASSERT_EQUAL(countParsed + 1, TValueProvider::CountParseDataCalled);
  109. copy.GetData();
  110. UNIT_ASSERT_EQUAL(countParsed + 2, TValueProvider::CountParseDataCalled);
  111. const TValueProvider notEmptyCopy(copy);
  112. notEmptyCopy.GetData();
  113. UNIT_ASSERT_EQUAL(countParsed + 2, TValueProvider::CountParseDataCalled);
  114. }
  115. Y_UNIT_TEST(TestMakeLazy) {
  116. auto lv = MakeLazy([] {
  117. return 100500;
  118. });
  119. UNIT_ASSERT(!lv.WasLazilyInitialized());
  120. UNIT_ASSERT(lv.GetRef() == 100500);
  121. UNIT_ASSERT(lv.WasLazilyInitialized());
  122. }
  123. } // Y_UNIT_TEST_SUITE(TLazyValueTestSuite)