Sparse test suite ~~~~~~~~~~~~~~~~~ Sparse has a number of test cases in its validation directory. The test-suite script aims at making automated checking of these tests possible. It works by embedding tags in C comments in the test cases. check-name: (mandatory) Name of the test. check-description: (optional) A description of what the test checks. check-command: (optional) There are different kinds of tests. Some can validate the sparse preprocessor, while others will use sparse, cgcc, or even other backends of the library. check-command allows you to give a custom command to run the test-case. The '$file' string is special. It will be expanded to the file name at run time. It defaults to "sparse $file". check-exit-value: (optional) The expected exit value of check-command. It defaults to 0. check-output-start / check-output-end (optional) The expected output (stdout and stderr) of check-command lies between those two tags. It defaults to no output. check-known-to-fail (optional) Mark the test as being known to fail. Using test-suite ~~~~~~~~~~~~~~~~ The test-suite script is called through the check target of the Makefile. It will try to check every test case it finds (find validation -name '*.c'). It can be called to check a single test with: $ cd validation $ ./test-suite single preprocessor/preprocessor1.c TEST Preprocessor #1 (preprocessor/preprocessor1.c) preprocessor/preprocessor1.c passed ! Writing a test ~~~~~~~~~~~~~~ test-suite comes with a format command to make a test easier to write: test-suite format file [name [cmd]] name: check-name value. If no name is provided, it defaults to the file name. cmd: check-command value. If no cmd is provided, it defaults to "sparse $file". The output of the test-suite format command can be redirected into the test case to create a test-suite formated file. $ ./test-suite format bad-assignment.c Assignment >> bad-assignment.c $ cat !$ cat bad-assignment.c /* * check-name: bad assignment * * check-command: sparse $file * check-exit-value: 1 * * check-output-start bad-assignment.c:3:6: error: Expected ; at end of statement bad-assignment.c:3:6: error: got \ * check-output-end */ You can define the check-command you want to use for the test. $file will be extended to the file name at run time. $ ./test-suite format validation/preprocessor2.c "Preprocessor #2" \ "sparse -E \$file" >> validation/preprocessor2.c $ cat !$ cat validation/preprocessor2.c /* * This one we happen to get right. * * It should result in a simple * * a + b * * for a proper preprocessor. */ #define TWO a, b #define UNARY(x) BINARY(x) #define BINARY(x, y) x + y UNARY(TWO) /* * check-name: Preprocessor #2 * * check-command: sparse -E $file * check-exit-value: 0 * * check-output-start a + b * check-output-end */