# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go

name: Go

on:
  push:
    branches: [ "*" ]
  pull_request:
    branches: [ "*" ]

jobs:

  test:
    strategy:
      matrix:
        os: [macos-latest, ubuntu-latest]
        llvm: [18]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4

      - name: Update Homebrew
        # needed as long as LLVM 18 is still fresh
        if: matrix.llvm == 18 && startsWith(matrix.os, 'macos')
        run: brew update
      - name: Install LLVM ${{ matrix.llvm }} and bdw-gc
        if: startsWith(matrix.os, 'macos')
        run: |
          HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@${{ matrix.llvm }} bdw-gc
          echo `brew --prefix llvm@${{ matrix.llvm }}`/bin >> $GITHUB_PATH
      - name: Install LLVM ${{ matrix.llvm }} and libgc-dev
        if: startsWith(matrix.os, 'ubuntu')
        run: |
          echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{ matrix.llvm }} main" | sudo tee /etc/apt/sources.list.d/llvm.list
          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
          sudo apt-get update
          sudo apt-get install -y llvm-${{ matrix.llvm }}-dev clang-${{ matrix.llvm }} lld-${{ matrix.llvm }} pkg-config libgc-dev libcjson-dev libsqlite3-dev python3.11-dev
          echo /usr/lib/llvm-${{ matrix.llvm }}/bin >> $GITHUB_PATH
    
      - name: Clang information
        run: |
          echo $PATH
          which clang
          clang --version
        
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.20'

      - name: Build
        run: go build -v ./...

      - name: Test
        if: matrix.os != 'macos-latest'
        run: go test -v ./...

      - name: Test with coverage
        if: matrix.os == 'macos-latest'
        run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...

      - name: Install
        run: go install ./...
      
      - name: LLGO tests
        if: matrix.os != 'ubuntu-latest'
        run: |
          echo "Test result on ${{ matrix.os }} with LLVM ${{ matrix.llvm }}" > result.md
          LLGOROOT=$PWD bash .github/workflows/test_llgo.sh
      
      - name: Test _demo and _pydemo
        run: |
          set +e
          LLGOROOT=$PWD bash .github/workflows/test_demo.sh
          exit 0
      
      - name: Show test result
        run: cat result.md

      - name: PR comment with test result
        uses: thollander/actions-comment-pull-request@v2
        if: false
        with:
          filePath: result.md
          comment_tag: test-result-on-${{ matrix.os }}-with-llvm-${{ matrix.llvm }}

      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          slug: goplus/llgo
