Metadata-Version: 2.1
Name: ctdd
Version: 0.0.5
Summary: C test-driven development framework implemented in Python
Home-page: https://github.com/wideopensource/ctdd
Author: WideOpenTech
Author-email: fossie@wideopentech.co.uk
Requires-Python: >=3.8,<4.0
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3
Requires-Dist: crelm (>=0.0.33,<0.0.34)
Requires-Dist: john (>=0.1.5,<0.2.0)
Project-URL: Repository, https://github.com/wideopensource/ctdd
Description-Content-Type: text/markdown

# ctdd

## tl:dr

C test-driven development framework implemented in Python.

## Info

The testing framework is Python's native unittest, with a few extra asserts ans stuff provided by John. The tester looks for a .c and .h pair with the same name as the .py test file. It builds them into a Python extension using Crelm (which in turn uses cffi) and runs the Python tests as if it were testing Python code. C callbacks are mocked in Python (demo to follow..), meaning that there is exactly zero C code involved in the testing.

## Example

There is a demo of a TDD'd `add3` function in \_\_main\_\_.py, \_\_main\_\_.c and \_\_main\_\_.h in the root of the repo, run with `python3 .`. The silly filenames are to suit the Python auto-run mechanism.

The files are reproduced here (possibly out of date) with original filenames:

__add3.py__

```
from ctdd import Tester

class Add3Tests(Tester):

    def test_sut_compiles(self):
        with self.assertDoesNotRaise():
            self.sut

    def test_takes_three_f(self):
        with self.assertDoesNotRaise():
            self.sut.add3(0, 0, 0)

    def test_return_zero_for_zeros(self):
        expected = 0

        actual = self.sut.add3(0, 0, 0)

        self.assertEqual(expected, actual)

    def test_returns_sum(self):
        expected = 14

        actual = self.sut.add3(1, 4, 9)

        self.assertEqual(expected, actual)

Tester.go()
```

__add3.h__
```
#pragma once

int add3(int a, int b, int c);
```

__add3.c__
```
#include "__main__.h"

int add3(int a, int b, int c)
{
    return a + b + c;
}
```

To use this in real life install the package with `pip install ctdd` (in a virtualenv if you prefer), and run `python add3.py` after each add test or add code iteration.

Test output is exactly what unittest said (with distutils deprecation warning removed):

```
...........
----------------------------------------------------------------------
Ran 11 tests in 2.104s

OK

```
