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-20.04, ubuntu-22.04, macos-11, macos-12, macos-13]
    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@c85c95e3d7251135ab7dc9ce3241c5835cc595a9

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

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

    - name: Build (cross-compile)
      if: matrix.os == 'ubuntu-22.04'
      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 ./...
