name: Tests

on:
  push:
    branches:
    - main
  pull_request:
    branches:
    - main

jobs:
  build-and-test:
    strategy:
      matrix:
        go-version: ['1.18', '1.19', '1.20']
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.os }}

    steps:
    - name: Install Go
      uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753
      with:
        go-version: ${{ matrix.go-version }}

    - name: Check out code
      uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab

    - name: Check formatting
      if: ${{ matrix.go-version == '1.20' && matrix.os == 'ubuntu-latest' }}
      run: diff -u <(echo -n) <(gofmt -d .)

    - name: Check Go modules
      if: ${{ matrix.go-version == '1.20' && matrix.os == 'ubuntu-latest' }}
      run: |
        go mod tidy
        git diff --exit-code

    - name: Build (cross-compile)
      if: matrix.os == 'ubuntu-latest'
      run: |
        GOOS=darwin go build ./...
        GOOS=dragonfly go build ./...
        GOOS=freebsd go build ./...
        GOOS=linux go build ./...
        GOOS=netbsd go build ./...
        GOOS=openbsd go build ./...
        GOOS=solaris go build ./...
        GOOS=windows go build ./...

    - name: Test (native)
      run: go test -v ./...
