From 5e4ea9a88f0630cfbe4b8b2c307a483146677f09 Mon Sep 17 00:00:00 2001 From: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 18 Feb 2025 00:01:30 -0600 Subject: [PATCH] Add lru cache unit tests --- test/CMakeLists.txt | 1 + test/unit/internals/lru_cache.cpp | 104 ++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 test/unit/internals/lru_cache.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b4d03f7..f06cb18 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -84,6 +84,7 @@ if(NOT CPPTRACE_SKIP_UNIT) unit/tracing/from_current_z.cpp unit/tracing/traced_exception.cpp unit/internals/optional.cpp + unit/internals/lru_cache.cpp unit/internals/result.cpp unit/internals/string_utils.cpp unit/internals/general.cpp diff --git a/test/unit/internals/lru_cache.cpp b/test/unit/internals/lru_cache.cpp new file mode 100644 index 0000000..2efdb24 --- /dev/null +++ b/test/unit/internals/lru_cache.cpp @@ -0,0 +1,104 @@ +#include + +#include "utils/lru_cache.hpp" + +using cpptrace::detail::lru_cache; +using cpptrace::detail::nullopt; + +namespace { + +TEST(LruCacheTest, DefaultConstructor) { + lru_cache cache; + EXPECT_EQ(cache.size(), 0); +} + +TEST(LruCacheTest, MaybeGet) { + lru_cache cache; + auto result = cache.maybe_get(42); + EXPECT_FALSE(result.has_value()); +} + +TEST(LruCacheTest, InsertAndGet) { + lru_cache cache; + cache.insert(42, 50); + auto result = cache.maybe_get(42); + ASSERT_TRUE(result.has_value()); + EXPECT_EQ(result.unwrap(), 50); +} + +TEST(LruCacheTest, ConstGet) { + lru_cache cache; + cache.insert(42, 50); + const lru_cache& cache_ref = cache; + auto result = cache_ref.maybe_get(42); + ASSERT_TRUE(result.has_value()); + EXPECT_EQ(result.unwrap(), 50); +} + +TEST(LruCacheTest, Set) { + lru_cache cache; + cache.set(42, 50); + auto result = cache.maybe_get(42); + ASSERT_TRUE(result.has_value()); + EXPECT_EQ(result.unwrap(), 50); + cache.set(42, 60); + auto result2 = cache.maybe_get(42); + ASSERT_TRUE(result2.has_value()); + EXPECT_EQ(result2.unwrap(), 60); +} + +TEST(LruCacheTest, NoMaxSize) { + lru_cache cache; + for(int i = 0; i < 1000; i++) { + cache.insert(i, i + 50); + } + EXPECT_EQ(cache.size(), 1000); + for(int i = 0; i < 1000; i++) { + EXPECT_EQ(cache.maybe_get(i).unwrap(), i + 50); + } +} + +TEST(LruCacheTest, MaxSize) { + lru_cache cache(20); + for(int i = 0; i < 1000; i++) { + cache.insert(i, i + 50); + } + EXPECT_EQ(cache.size(), 20); + for(int i = 0; i < 1000 - 20; i++) { + EXPECT_FALSE(cache.maybe_get(i).has_value()); + } + for(int i = 1000 - 20; i < 1000; i++) { + EXPECT_EQ(cache.maybe_get(i).unwrap(), i + 50); + } +} + +TEST(LruCacheTest, SizeAfterInserts) { + lru_cache cache; + for(int i = 0; i < 1000; i++) { + cache.insert(i, i + 50); + } + EXPECT_EQ(cache.size(), 1000); + cache.set_max_size(20); + EXPECT_EQ(cache.size(), 20); + for(int i = 0; i < 1000 - 20; i++) { + EXPECT_FALSE(cache.maybe_get(i).has_value()); + } + for(int i = 1000 - 20; i < 1000; i++) { + EXPECT_EQ(cache.maybe_get(i).unwrap(), i + 50); + } +} + +TEST(LruCacheTest, Touch) { + lru_cache cache(20); + for(int i = 0; i < 1000; i++) { + cache.maybe_touch(0); + cache.insert(i, i + 50); + } + EXPECT_EQ(cache.size(), 20); + for(int i = 1000 - 19; i < 1000; i++) { + EXPECT_EQ(cache.maybe_get(i).unwrap(), i + 50); + } + EXPECT_EQ(cache.maybe_get(0).unwrap(), 50); +} + +}