The library works using ValueGenerators (not python generators) and Arbitrary classes.
# Test
Test is container that holds name, arbitrary and value provided by said arbitrary. The test also contains functions `shrink` and `to_str` (using `to_str` from arbitrary on value).
# Tester
Tester is abstract class, the most important function `run_test(test: Test[G])` is not defined.
# RefImlTester
Tester that runs tests on your implementation and the reference implementation, then runs your process output tests on the outputs.
## ProcessOutputTest
Type is `Callable[[ProcessOutput, ProcessOutput], bool]`, it takes the outputs (in format provided by the `subprocess.run`) and returns bool.
There are some presets:
-`stdout_equality()`: returns test, that only compares the raw stdout
-`stdout_processed_equality(test_preprocessor, exp_preprocessor)`: returns test that compares processed stdouts. `test_preprocessor` and `exp_preprocessor` are `Callable[[str], str]` that "process" the stdout (you have to define these, there is `str_id` that returns the input unchaged `x -*> x`)
## Example use
```python
defignore_numbers(x:str):
returnre.sub(r'\d+','',x)
# `program_tst` and `program_exp` are absolute paths pointing to the executables