From 772861fc5fae1c126fcc63a8809b0a9c729bd152 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Tue, 2 Jun 2026 13:43:49 +0200 Subject: kernel/vfs: add type registry tests --- kernel/CMakeLists.txt | 1 + kernel/include/kernel/filesystem/type_registry.hpp | 8 ++- kernel/src/filesystem/type_registry.cpp | 11 +++- kernel/src/filesystem/type_registry.tests.cpp | 77 ++++++++++++++++++++++ kernel/src/filesystem/vfs.cpp | 1 - 5 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 kernel/src/filesystem/type_registry.tests.cpp (limited to 'kernel') diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 3dd84ba..2388370 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -201,6 +201,7 @@ if(BUILD_TESTING) "src/filesystem/mount.tests.cpp" "src/filesystem/open_file_descriptor.tests.cpp" "src/filesystem/open_file_table.tests.cpp" + "src/filesystem/type_registry.tests.cpp" "src/filesystem/vfs.tests.cpp" # Storage Subsystem Tests diff --git a/kernel/include/kernel/filesystem/type_registry.hpp b/kernel/include/kernel/filesystem/type_registry.hpp index 2f5e708..3be7295 100644 --- a/kernel/include/kernel/filesystem/type_registry.hpp +++ b/kernel/include/kernel/filesystem/type_registry.hpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -35,7 +36,12 @@ namespace kernel::filesystem //! Get all currently registered type descriptors. //! //! @return A span containing all currently registered filesystem type descriptors. - [[nodiscard]] auto all() const noexcept -> std::span; + [[nodiscard]] auto all() const noexcept -> std::span; + + //! Get the number of registered filesystem types. + //! + //! @return The number of filesystem descriptors currently registered with this registry. + [[nodiscard]] auto size() const noexcept -> std::size_t; private: //! A map from filesystem names (identifiers) to filesystem type descriptors. diff --git a/kernel/src/filesystem/type_registry.cpp b/kernel/src/filesystem/type_registry.cpp index 033b879..d917c81 100644 --- a/kernel/src/filesystem/type_registry.cpp +++ b/kernel/src/filesystem/type_registry.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -58,10 +59,14 @@ namespace kernel::filesystem return result.second; } - [[nodiscard]] auto type_registry::all() const noexcept -> std::span + auto type_registry::all() const noexcept -> std::span { - // TODO: implement value accessor for flat_map - return {}; + return {m_descriptors.values().begin(), m_descriptors.values().end()}; + } + + auto type_registry::size() const noexcept -> std::size_t + { + return m_descriptors.size(); } } // namespace kernel::filesystem diff --git a/kernel/src/filesystem/type_registry.tests.cpp b/kernel/src/filesystem/type_registry.tests.cpp new file mode 100644 index 0000000..8382579 --- /dev/null +++ b/kernel/src/filesystem/type_registry.tests.cpp @@ -0,0 +1,77 @@ +#include + +#include +#include + +#include + +#include + +#include +#include + +struct test_type final : kernel::filesystem::type +{ + [[nodiscard]] auto name() const noexcept -> std::string_view override + { + return "bht_testfs"; + } + + [[nodiscard]] auto requires_device() const noexcept -> bool override + { + return false; + } + + [[nodiscard]] auto make_instance() const -> kstd::shared_ptr override + { + return nullptr; + } +}; + +SCENARIO("Filesystem type registry initialization and construction", "[filesystem]") +{ + GIVEN("A default constructed type_registry") + { + auto instance = kernel::filesystem::type_registry{}; + + WHEN("getting the span of filesystem descriptors") + { + auto descriptors = instance.all(); + + THEN("the span is empty") + { + REQUIRE(descriptors.empty()); + } + } + } +} + +SCENARIO("Filesystem type registry modifiers", "[filesystem]") +{ + GIVEN("A default constructed type_registry") + { + auto instance = kernel::filesystem::type_registry{}; + + WHEN("adding a type descriptor") + { + auto descriptor = test_type{}; + + instance.add(kstd::make_observer(&descriptor)); + + THEN("the size of the registry is one") + { + REQUIRE(instance.size() == 1); + } + + THEN("the span is not empty") + { + REQUIRE_FALSE(instance.all().empty()); + } + + THEN("the span's size is equal to the registry size") + { + REQUIRE(std::size(instance.all()) == std::size(instance)); + } + } + } +} diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index 8d1fd23..e5dff8c 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -12,7 +12,6 @@ #include #include -#include #include #include -- cgit v1.2.3