name: Regression tests

on:
  pull_request:
    branches-ignore:
      - docs
  push:
    branches-ignore:
      - docs
  workflow_dispatch:

jobs:
  regression-tests:
    name: ${{ matrix.shortosname }} | ${{ matrix.compiler }} | ${{ matrix.cxx_std }} | ${{ matrix.stdlib }} | ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    env:
      CXX: ${{ matrix.compiler }}

    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-24.04]
        shortosname: [ubu-24]
        compiler: [g++-14, g++-13]
        cxx_std: [c++2b]
        stdlib: [libstdc++]
        include:
          - os: ubuntu-20.04
            shortosname: ubu-20
            compiler: g++-10
            cxx_std: c++20
            stdlib: libstdc++
          - os: ubuntu-24.04
            shortosname: ubu-24
            compiler: clang++-18
            cxx_std: c++20
            stdlib: libstdc++
          - os: ubuntu-24.04
            shortosname: ubu-24
            compiler: clang++-18
            cxx_std: c++23
            stdlib: libc++-18-dev
          - os: ubuntu-22.04
            shortosname: ubu-22
            compiler: clang++-15
            cxx_std: c++20
            stdlib: libstdc++
          - os: ubuntu-22.04
            shortosname: ubu-22
            compiler: clang++-15
            cxx_std: c++20
            stdlib: libc++-15-dev
          - os: ubuntu-20.04
            shortosname: ubu-20
            compiler: clang++-12
            cxx_std: c++20
            stdlib: libstdc++
          - os: macos-14
            shortosname: mac-14
            compiler: clang++
            cxx_std: c++2b
            stdlib: default
          - os: macos-13
            shortosname: mac-13
            compiler: clang++
            cxx_std: c++2b
            stdlib: default
          - os: macos-13
            shortosname: mac-13
            compiler: clang++-15
            cxx_std: c++2b
            stdlib: default
          - os: windows-2022
            shortosname: win-22
            compiler: cl.exe
            cxx_std: c++latest
            stdlib: default
          - os: windows-2022
            shortosname: win-22
            compiler: cl.exe
            cxx_std: c++20
            stdlib: default
    steps:
    - name: Checkout repo
      uses: actions/checkout@v4

    - name: Prepare compilers
      if: matrix.os == 'macos-13'
      run: |
        sudo xcode-select --switch /Applications/Xcode_14.3.1.app
        sudo ln -s "$(brew --prefix llvm@15)/bin/clang" /usr/local/bin/clang++-15

    - name: Run regression tests - Linux and macOS version
      if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos')
      run: |
        cd regression-tests
        bash run-tests.sh -c ${{ matrix.compiler }} -s ${{ matrix.cxx_std }} -d ${{ matrix.stdlib }} -l ${{ matrix.os }}

    - name: Run regression tests - Windows version
      if: startsWith(matrix.os, 'windows')
      run: |
        "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" && ^
        git config --local core.autocrlf false && ^
        cd regression-tests && ^
        bash run-tests.sh -c ${{ matrix.compiler }} -s ${{ matrix.cxx_std }} -d ${{ matrix.stdlib }} -l ${{ matrix.os }}
      shell: cmd

    - name: Upload patch
      if: success() || failure()
      uses: actions/upload-artifact@v4
      with:
        name: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.cxx_std }}-${{ matrix.stdlib }}.patch
        path: regression-tests/${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.cxx_std }}-${{ matrix.stdlib }}.patch
        if-no-files-found: ignore

  aggregate-results:
    needs: regression-tests
    if:  success() || failure()
    runs-on: ubuntu-latest
    steps:
      - name: Download all patches
        uses: actions/download-artifact@v4
        with:
          path: downloaded-results

      - name: Prepare result files
        id: prepare_files
        run: |
          mkdir aggregated-results
          echo "Flattening file hierarchy"
          find . -type f -wholename "./downloaded-results*" -exec mv {} aggregated-results \;
          patch_count=$(ls aggregated-results 2>/dev/null | wc -l)
          echo "patch_count=${patch_count}" >> $GITHUB_OUTPUT

      - name: Upload aggregated results
        if: steps.prepare_files.outputs.patch_count != '0'
        uses: actions/upload-artifact@v4
        with:
          name: aggregated-results
          path: aggregated-results
          if-no-files-found: ignore