name: ๐Ÿ”Ž Test builds
on:
  workflow_dispatch:

  push:
    branches: [master]
    paths-ignore:
      - "README.md"
      - "LICENSE.md"
      - "**/*.png"
      - "demo/**"
      - "doc/**"

  pull_request:
    branches: [master]
    paths-ignore:
      - "README.md"
      - "LICENSE.md"
      - "**/*.png"
      - "demo/**"
      - "doc/**"

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

# Global Settings.
env:
  GODOT_REF: "4.3"
  GODOT_CPP_REF: "godot-4.3-stable"

jobs:
  unit-tests:
    name: ๐Ÿงช Unit tests
    runs-on: "ubuntu-20.04"

    # Settings
    env:
      SCONSFLAGS: platform=linuxbsd target=editor arch=x86_64 production=false dev_build=true tests=true verbose=yes warnings=extra werror=yes
      SCONS_CACHE_LIMIT: 7168
      BIN: godot.linuxbsd.editor.dev.x86_64

    steps:
      - name: Clone Godot
        uses: actions/checkout@v4
        with:
          repository: godotengine/godot
          ref: ${{ env.GODOT_REF }}

      - name: Clone LimboAI module
        uses: actions/checkout@v4
        with:
          path: modules/limboai

      - name: Set up Linux toolchain
        uses: ./modules/limboai/.github/actions/setup-linux-toolchain
        with:
          arch: x86_64

      - name: Set up scons cache
        uses: actions/cache@v4
        with:
          path: ${{github.workspace}}/.scons_cache/
          key: ${{env.BIN}}-${{env.GODOT_REF}}-${{github.ref}}-${{github.sha}}
          restore-keys: |
            ${{env.BIN}}-${{env.GODOT_REF}}-${{github.ref}}-${{github.sha}}
            ${{env.BIN}}-${{env.GODOT_REF}}-${{github.ref}}
            ${{env.BIN}}-${{env.GODOT_REF}}
        continue-on-error: true

      - name: Set up Python 3.x
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"
          architecture: "x64"

      - name: Set up scons
        run: |
          python -c "import sys; print(sys.version)"
          python -m pip install scons==4.4.0
          python --version
          scons --version

      - name: Setup GCC problem matcher
        uses: ammaraskar/gcc-problem-matcher@master

      - name: Compilation
        env:
          SCONS_CACHE: ${{github.workspace}}/.scons_cache/
        run: |
          PATH=${GITHUB_WORKSPACE}/buildroot/bin:$PATH
          scons ${{env.SCONSFLAGS}}

      - name: Verify build
        run: |
          ls -l bin/
          bin/${{ env.BIN }} --version
          bin/${{ env.BIN }} --help

      - name: Unit tests
        run: |
          bin/${{ env.BIN }} --test --headless

  static-checks:
    name: โš™๏ธ Static checks
    runs-on: ubuntu-20.04
    steps:
      - name: Clone LimboAI module
        uses: actions/checkout@v4

      - name: Code style checks
        uses: pre-commit/action@v3.0.1
        with:
          extra_args: --all-files

  cache-env:
    runs-on: ubuntu-latest
    outputs:
      godot-ref: ${{ steps.cache-env.outputs.godot-ref }}
      godot-cpp-ref: ${{ steps.cache-env.outputs.godot-cpp-ref }}
    steps:
      - name: Cache env
        id: cache-env
        run: |
          echo "godot-ref=${GODOT_REF}" >> "$GITHUB_OUTPUT"
          echo "godot-cpp-ref=${GODOT_CPP_REF}" >> "$GITHUB_OUTPUT"

  linux-test-build:
    name: ๐Ÿง Linux
    needs: cache-env
    uses: ./.github/workflows/linux.yml
    with:
      godot-ref: ${{ needs.cache-env.outputs.godot-ref }}
      limboai-ref: ${{ github.sha }}
      test-build: true

  windows-test-build:
    name: ๐ŸชŸ Windows
    needs: cache-env
    uses: ./.github/workflows/windows.yml
    with:
      godot-ref: ${{ needs.cache-env.outputs.godot-ref }}
      limboai-ref: ${{ github.sha }}
      test-build: true

  macos-test-build:
    name: ๐ŸŽ macOS
    needs: cache-env
    uses: ./.github/workflows/macos.yml
    with:
      godot-ref: ${{ needs.cache-env.outputs.godot-ref }}
      limboai-ref: ${{ github.sha }}
      test-build: true

  gdextension:
    name: ๐Ÿ”Œ GDExtension
    needs: cache-env
    uses: ./.github/workflows/gdextension.yml
    with:
      godot-cpp-ref: ${{ needs.cache-env.outputs.godot-cpp-ref }}
      limboai-ref: ${{ github.sha }}
      test-build: true