Files
abcmidi/.github/workflows/test.yml
Ronan Keryell ce70bc4d4e Add missing C: (composer), R: (rhythm) and X: fields and return error (#21)
* 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

* Add GitHub Action to run the CI and output a status badge

* Add GitHub Action workflow dispatch to allow running from the UI

* Now abc2midi exits 1 if an error occurs

Before it was always returning 0, hiding failures complicated to track in
complex build systems.

* Output missing C:, R: and X: headers as MIDI text meta-events

* Update changelog and comments

---------

Co-authored-by: Seymour Shlien <fy733@ncf.ca>
2026-04-22 07:58:22 -04:00

79 lines
2.9 KiB
YAML

# CI workflow for abcMIDI.
#
# Runs the CMake-based test suite (smoke + golden-file tests) on every push
# and pull request against the long-lived branches, and can also be triggered
# manually from the GitHub UI or via `gh workflow run test.yml`.
#
# Status badge: see the [![Tests]] link at the top of README.md.
name: Tests
on:
# Run on pushes to the main development branches.
push:
branches: [master, future]
# Run on PRs targeting those same branches.
pull_request:
branches: [master, future]
# Allow manual runs on any branch from the Actions tab or `gh workflow run`.
workflow_dispatch:
# Minimal permissions: the workflow only needs to read the repository contents.
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-latest
# One parallel job per tool. GitHub Actions only exposes a single badge
# per workflow file, so this matrix produces one aggregate "Tests" badge
# but still gives per-tool visibility in the Actions UI and lets a single
# tool failure be diagnosed without scrolling through unrelated output.
strategy:
# Keep running the other tools even if one fails, so a single
# regression does not hide unrelated breakage.
fail-fast: false
matrix:
tool:
- abc2midi
- abc2abc
- midi2abc
- midistats
- mftext
- yaps
- midicopy
- abcmatch
# Job display name in the Actions UI (e.g. "Tests / abc2midi").
name: ${{ matrix.tool }}
steps:
# `persist-credentials: false` avoids leaving a GITHUB_TOKEN in the
# local git config — defence in depth against a later step that might
# inadvertently push or call the API on our behalf.
- uses: actions/checkout@v6
with:
persist-credentials: false
# Configure with the `default` preset (Release build, see CMakePresets.json).
- name: Configure
run: cmake --preset default
# Build every binary. Each matrix job builds the full set rather than
# just `${{ matrix.tool }}` because several tools depend on others at
# test time: the golden tests for abc2midi / midistats / midicopy pipe
# their output through mftext, and midi2abc / midistats / midicopy are
# exercised on a MIDI file produced on-the-fly by abc2midi. Building
# everything keeps the test dispatch logic in tests/run_test.cmake
# simple and matches what a developer runs locally.
- name: Build
run: cmake --build --preset default
# Run only the tests relevant to this matrix tool. The regex matches:
# - the smoke test smoke_<tool>_ver
# - every golden test <tool>_<sample>
# (see tests/CMakeLists.txt for the naming convention).
- name: Test ${{ matrix.tool }}
run: ctest --preset default -R '^(smoke_${{ matrix.tool }}_ver|${{ matrix.tool }}_)'