|  |  | 
|  |  | 
|  | 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 | 
|  | */ |