blob: 914b15db53f55b719c200a66c8ec09ff1aba5672 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/wtf/lru_cache.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
#include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace WTF {
TEST(LruCacheTest, TestEmpty) {
LruCache<int, int> test_cache(1);
EXPECT_EQ(test_cache.Get(0), nullptr);
}
TEST(LruCacheTest, TestInstantiation) {
const int kMaxSize = 10;
const int kOffset = 1000;
LruCache<int, int> test_cache(kMaxSize);
EXPECT_EQ(test_cache.size(), 0u);
for (size_t i = 1; i < kMaxSize * 10; ++i) {
test_cache.Put(i, kOffset + i);
}
EXPECT_EQ(test_cache.size(), kMaxSize * 1u);
EXPECT_EQ(*test_cache.Get(kMaxSize * 10 - 1), kOffset + (kMaxSize * 10 - 1));
EXPECT_EQ(*test_cache.Get(kMaxSize * 10 - 2), kOffset + (kMaxSize * 10 - 2));
EXPECT_EQ(test_cache.Get(89), nullptr);
EXPECT_EQ(test_cache.Get(1), nullptr);
test_cache.Clear();
EXPECT_EQ(test_cache.size(), 0u);
}
TEST(LruCacheTest, TestString) {
const size_t kMaxSize = 4;
const char* test_strings[] = {"1_testing", "2_LruCache", "3_using",
"4_several", "5_random", "6_strings"};
LruCache<uint16_t, String> test_cache(kMaxSize);
uint16_t counter = 1;
EXPECT_EQ(test_cache.size(), 0u);
for (auto* test_string : test_strings) {
test_cache.Put(counter, test_string);
counter++;
}
EXPECT_EQ(test_cache.size(), kMaxSize);
EXPECT_EQ(test_cache.Get(1), nullptr);
EXPECT_EQ(test_cache.Get(2), nullptr);
EXPECT_EQ(*test_cache.Get(3), String(test_strings[2]));
EXPECT_EQ(*test_cache.Get(4), String(test_strings[3]));
EXPECT_EQ(*test_cache.Get(5), String(test_strings[4]));
EXPECT_EQ(*test_cache.Get(6), String(test_strings[5]));
test_cache.Put(1, test_strings[0]);
EXPECT_EQ(*test_cache.Get(1), String(test_strings[0]));
EXPECT_EQ(test_cache.Get(3), nullptr);
EXPECT_EQ(*test_cache.Get(4), String(test_strings[3]));
EXPECT_EQ(*test_cache.Get(5), String(test_strings[4]));
EXPECT_EQ(*test_cache.Get(6), String(test_strings[5]));
test_cache.Clear();
EXPECT_EQ(test_cache.size(), 0u);
}
TEST(LruCacheTest, TestOverrideKey) {
const size_t kMaxSize = 2;
const char* test_strings[] = {"original_value", "override"};
LruCache<uint16_t, String> test_cache(kMaxSize);
EXPECT_EQ(test_cache.size(), 0u);
test_cache.Put(1, test_strings[0]);
test_cache.Put(1, test_strings[1]);
EXPECT_EQ(*test_cache.Get(1), String(test_strings[1]));
}
TEST(LruCacheTest, StringToVector) {
const size_t kMaxSize = 4u;
LruCache<String, Vector<String>> typeface_cache(kMaxSize);
struct FontFallbackExample {
String locale;
String typeface_name;
} example_typefaces[] = {{"en_us", "Arial"},
{"ko", "Malgun Gothic"},
{"ja", "Yu Gothic UI"},
{"en_us", "Times New Roman"},
{"en_us", "Calibri"},
{"km", "Leelawadee UI"},
{"zh-Hans", "Microsoft Yahei UI"},
{"bn", "Nirmala UI"}};
for (auto& example : example_typefaces) {
Vector<String>* cache_for_locale = typeface_cache.Get(example.locale);
if (cache_for_locale) {
cache_for_locale->push_back(example.typeface_name);
} else {
Vector<String> new_cache_for_locale;
new_cache_for_locale.push_back(example.typeface_name);
typeface_cache.Put(String(example.locale),
std::move(new_cache_for_locale));
}
}
Vector<String>* vector_for_latin = typeface_cache.Get("en_us");
EXPECT_TRUE(vector_for_latin);
EXPECT_EQ(vector_for_latin->size(), 3u);
EXPECT_EQ(typeface_cache.Get("zh-Hant"), nullptr);
EXPECT_EQ(typeface_cache.Get("ko"), nullptr);
EXPECT_EQ(typeface_cache.Get("ja"), nullptr);
}
} // namespace WTF