name: Run tests
on:
  pull_request:
    branches:
      - 'master'
      - 'release-*'
  push:
    branches:
      - 'master'
      - 'release-*'
    tags:
      - '*'
defaults:
  run:
    shell: bash
jobs:
  test:
    runs-on: ${{ matrix.os }}
    timeout-minutes: 60
    permissions:
      # needed to allow julia-actions/cache to proactively delete old caches that it has created
      actions: write
      contents: read
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-13 # Intel
          - windows-latest
        julia-arch:
          - 'x64'
          - 'x86'
        julia-version:
          - 'lts'
          - 'nightly'
        exclude:
          - os: macos-13 # Intel
            julia-arch: x86
        include:
          - os: macos-latest # Apple Silicon
            julia-arch: 'aarch64'
            julia-version: 'lts'
          - os: macos-latest # Apple Silicon
            julia-arch: 'aarch64'
            julia-version: 'nightly'
    steps:
      - uses: actions/checkout@v4
      - uses: julia-actions/setup-julia@latest
        with:
          version: ${{ matrix.julia-version }}
          arch: ${{ matrix.julia-arch }}
      - uses: julia-actions/cache@v2
      # Alter the UUID so that we test this package instead of loading
      # the version that is already built into a Julia's system image.
      - run: julia --color=yes .ci/test_and_change_uuid.jl
      - uses: julia-actions/julia-buildpkg@v1
      - uses: julia-actions/julia-runtest@v1
      - uses: julia-actions/julia-processcoverage@v1
      - uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: lcov.info
  doctests:
    runs-on: ubuntu-latest
    permissions:
      # needed to allow julia-actions/cache to proactively delete old caches that it has created
      actions: write 
      contents: write
      statuses: write
    steps:
      - uses: actions/checkout@v4
      - uses: julia-actions/setup-julia@v2
        with:
          version: 'nightly'
      - uses: julia-actions/cache@v2
      - run: julia --color=yes .ci/test_and_change_uuid.jl
      - name: Configure doc environment
        shell: julia --project=docs --color=yes {0}
        run: |
          using Pkg
          Pkg.develop(PackageSpec(path=pwd()))
          Pkg.instantiate()
      - uses: julia-actions/julia-buildpkg@v1
      - name: Run doctests
        shell: julia --project=docs --color=yes {0}
        run: |
          using Documenter: DocMeta, doctest
          using SHA
          DocMeta.setdocmeta!(SHA, :DocTestSetup, :(using SHA); recursive=true)
          doctest(SHA)
