/* * Copyright (c) 2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include // This has to go after Swiften/Base/LogSerializers.h. using namespace Swift; namespace b = boost; TEST(LRUCacheTest, testCacheLimit) { LRUCache testling; testling.insert("A", "AA"); testling.insert("B", "BB"); testling.insert("C", "CC"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional(), testling.get("D")); testling.insert("D", "DD"); ASSERT_EQ(b::optional(), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional("DD"), testling.get("D")); } TEST(LRUCacheTest, testMoveRecentToFrontOnGet) { LRUCache testling; testling.insert("A", "AA"); testling.insert("B", "BB"); testling.insert("C", "CC"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional(), testling.get("D")); ASSERT_EQ(b::optional("AA"), testling.get("A")); testling.insert("D", "DD"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional(), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional("DD"), testling.get("D")); } TEST(LRUCacheTest, testMoveRecentToFrontOnReinsert) { LRUCache testling; testling.insert("A", "AA"); testling.insert("B", "BB"); testling.insert("C", "CC"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional(), testling.get("D")); testling.insert("B", "BB"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional(), testling.get("D")); testling.insert("D", "DD"); ASSERT_EQ(b::optional(), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional("DD"), testling.get("D")); } TEST(LRUCacheTest, testCacheReturnsValuesPreviouslyInserted) { LRUCache testling; testling.insert("A", "AA"); testling.insert("B", "BB"); testling.insert("C", "CC"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C")); } TEST(LRUCacheTest, testCacheMissFunctionIsUsedOnCacheMiss) { LRUCache testling; testling.insert("A", "AA"); testling.insert("B", "BB"); ASSERT_EQ(b::optional("AA"), testling.get("A")); ASSERT_EQ(b::optional("BB"), testling.get("B")); ASSERT_EQ(b::optional("CC"), testling.get("C", [](const std::string&) { return boost::optional(std::string("CC")); })); ASSERT_EQ(b::optional("CC"), testling.get("C")); ASSERT_EQ(b::optional(), testling.get("D", [](const std::string&) { return boost::optional(); })); ASSERT_EQ(b::optional(), testling.get("D")); }