#include "kernel/filesystem/open_file_description.hpp" #include "kernel/test_support/filesystem/inode.hpp" #include #include #include #include SCENARIO("Open file description construction", "[filesystem][open_file_description]") { GIVEN("an inode and an open file description for that inode") { auto inode = kstd::make_shared(); auto file_description = kernel::filesystem::open_file_description{inode}; THEN("the initial offset is zero") { REQUIRE(file_description.offset() == 0); } } } SCENARIO("Open file description read/write offset management", "[filesystem][open_file_description]") { GIVEN("an inode that tracks read/write calls and an open file description for that inode") { auto inode = kstd::make_shared(); auto file_description = kernel::filesystem::open_file_description{inode}; THEN("the offset is updated correctly after reads") { REQUIRE(file_description.read(nullptr, 100) == 100); REQUIRE(file_description.offset() == 100); REQUIRE(file_description.read(nullptr, 50) == 50); REQUIRE(file_description.offset() == 150); } THEN("the offset is updated correctly after writes") { REQUIRE(file_description.write(nullptr, 200) == 200); REQUIRE(file_description.offset() == 200); REQUIRE(file_description.write(nullptr, 25) == 25); REQUIRE(file_description.offset() == 225); } THEN("reads and writes both update the same offset") { REQUIRE(file_description.read(nullptr, 10) == 10); REQUIRE(file_description.offset() == 10); REQUIRE(file_description.write(nullptr, 20) == 20); REQUIRE(file_description.offset() == 30); REQUIRE(file_description.read(nullptr, 5) == 5); REQUIRE(file_description.offset() == 35); REQUIRE(file_description.write(nullptr, 15) == 15); REQUIRE(file_description.offset() == 50); } } }