aboutsummaryrefslogtreecommitdiff
path: root/tests/src/detail/SymbolIntern.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/detail/SymbolIntern.cpp')
-rw-r--r--tests/src/detail/SymbolIntern.cpp138
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/src/detail/SymbolIntern.cpp b/tests/src/detail/SymbolIntern.cpp
new file mode 100644
index 0000000..aab6584
--- /dev/null
+++ b/tests/src/detail/SymbolIntern.cpp
@@ -0,0 +1,138 @@
+#include <iterator>
+#include <string_view>
+
+#include <openvic-dataloader/detail/SymbolIntern.hpp>
+#include <openvic-dataloader/detail/pinned_vector.hpp>
+
+#include "Helper.hpp"
+#include <snitch/snitch.hpp>
+
+using namespace std::string_view_literals;
+
+using symbol_buffer = ovdl::symbol_buffer<char>;
+using symbol_interner = ovdl::symbol_interner<struct Id, char, std::size_t, void>;
+using symbol = ovdl::symbol<char>;
+
+namespace snitch {
+ template<typename CharT>
+ bool append(snitch::small_string_span ss, const ovdl::symbol<CharT>& s) {
+ return append(ss, "{", static_cast<const void*>(s.c_str()), ",\"", s.view(), "\"}");
+ }
+}
+
+TEST_CASE("symbol_buffer", "[symbol-buffer]") {
+ static constexpr std::string_view buffer_in = "input value";
+ static constexpr std::array<char, symbol_buffer::min_buffer_size - buffer_in.size()> fake_insert {};
+
+ symbol_buffer buffer;
+
+ {
+ CAPTURE(buffer_in.size());
+ CHECK(buffer.reserve(buffer_in.size()));
+ }
+
+ std::string_view buffer_val = buffer.insert(buffer_in.data(), buffer_in.size());
+ CHECK(buffer_val == buffer_in);
+ CHECK(std::distance(buffer.c_str(0), buffer_val.data() + buffer_val.size()) == buffer_in.size());
+
+ // Minimum buffer size is 1024 * 16
+ // The default buffer constructor is expected to treat this as the max size as well
+ {
+ CAPTURE(buffer.size());
+ CAPTURE(fake_insert.size());
+ CHECK_IF(buffer.reserve(buffer.size() + fake_insert.size())) {
+ buffer.insert(fake_insert.data(), fake_insert.size() - 1);
+ }
+ }
+ // Pinned vector buffer operates based on system page sizes
+ // May have more capacity then specified
+ // Ensure we attempt to reserve beyond vector's max size
+ {
+ CAPTURE(buffer.size());
+ CAPTURE(ovdl::detail::pinned_vector<char>::page_size());
+ CHECK_FALSE(buffer.reserve(buffer.size() + ovdl::detail::pinned_vector<char>::page_size()));
+ }
+}
+
+TEST_CASE("symbol_buffer, max size", "[symbol-buffer-max-size]") {
+ static constexpr std::string_view buffer_in = "input value";
+ static constexpr std::array<char, symbol_buffer::min_buffer_size * 2 - buffer_in.size()> fake_insert {};
+
+ symbol_buffer buffer(symbol_buffer::min_buffer_size * 2 + 1);
+
+ {
+ CAPTURE(buffer_in.size());
+ CHECK(buffer.reserve(buffer_in.size()));
+ }
+
+ std::string_view buffer_val = buffer.insert(buffer_in.data(), buffer_in.size());
+ CHECK(buffer_val == buffer_in);
+ CHECK(std::distance(buffer.c_str(0), buffer_val.data() + buffer_val.size()) == buffer_in.size());
+
+ {
+ CAPTURE(buffer.size());
+ CAPTURE(fake_insert.size());
+ CHECK_IF(buffer.reserve(buffer.size() + fake_insert.size())) {
+ buffer.insert(fake_insert.data(), fake_insert.size() - 1);
+ }
+ }
+ // Pinned vector buffer operates based on system page sizes
+ // May have more capacity then specified
+ // Ensure we attempt to reserve beyond vector's max size
+ {
+ CAPTURE(buffer.size());
+ CAPTURE(ovdl::detail::pinned_vector<char>::page_size());
+ CHECK_FALSE(buffer.reserve(buffer.size() + ovdl::detail::pinned_vector<char>::page_size()));
+ }
+}
+
+TEST_CASE("symbol_interner", "[symbol-intern]") {
+ symbol_interner interner(symbol_buffer::min_buffer_size * 2);
+
+ auto test = interner.intern("test");
+ auto test2 = interner.intern("test");
+
+ CHECK(test.view() == "test"sv);
+ CHECK(test2.view() == "test"sv);
+
+ CHECK(test == test2);
+
+ auto test3 = interner.intern("test3");
+
+ CHECK(test.view() == "test"sv);
+ CHECK(test2.view() == "test"sv);
+ CHECK(test3.view() == "test3"sv);
+
+ CHECK(test == test2);
+ CHECK_FALSE(test == test3);
+ CHECK_FALSE(test2 == test3);
+
+ CHECK_IF(interner.reserve(1024, 16 + 1)) {
+ auto test4 = interner.intern("test3");
+
+ CHECK(test.view() == "test"sv);
+ CHECK(test2.view() == "test"sv);
+ CHECK(test3.view() == "test3"sv);
+ CHECK(test4.view() == "test3"sv);
+
+ CHECK(test3 == test4);
+ CHECK_FALSE(test == test3);
+ CHECK_FALSE(test2 == test3);
+
+ auto test5 = interner.intern("test5");
+
+ CHECK(test.view() == "test"sv);
+ CHECK(test2.view() == "test"sv);
+ CHECK(test3.view() == "test3"sv);
+ CHECK(test4.view() == "test3"sv);
+ CHECK(test5.view() == "test5"sv);
+
+ CHECK(test3 == test4);
+ CHECK_FALSE(test == test3);
+ CHECK_FALSE(test2 == test3);
+ CHECK_FALSE(test5 == test);
+ CHECK_FALSE(test5 == test2);
+ CHECK_FALSE(test5 == test3);
+ CHECK_FALSE(test5 == test4);
+ }
+} \ No newline at end of file