mirror of
https://github.com/sshlien/abcmidi.git
synced 2026-05-30 20:09:29 +00:00
Implement basic testing infrastructure (#19)
* Add configuration for CMake build system alongside autoconf - Add a modern CMake build system (`CMakeLists.txt`, `CMakePresets.json`) that coexists with the legacy autoconf/Makefile build - Shared source files (`midifile.c`, `parseabc.c`, `music_utils.c`, `parser2.c`) are compiled once via OBJECT libraries and linked into the 8 binaries - Three presets: `default` (Release), `debug`, `sanitize` (ASan + UBSan) - Generates `compile_commands.json` for clangd/LSP editor support - Install rules match the legacy Makefile (binaries, doc files, man pages) - Pinned to `-std=gnu89` because the codebase mixes K&R `()` and ANSI typed prototypes — in C23/gnu23 (GCC 15+ default), `()` means `(void)`, making these a hard error. Note: **the existing autoconf build is also broken with GCC 15** for the same reason ```sh cmake --preset debug cmake --build --preset debug cmake --install build/debug --prefix /usr/local Documentation - README.md: added Building section with both autoconf and CMake instructions - doc/readme.txt: added build instructions in the existing preamble - doc/CHANGES: added changelog entry Test plan - All 3 presets configure and build with GCC 15 - Smoke test: abc2midi samples/coleraine.abc produces valid MIDI through mftext - Sanitizer build (--preset sanitize) runs clean on sample files - Install layout verified: 8 binaries, 10 doc files, 8 man pages in correct paths - Build on macOS (untested, should work with AppleClang) * Implement basic testing infrastructure The CMake build includes a test suite covering all 8 programs: - **Smoke tests** verify each binary runs cleanly with `-ver`. - **Golden-file tests** run each program on a sample input and compare the (normalized) output to a checked-in reference. Binary MIDI outputs are piped through `mftext` to produce diffable text. Volatile lines (version banners, dates, temporary paths) are stripped before comparison. ```sh ctest --preset debug ctest --preset debug -L golden ctest --preset debug -L smoke ``` To regenerate the golden files after an intentional behavioural change, review the diff, then commit: ```sh cmake --build build/debug --target update-golden git diff tests/golden/ ``` * Factorize more the test CMake code
This commit is contained in:
66
README.md
66
README.md
@@ -20,3 +20,69 @@ Components of the abcMIDI package are parts of numerous applications for creatin
|
||||
|
||||
The latest version of the abcMIDI package supported by James Allwright can be found can be found [here](http://abc.sourceforge.net/abcMIDI/original/). More recent versions can be found on [sourceforge](https://sourceforge.net/projects/abc/) and on the [runabc](https://ifdo.ca/~seymour/runabc/top.html) web page.
|
||||
|
||||
|
||||
### Building
|
||||
|
||||
#### Autoconf (legacy)
|
||||
|
||||
The traditional build uses autoconf:
|
||||
|
||||
```sh
|
||||
./configure
|
||||
make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
#### CMake (modern)
|
||||
|
||||
A CMake build system is available alongside the legacy one, with
|
||||
[presets](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html)
|
||||
for common configurations:
|
||||
|
||||
```sh
|
||||
# Configure and build (pick a preset: default, debug, sanitize)
|
||||
cmake --preset default
|
||||
cmake --build --preset default
|
||||
|
||||
# Install
|
||||
cmake --install build/default
|
||||
```
|
||||
|
||||
Available presets:
|
||||
|
||||
| Preset | Build type | Description |
|
||||
|------------|------------|----------------------------------------------|
|
||||
| `default` | Release | Optimized build |
|
||||
| `debug` | Debug | Debug symbols, no optimization |
|
||||
| `sanitize` | Debug | Debug + AddressSanitizer + UndefinedBehaviorSanitizer |
|
||||
|
||||
The CMake build generates `compile_commands.json` for use with
|
||||
clangd and other LSP-based editors.
|
||||
|
||||
### Testing
|
||||
|
||||
The CMake build includes a test suite covering all 8 programs:
|
||||
|
||||
- **Smoke tests** verify each binary runs cleanly with `-ver`.
|
||||
- **Golden-file tests** run each program on a sample input and compare the
|
||||
(normalized) output to a checked-in reference. Binary MIDI outputs are
|
||||
piped through `mftext` to produce diffable text. Volatile lines (version
|
||||
banners, dates, temporary paths) are stripped before comparison.
|
||||
|
||||
```sh
|
||||
# Run all tests
|
||||
ctest --preset debug
|
||||
|
||||
# Run only golden-file tests / only smoke tests
|
||||
ctest --preset debug -L golden
|
||||
ctest --preset debug -L smoke
|
||||
```
|
||||
|
||||
To regenerate the golden files after an intentional behavioural change,
|
||||
review the diff, then commit:
|
||||
|
||||
```sh
|
||||
cmake --build build/debug --target update-golden
|
||||
git diff tests/golden/
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user