name: Tests

on:
  push:
    branches:
      - main
    tags:
      - "**"
  pull_request:
    branches:
      - "**"

concurrency:
  group: ${{ github.event_name == 'pull_request' && format('{0}-{1}', github.workflow_ref, github.event.pull_request.number) || github.run_id }}
  cancel-in-progress: true

jobs:
  tests:
    name: Unit Tests
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest, windows-latest]
        python:
          - major-dot-minor: "3.9"
            stubtest-args: --allowlist wheel/stubtest.allowlist.disjoint-base
          - major-dot-minor: "3.10"
            stubtest-args: --allowlist wheel/stubtest.allowlist.disjoint-base
          - major-dot-minor: "3.11"
            stubtest-args: --allowlist wheel/stubtest.allowlist.3-11 --allowlist wheel/stubtest.allowlist.disjoint-base
          - major-dot-minor: "3.12"
            stubtest-args: --allowlist wheel/stubtest.allowlist.3-12
          - major-dot-minor: "3.13"
            stubtest-args: --allowlist wheel/stubtest.allowlist.3-13

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - uses: chia-network/actions/setup-python@main
        name: Install Python ${{ matrix.python.major-dot-minor }}
        with:
          python-version: ${{ matrix.python.major-dot-minor }}

      - name: Update pip
        run: |
          python -m pip install --upgrade pip

      - name: Set up rust
        uses: dtolnay/rust-toolchain@stable

      - uses: chia-network/actions/create-venv@main
        id: create-venv

      - uses: chia-network/actions/activate-venv@main
        with:
          directories: ${{ steps.create-venv.outputs.activate-venv-directories }}

      - name: Install dependencies
        run: |
          python -m pip install maturin
          rustup target add x86_64-unknown-linux-musl
          python -m pip install pytest pytest-xdist
          python -m pip install mypy
          python -m pip install black
          python -m pip install clvm_tools colorama clvm

      - name: Build (windows)
        if: matrix.os == 'windows-latest'
        run: |
          maturin develop --release -m wheel/Cargo.toml

      - name: Build (non-windows)
        if: matrix.os != 'windows-latest'
        run: |
          maturin develop --release -m wheel/Cargo.toml --features=openssl

      - name: python mypy
        run: |
          mypy tests

      - name: python mypy stubtest
        shell: bash
        run: |
          FAILURE=0
          EXTRA_ARGS=()
          if [[ "${{ matrix.python.major-dot-minor }}" == "3.9" ]]; then
            EXTRA_ARGS=(--allowlist wheel/stubtest.allowlist.3-9)
          fi
          echo "::group::concise"
          if ! stubtest ${{ matrix.python.stubtest-args }} "${EXTRA_ARGS[@]}" --allowlist wheel/stubtest.allowlist --concise chia_rs
          then
            FAILURE=1
          fi
          echo "::endgroup::"

          echo "::group::complete"
          if ! stubtest ${{ matrix.python.stubtest-args }} "${EXTRA_ARGS[@]}" --allowlist wheel/stubtest.allowlist chia_rs
          then
            FAILURE=1
          fi
          echo "::endgroup::"

          exit ${FAILURE}

      - name: python black
        if: matrix.python.major-dot-minor != 3.9
        run: |
          black --check tests
          black --check wheel/generate_type_stubs.py

      - name: python tests
        run: |
          pytest tests

  generator-benchmarks:
    name: Generator performance
    runs-on: benchmark
    container:
      image: chianetwork/ubuntu-22.04-builder:latest
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.10", "3.13"]

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - uses: chia-network/actions/setup-python@main
        name: Install Python ${{ matrix.python-version }}
        with:
          python-version: ${{ matrix.python-version }}

      - name: Set up rust
        uses: dtolnay/rust-toolchain@1.92.0

      - uses: chia-network/actions/create-venv@main
        id: create-venv

      - uses: chia-network/actions/activate-venv@main
        with:
          directories: ${{ steps.create-venv.outputs.activate-venv-directories }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          python -m pip install maturin colorama clvm_tools
          rustup target add x86_64-unknown-linux-musl

      - name: Build
        run: |
          maturin develop --release -m wheel/Cargo.toml --features=openssl

      - name: test generators
        run: |
          cd tests
          ./test-generators.py

      - name: Run cost checks
        run: |
          cd tests
          ./generate-programs.py
          ./run-programs.py

  benchmarks:
    name: rust benchmarks
    runs-on: benchmark
    container:
      image: chianetwork/ubuntu-22.04-builder:latest
    strategy:
      fail-fast: false

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - name: Set up rust
        uses: dtolnay/rust-toolchain@1.92.0

      - name: cargo bench
        run: |
          cargo bench --workspace
