Check, as most test frameworks, has the following hierarchy:
main() |-- Suite1 | |--TestCase1 | | |--TestA | | |--TestB | | |--TestC | | |--TestD | | `--TestE | `--TestCase2 | |--TestF | `--TestG `-- Suite2 `--TestCase1 |--TestA |--TestB |--TestC |--TestD |--TestE |--TestF `--TestG
It's notable that the author choose to have a lot of Suites named after whatever it's testing (say, logging), with each having one TestCase named "Core". Sometimes there's a second or a third TestCase. Each testcase has multiple tests, mostly a dozen or so.
The author has a src and a tests directory. In the tests directory, there is one main file called check_check_main.c which contains one main() function. This function adds all suites and runs them. It knows about the suites because there is a header file called check_check.h contains all the test suites. Then there is a separate file for each suite, for example, check_check_msg.c contains one test suite and a dozen tests. It has the header file check_check.h and all necessary header files to test project code.
Notable differences with JUnit are: