name: Tests
on:
  push:
    branches:
      - main
  pull_request:

env:
  # https://github.com/actions/setup-go#supported-version-syntax
  # ex:
  # - 1.18beta1 -> 1.18.0-beta.1
  # - 1.18rc1 -> 1.18.0-rc.1
  GO_VERSION: '1.24'

jobs:
  # Check if there is any dirty change for go mod tidy
  go-mod:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ env.GO_VERSION }}
      - name: Check go mod
        run: |
          go mod tidy
          git diff --exit-code go.mod
          git diff --exit-code go.sum

  # We already run the current golangci-lint in tests, but here we test
  # our GitHub action with the latest stable golangci-lint.
  golangci-lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          # https://github.com/actions/setup-go#supported-version-syntax
          # ex:
          # - 1.18beta1 -> 1.18.0-beta.1
          # - 1.18rc1 -> 1.18.0-rc.1
          go-version: ${{ env.GO_VERSION }}
      - name: lint
        uses: golangci/golangci-lint-action@v7.0.0
        with:
          version: latest

  tests-on-windows:
    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ env.GO_VERSION }} # test only the latest go version to speed up CI
      - name: Run tests
        run: make.exe test

  tests-on-macos:
    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ env.GO_VERSION }} # test only the latest go version to speed up CI
      - name: Run tests
        run: make test

  tests-on-unix:
    needs: golangci-lint # run after golangci-lint action to not produce duplicated errors
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - ubuntu-24.04-arm
        golang:
          - '1.23'
          - '1.24'
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.golang }}
      - name: Run tests
        run: make test
