Coder Social home page Coder Social logo

pfs's Introduction

PFS

PFS (Polymorphic File System) is a C++ header-only library that wraps std::filesystem to facilitate dependency injection. It achieves this with an abstract interface and implementations of the interface for production and test environments.

Motivation

Unit-testing C++ software that relys on the filesystem is undesireable because it is subject to the wider environment and may not be repeatable on different machines. A common solution to this problem is to use dependency-injection. We introduce a filesystem interface with a mock implementation for unit-testing. However, this has its own shortcoming of not accurately capturing the nuanced behavior of your filesystem.

PFS is a complete solution to your dependency-injected filesystem. Not only does it provide the interface and production implementaiton, but it also provides an in-memory "fake filesystem" that emulates real fileystem behavior. The interface is designed to match the std::filesystem library as closely as possible.

Example

// ----------------------------------------------
// Widget.hpp
// ----------------------------------------------

#include <pfs/filesystem.hpp>

class Widget {
    pfs::filesystem* fs;

    Widget(pfs::filesystem& fs) : fs(fs) {}

    void DoSomething() {
        pfs->create_directory("widget_workspace");
        std::unique_ptr<std::ostream> f = pfs->open_file("widget_workspace/log.txt");
        f << "The answer is: " << 42;
    }
};

// ----------------------------------------------
// Main.cpp
// ----------------------------------------------

#include <pfs/std_filesystem.hpp>
#include <Widget.hpp>

int main() {
    pfs::std_filesystem fs;
    Widget w(fs);
    w.DoSomething();
}

// ----------------------------------------------
// WidgetTest.cpp
// ----------------------------------------------

#include <pfs/fake_filesystem.hpp>
#include <Widget.hpp>
#include <TestFramework.hpp>

TEST_CASE("Testing the widget")
{
    pfs::fake_filesystem fs;
    Widget w(fs);
    w.DoSomething();
    ASSERT(fs.is_regular_file("widget_workspace/log.txt"));
}

pfs's People

Contributors

samwarring avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.