mirror of
https://github.com/basiliscos/syncspirit.git
synced 2026-06-01 17:47:32 +00:00
124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
// SPDX-FileCopyrightText: 2019-2024 Ivan Baidakou
|
|
|
|
#include "test-utils.h"
|
|
#include "access.h"
|
|
#include "model/device.h"
|
|
#include "model/misc/lru_cache.hpp"
|
|
|
|
using namespace syncspirit;
|
|
using namespace syncspirit::model;
|
|
using namespace syncspirit::proto;
|
|
using namespace syncspirit::test;
|
|
|
|
namespace bfs = std::filesystem;
|
|
|
|
TEST_CASE("generic map", "[model]") {
|
|
auto my_id = device_id_t::from_string("KHQNO2S-5QSILRK-YX4JZZ4-7L77APM-QNVGZJT-EKU7IFI-PNEPBMY-4MXFMQD").value();
|
|
auto my_device = device_t::create(my_id, "my-device").value();
|
|
auto map = devices_map_t();
|
|
map.put(my_device);
|
|
REQUIRE(map.by_sha256(my_id.get_sha256()));
|
|
REQUIRE(map.by_key(my_device->get_key()));
|
|
|
|
map.remove(my_device);
|
|
REQUIRE(!map.by_sha256(my_id.get_sha256()));
|
|
REQUIRE(!map.by_key(my_device->get_key()));
|
|
REQUIRE(map == map);
|
|
}
|
|
|
|
namespace syncspirit::model::details {
|
|
|
|
template <> inline std::string_view get_lru_key<std::string>(const std::string &key) { return key; }
|
|
|
|
} // namespace syncspirit::model::details
|
|
|
|
TEST_CASE("lru cache", "[model]") {
|
|
SECTION("string item") {
|
|
mru_list_t<std::string> list(3);
|
|
list.put("a");
|
|
CHECK(list.get("a") == "a");
|
|
|
|
list.put("b");
|
|
list.put("c");
|
|
|
|
CHECK(list.get("a") == "a");
|
|
CHECK(list.get("b") == "b");
|
|
CHECK(list.get("c") == "c");
|
|
CHECK(list.get("d") == "");
|
|
|
|
list.put("d");
|
|
CHECK(list.get("a") == "");
|
|
CHECK(list.get("b") == "b");
|
|
CHECK(list.get("c") == "c");
|
|
CHECK(list.get("d") == "d");
|
|
|
|
list.get("b");
|
|
list.put("e");
|
|
CHECK(list.get("a") == "");
|
|
CHECK(list.get("b") == "b");
|
|
CHECK(list.get("c") == "");
|
|
CHECK(list.get("d") == "d");
|
|
CHECK(list.get("e") == "e");
|
|
|
|
list.put("e");
|
|
CHECK(list.get("a") == "");
|
|
CHECK(list.get("b") == "b");
|
|
CHECK(list.get("c") == "");
|
|
CHECK(list.get("d") == "d");
|
|
CHECK(list.get("e") == "e");
|
|
|
|
list.remove("d");
|
|
CHECK(list.get("a") == "");
|
|
CHECK(list.get("b") == "b");
|
|
CHECK(list.get("c") == "");
|
|
CHECK(list.get("d") == "");
|
|
CHECK(list.get("e") == "e");
|
|
|
|
list.put("c");
|
|
CHECK(list.get("a") == "");
|
|
CHECK(list.get("b") == "b");
|
|
CHECK(list.get("c") == "c");
|
|
CHECK(list.get("d") == "");
|
|
CHECK(list.get("e") == "e");
|
|
}
|
|
}
|
|
|
|
struct item_t {
|
|
utils::bytes_t key;
|
|
int value;
|
|
};
|
|
|
|
using item_map_t = syncspirit::model::generic_map_t<item_t, 1>;
|
|
|
|
namespace syncspirit::model {
|
|
|
|
template <> inline utils::bytes_view_t get_index<0>(const item_t &item) noexcept { return item.key; }
|
|
|
|
} // namespace syncspirit::model
|
|
|
|
TEST_CASE("generic map ops") {
|
|
item_map_t map;
|
|
auto k = as_owned_bytes("k");
|
|
auto kv = utils::bytes_view_t(k);
|
|
auto i1 = item_t{k, 1};
|
|
auto i2 = item_t{k, 2};
|
|
|
|
CHECK(map.put(i1));
|
|
CHECK(map.get(k).value == 1);
|
|
CHECK(map.get(kv).value == 1);
|
|
|
|
CHECK(map.put(i2, true));
|
|
CHECK(map.get(k).value == 2);
|
|
CHECK(map.get(kv).value == 2);
|
|
REQUIRE(map.size() == 1);
|
|
|
|
CHECK(!map.put(i1, false));
|
|
CHECK(map.get(k).value == 2);
|
|
CHECK(map.get(kv).value == 2);
|
|
REQUIRE(map.size() == 1);
|
|
|
|
map.remove(i2);
|
|
REQUIRE(map.size() == 0);
|
|
}
|