name: Run Tests

on:
  push:
    branches:
      - main
    tags:
      - v2.*
  pull_request:
    branches:
      - main

jobs:
  test:
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        go: [1.16.x, 1.17.x, 1.18.x]
    name: ${{ matrix.os }} @ Go ${{ matrix.go }}
    runs-on: ${{ matrix.os }}
    steps:
      - name: Set up Go ${{ matrix.go }}
        uses: actions/setup-go@v3
        with:
          go-version: ${{ matrix.go }}

      - name: Set PATH
        run: echo "${GITHUB_WORKSPACE}/.local/bin" >>"${GITHUB_PATH}"

      - name: Checkout Code
        uses: actions/checkout@v3

      - name: GOFMT Check
        if: matrix.go == '1.18.x' && matrix.os == 'ubuntu-latest'
        run: test -z $(gofmt -l .)

      - name: vet
        run: go run internal/build/build.go vet

      - name: test
        run: go run internal/build/build.go test

      - name: check-binary-size
        run: go run internal/build/build.go check-binary-size

      - name: Upload coverage to Codecov
        if: success() && matrix.go == '1.18.x' && matrix.os == 'ubuntu-latest'
        uses: codecov/codecov-action@v2
        with:
          fail_ci_if_error: true

  test-docs:
    name: test-docs
    runs-on: ubuntu-latest
    steps:
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: 1.18.x

      - name: Use Node.js 16
        uses: actions/setup-node@v3
        with:
          node-version: '16'

      - name: Set PATH
        run: echo "${GITHUB_WORKSPACE}/.local/bin" >>"${GITHUB_PATH}"

      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Install Dependencies
        run:
          mkdir -p "${GITHUB_WORKSPACE}/.local/bin" &&
          curl -fsSL -o "${GITHUB_WORKSPACE}/.local/bin/gfmrun" "https://github.com/urfave/gfmrun/releases/download/v1.3.0/gfmrun-$(go env GOOS)-$(go env GOARCH)-v1.3.0" &&
          chmod +x "${GITHUB_WORKSPACE}/.local/bin/gfmrun" &&
          npm install -g markdown-toc@1.2.0

      - name: gfmrun
        run: go run internal/build/build.go gfmrun docs/v2/manual.md

      - name: toc
        run: go run internal/build/build.go toc docs/v2/manual.md
