# Introduction

The [Subplot][] library `files` provides scenario steps and their
implementations for managing files on the file system during tests.
The library consists of a bindings file `lib/files.yaml` and
implementations in Python in `lib/files.py` or in Rust within the
`subplotlib` crate.

[Subplot]: https://subplot.liw.fi/

This document explains the acceptance criteria for the library and how
they're verified. It uses the steps and functions from the `files`
library.

# Create on-disk files from embedded files

Subplot allows the source document to embed test files, and the
`files` library provides steps to create real, on-disk files from
the embedded files.

~~~scenario
given file hello.txt
then file hello.txt exists
and file hello.txt contains "hello, world"
and file other.txt does not exist
given file other.txt from hello.txt
then file other.txt exists
and files hello.txt and other.txt match
and only files hello.txt, other.txt exist
~~~

~~~{#hello.txt .file .numberLines}
hello, world
~~~


# File metadata

These steps create files and manage their metadata.

~~~scenario
given file hello.txt
when I remember metadata for file hello.txt
then file hello.txt has same metadata as before

when I write "yo" to file hello.txt
then file hello.txt has different metadata from before
~~~

# File modification time

These steps manipulate and test file modification times.

~~~scenario
given file foo.dat has modification time 1970-01-02 03:04:05
then file foo.dat has a very old modification time

when I touch file foo.dat
then file foo.dat has a very recent modification time
~~~


# File contents

These steps verify contents of files.

~~~scenario
given file hello.txt
then file hello.txt contains "hello, world"
then file hello.txt doesn't contain "hello, sailor"
and file hello.txt matches regex "hello, .*"
and file hello.txt matches regex /hello, .*/
~~~

# File equality

These steps verify contents of files.

~~~scenario
given file hello.txt
given file hi.txt from hello.txt
then files hello.txt and hi.txt on disk are identical

given file other.txt
then files hello.txt and other.txt on disk are different

then file hi.txt on disk and embedded file hello.txt are identical
then file other.txt on disk and embedded file hello.txt are different
~~~

~~~{#other.txt .file .txt}
Go away, please.
~~~

# Directories

There are also a large number of directory based steps and some directory
based behaviour available in creating files which are available in the files
library.

```scenario
given a directory first
then directory first exists
and directory first is empty
and directory second does not exist
when I remove directory first
then directory first does not exist
when I create directory second
then directory second exists
and directory second is empty
given file second/third/hello.txt from hello.txt
then directory second is not empty
and directory second/third exists
and directory second/third is not empty
when I remove directory second
then directory second does not exist
```

# File and directory removal


```scenario
given file hello.txt
then file hello.txt exists
when I remove file hello.txt
then file hello.txt does not exist

given a directory foo
when I remove empty directory foo
then directory foo does not exist
```
