diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 21f8272..ef4f912 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -24,3 +24,4 @@ Run from rust.yml unless stated otherwise. Unfortunately we are now exceeding th 10. `Arch32bit` 11. `Cross` 12. `Format` +13. `Compile tests` diff --git a/.github/workflows/rust.yaml b/.github/workflows/rust.yaml index b0b1bc6..311e8db 100644 --- a/.github/workflows/rust.yaml +++ b/.github/workflows/rust.yaml @@ -218,3 +218,14 @@ jobs: run: rustup component add rustfmt - name: "Check formatting" run: cargo +nightly fmt --all -- --check + + Compile: + name: Compile tests + runs-on: ubuntu-latest + steps: + - name: "Checkout repo" + uses: actions/checkout@v4 + - name: "Select toolchain" + uses: dtolnay/rust-toolchain@stable + - name: "Run compile tests" + run: ./contrib/compile-tests.sh diff --git a/contrib/compile-tests.sh b/contrib/compile-tests.sh new file mode 100755 index 0000000..4d272fe --- /dev/null +++ b/contrib/compile-tests.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# +# Checks intended compile failures. + +set -euo pipefail + +REPO_DIR=$(git rev-parse --show-toplevel) + +compile_check() { + local dir_path=$1 + local expected_status=$2 + result=0 + # All crates in the specified subdirectory must compile or fail based on expected_status + for dir in "$dir_path"/*; do + if [ -d "$dir" ]; then + pushd "$dir" > /dev/null + echo "Compiling $dir" + output=$(cargo build 2>&1) + if [ "$?" -ne "$expected_status" ]; then + if [ "$expected_status" -eq 0 ]; then + echo "$output" + echo "error: compile-tests/$dir/ failed to compile" + else + echo "error: compile-tests/$dir/ compiled when it should not have" + fi + result=1 + fi + popd > /dev/null + fi + done + return "$result" +} + +# Check that all files in compiletests pass or fail as expected +cd "$REPO_DIR"/tests/compile-tests +if compile_check "pass" 0 && compile_check "fail" 101; then + echo "Compile tests passed" + exit 0 +else + echo "Compile tests failed" + exit 1 +fi