| 58 | // 7 + 3 = 10 total elements in cache |
| 59 | |
| 60 | TEST(LruMultiCache, BasicTests) { |
| 61 | LruMultiCache<std::string, TestType> cache(100); |
| 62 | |
| 63 | const size_t num_of_parallel_keys = 5; |
| 64 | std::string keys[num_of_parallel_keys] = {"a", "b", "c", "d", "e"}; |
| 65 | int value_bases[num_of_parallel_keys] = {1, 10, 100, 1000, 10000}; |
| 66 | |
| 67 | for (size_t i = 0; i < 5; i++) { |
| 68 | std::string& key = keys[i]; |
| 69 | int& value_base = value_bases[i]; |
| 70 | |
| 71 | // {} |
| 72 | ASSERT_EQ(nullptr, cache.Get(key).Get()); |
| 73 | |
| 74 | auto value = cache.EmplaceAndGet(key, value_base, 1.0f); |
| 75 | |
| 76 | ASSERT_EQ(nullptr, cache.Get(key).Get()); |
| 77 | |
| 78 | value.Release(); |
| 79 | |
| 80 | // 1 |
| 81 | value = cache.Get(key); |
| 82 | |
| 83 | ASSERT_NE(nullptr, value.Get()); |
| 84 | |
| 85 | value.Release(); |
| 86 | |
| 87 | auto value2 = cache.EmplaceAndGet(key, value_base + 1, 1.0f); |
| 88 | |
| 89 | value = cache.Get(key); |
| 90 | |
| 91 | ASSERT_EQ(value_base, value.Get()->i); |
| 92 | |
| 93 | value.Release(); |
| 94 | value2.Release(); |
| 95 | // 2 -> 1 |
| 96 | } |
| 97 | |
| 98 | ASSERT_EQ(10, cache.Size()); |
| 99 | ASSERT_EQ(10, cache.NumberOfAvailableObjects()); |
| 100 | |
| 101 | for (size_t i = 0; i < 5; i++) { |
| 102 | std::string& key = keys[i]; |
| 103 | int& value_base = value_bases[i]; |
| 104 | |
| 105 | // 2 -> 1 |
| 106 | auto value2 = cache.Get(key); |
| 107 | |
| 108 | ASSERT_EQ(value_base + 1, value2.Get()->i); |
| 109 | |
| 110 | auto value = cache.Get(key); |
| 111 | |
| 112 | ASSERT_EQ(value_base, value.Get()->i); |
| 113 | |
| 114 | value2.Release(); |
| 115 | value.Release(); |
| 116 | |
| 117 | // 1 -> 2 |
nothing calls this directly
no test coverage detected