name: Test
on:
  # Manual trigger
  workflow_dispatch:
  push:
    branches: [main]
  pull_request:

permissions:
  contents: read

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
      - name: Set up Go
        uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
        with:
          go-version: "^1.23"
      - name: Check formatting
        run: |
          unformatted=$(gofmt -l .)
          if [ -n "$unformatted" ]; then
            echo "The following files are not properly formatted:"
            echo "$unformatted"
            exit 1
          fi
          echo "All Go files are properly formatted"
      - name: Run Go vet
        run: go vet ./...
      - name: Run staticcheck
        uses: dominikh/staticcheck-action@024238d2898c874f26d723e7d0ff4308c35589a2 # v1
        with:
          version: "latest"

  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go: ["1.23", "1.24", "1.25"]
    steps:
      - name: Check out code
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
      - name: Set up Go
        uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
        with:
          go-version: ${{ matrix.go }}
      - name: Test
        run: go test -v ./...

  race-test:
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4
      - name: Set up Go
        uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5
        with:
          go-version: "1.24"
      - name: Test with -race
        run: go test -v -race ./...
