name: Reusable Standard Test

on:
  workflow_call:
    inputs:
      python-version:
        required: true
        type: string
      cmake-args:
        required: false
        type: string
        default: ''
      runs-on:
        required: true
        type: string

env:
  PYTHONDEVMODE: 1
  PIP_BREAK_SYSTEM_PACKAGES: 1
  PIP_ONLY_BINARY: numpy
  FORCE_COLOR: 3
  PYTEST_TIMEOUT: 300
  # For cmake:
  VERBOSE: 1
  CMAKE_COLOR_DIAGNOSTICS: 1

jobs:
  standard:
    name: 🧪
    runs-on: ${{ inputs.runs-on }}
    timeout-minutes: 90

    steps:
      - uses: actions/checkout@v6

      - name: Setup Python ${{ inputs.python-version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ inputs.python-version }}
          allow-prereleases: true
          # Python 3.13.4 broken on Windows
          check-latest: >-
            ${{ inputs.python-version == '3.13' && runner.os == 'Windows' }}

      - name: Setup Boost (Linux)
        if: runner.os == 'Linux'
        run: sudo apt-get install libboost-dev

      - name: Setup Boost (macOS)
        if: runner.os == 'macOS'
        run: brew install boost

      - name: Install uv
        uses: astral-sh/setup-uv@v7
        with:
          enable-cache: true

      - name: Prepare env
        run: uv pip install --python=python --system -r tests/requirements.txt

      - name: Setup annotations on Linux
        if: runner.os == 'Linux'
        run: uv pip install --python=python --system pytest-github-actions-annotate-failures

      # TODO Resolve Windows Ninja shared object issue on Python 3.8+
      - name: Use Ninja except on Windows
        if: runner.os != 'Windows'
        run: echo "CMAKE_GENERATOR=Ninja" >> "$GITHUB_ENV"

      - name: Configure
        run: >
          cmake -S. -Bbuild -Werror=dev
          -DPYBIND11_WERROR=ON
          -DPYBIND11_PYTEST_ARGS=-v
          -DDOWNLOAD_CATCH=ON
          -DDOWNLOAD_EIGEN=ON
          ${{ inputs.cmake-args }}

      - name: Build
        run: cmake --build build

      - name: Python tests
        run: cmake --build build --target pytest

      - name: C++ tests
        timeout-minutes: 3
        run: cmake --build build --target cpptest

      - name: Interface test
        run: cmake --build build --target test_cmake_build

      - name: Visibility test
        run: cmake --build build --target test_cross_module_rtti

      - name: Setuptools helpers test
        run: |
          uv pip install --python=python --system setuptools
          pytest tests/extra_setuptools
