name: Run tests
on:
  pull_request:
  push:
    branches:
      - 'master'
      - 'release-*'
    tags: '*'
defaults:
  run:
    shell: bash
concurrency:
  # Skip intermediate builds: all builds except for builds on the `master` or `release-*` branches
  # Cancel intermediate builds: only pull request builds
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release-') || github.run_number }}
  cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
jobs:
  test:
    runs-on: ${{ matrix.os }}
    timeout-minutes: 70
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macOS-14 # arm
          - windows-latest
        julia-arch:
          - 'x64'
          - 'x86'
          - 'aarch64'
        pkg-server:
          - "pkg.julialang.org" # Default to this for all except specific cases
        julia-version:
          - '1.12-nightly'
        exclude:
          - os: ubuntu-latest
            julia-arch: aarch64
          - os: windows-latest
            julia-arch: aarch64
          - os: macOS-14
            julia-arch: x86
          - os: macOS-14
            julia-arch: x64
        include:
          - os: ubuntu-latest
            julia-arch: 'x64'
            julia-version: '1.12-nightly'
            pkg-server: ""
          - os: ubuntu-latest
            julia-arch: 'x64'
            julia-version: '1.12-nightly'
            pkg-server: "pkg.julialang.org"
    steps:
      - name: Set git to use LF and fix TEMP on windows
        if: matrix.os == 'windows-latest'
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf
          # See https://github.com/actions/virtual-environments/issues/712
          echo "TMP=${USERPROFILE}\AppData\Local\Temp" >> ${GITHUB_ENV}
          echo "TEMP=${USERPROFILE}\AppData\Local\Temp" >> ${GITHUB_ENV}
      - uses: actions/checkout@v4
      - uses: julia-actions/setup-julia@v2
        with:
          version: ${{ matrix.julia-version }}
          arch: ${{ matrix.julia-arch }}
      - uses: julia-actions/julia-runtest@v1
        with:
          coverage: true
        env:
          JULIA_PKG_SERVER: ${{ matrix.pkg-server }}
          JULIA_TEST_VERBOSE_LOGS_DIR: ${{ github.workspace }}
      - uses: actions/upload-artifact@v4
        if: ${{ always() }}
        with:
          name: ${{ join(matrix.*, '-') }}_Pkg.log
          path: ${{ github.workspace }}/Pkg.log
      - uses: julia-actions/julia-processcoverage@v1
        env:
            JULIA_PKG_SERVER: ${{ matrix.pkg-server }}
      - uses: codecov/codecov-action@v3
        with:
          file: lcov.info
  docs:
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - uses: julia-actions/setup-julia@v2
        with:
          # version: '1.6'
          version: '1.12-nightly'
      - name: Generate docs
        run: |
          julia --project --color=yes -e 'using Pkg; Pkg.activate("docs"); Pkg.instantiate();'
          julia --project=docs --color=yes docs/make.jl pdf
        env:
          DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }}
      - name: Upload documentation artifacts
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: pkg-docs
          path: docs/build/
