name: Run tests

on:
  push:
    branches:
      - master
      - dev
    paths-ignore:
      - '**.md'
      - '**.yml'
      - '**.yaml'
      - 'examples/*'
      - '!.github/workflows/test.yml'
  pull_request:
    branches:
      - master
      - dev
    paths-ignore:
      - '**.md'
      - '**.yml'
      - '**.yaml'
      - 'examples/*'
      - '!.github/workflows/test.yml'

env:
  GO111MODULE: on
  GOPROXY: "https://proxy.golang.org"

jobs:
  lint:
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
    name: Run golangci-lint
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '^1.20'
          cache: false

      - name: Setup and run golangci-lint
        uses: golangci/golangci-lint-action@v6
        with:
          version: v1.62.2
          args: --timeout 5m -v -E gofumpt -E gocritic -E misspell -E revive -E godot
  test:
    needs: lint
    strategy:
      fail-fast: false
      matrix:
        go: [1.18, 1.23]
        os: [ubuntu-latest, macos-latest, windows-latest]
    name: Go ${{ matrix.go }} @ ${{ matrix.os }}
    runs-on: ${{ matrix.os}}
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          ref: ${{ github.ref }}

      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go }}

      - name: Print Go environment
        id: go-env
        run: |
          printf "Using go at: $(which go)\n"
          printf "Go version: $(go version)\n"
          printf "\n\nGo environment:\n\n"
          go env
          printf "\n\nSystem environment:\n\n"
          env
          # Calculate the short SHA1 hash of the git commit
          echo "SHORT_SHA=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
          echo "GO_CACHE=$(go env GOCACHE)" >> $GITHUB_OUTPUT

      - name: Run unit tests and integrated tests
        run: go test -v -race -coverprofile="codecov.report" -covermode=atomic

      - name: Upload code coverage report to Codecov
        uses: codecov/codecov-action@v5
        with:
          files: ./codecov.report
          flags: unittests
          name: codecov-ants
          fail_ci_if_error: true
          verbose: true
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
