name: Go

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  test-linux:
    name: Linux
    runs-on: ubuntu-latest
    steps:
      - name: Check out code into the Go module directory
        uses: actions/checkout@v4

      - name: Set up Go 1.x
        uses: actions/setup-go@v5
        with:
          go-version: '1.19'
          check-latest: true
          cache: true
        id: go

      - name: Get dependencies
        run: |
          go get -v -t -d ./...

      - name: Lint
        run: |
          go vet -stdmethods=false $(go list ./...)

          go mod tidy
          if ! test -z "$(git status --porcelain)"; then
            echo "Please run 'go mod tidy'"
            exit 1
          fi

      - name: Test
        run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...

      - name: Codecov
        uses: codecov/codecov-action@v4

  test-win:
    name: Windows
    runs-on: windows-latest
    steps:
      - name: Checkout codebase
        uses: actions/checkout@v4

      - name: Set up Go 1.x
        uses: actions/setup-go@v5
        with:
          # use 1.19 to guarantee Go 1.19 compatibility
          go-version: '1.19'
          check-latest: true
          cache: true

      - name: Test
        run: |
          go mod verify
          go mod download
          go test ./...
          cd tools/goctl && go build -v goctl.go
