# Formally testing literate programs

    import pidgy, pytest, doctest, importnb.utils.pytest_importnb

Literate documents can be motivated by the need to test a concept. In a fact, a common
use case of notebooks is that they interactively test units of thought. Often the thought
of reusability is an after thought.

`pidgy` documents are meant to be treated as test objects. In fact, the `pidgy` test suite
executed by `pytest` through [Github Actions][actions] uses `pidgy` notebooks (ie. documents with the `".md" or ".md.ipynb"` extension). `pidgy` supplies its own `pytest` extensions, and it uses [`nbval`][nbval] and the `pytest`"--doctest-modules"`flag. With these conditions we discover pytest conventions, unitests, doctests, and options cell input output validated. Ultimately,`pidgy` documents may represent units of literate that double as formal test objects.

The document accessed by the `"pytest11"` console_script and includes the extension with a pytest runner.

    class pidgyModule(importnb.utils.pytest_importnb.NotebookModule):

The `pidgyModule` derives from an existing `pytest` extension that extracts formal tests from `notebook`s
as if they were regular python files. We'll use the `pidgy.pidgyLoader` to load Markdown-forward documents
as python objects.

        loader = pidgy.pidgyLoader

    class pidgyTests(importnb.utils.pytest_importnb.NotebookTests):

`pidgyTests` makes sure to include the alternative source formats to tangle to python executions.

        modules = pidgyModule,

[nbval]: https://github.com/computationalmodelling/nbval/ "The pidgy kernel works directly with `nbval`."
[actions]: https://github.com/deathbeds/pidgy/runs/478462971
