name: Windows tests

on:
  pull_request:
    branches:
      - main
      - maintenance/**
    paths-ignore:
      - '**.pyi'
      - '**.md'
      - '**.rst'
      - 'tools/stubtest/**'

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read # to fetch code (actions/checkout)

jobs:
  clangcl_python64bit_openblas32:
    name: Clang-cl, x86-64, fast, openblas32
    runs-on: windows-2022
    # To enable this job on a fork, comment out:
    if: github.repository == 'numpy/numpy'
    steps:
    - name: Checkout
      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: recursive
        fetch-tags: true
        persist-credentials: false

    - name: Setup Python
      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
      with:
        python-version: "3.14t"

    - name: Install build dependencies from PyPI
      run: |
        pip install -r requirements/build_requirements.txt

    - name: Install pkg-config
      run: |
        python -m pip install pkgconf==2.5.1.post1
        echo "PKG_CONFIG_PATH=${{ github.workspace }}/.openblas" >> $env:GITHUB_ENV

    - name: Install NumPy (Clang-cl)
      run: |
        "[binaries]","c = 'clang-cl'","cpp = 'clang-cl'","ar = 'llvm-lib'","c_ld = 'lld-link'","cpp_ld = 'lld-link'" | Out-File $PWD/clang-cl-build.ini -Encoding ascii
        pip install -r requirements/ci_requirements.txt
        spin build --with-scipy-openblas=32 -j2 -- --vsenv --native-file=$PWD/clang-cl-build.ini

    - name: Meson Log
      shell: bash
      if: ${{ failure()  }}
      run: |
        cat build/meson-logs/meson-log.txt

    - name: Install test dependencies
      run: |
        python -m pip install -r requirements/test_requirements.txt
        python -m pip install threadpoolctl

    - name: Run test suite
      run: |
        spin test -- --timeout=600 --durations=10


  #=======================================================================================
  msvc_python_x86_arm64_no_openblas:
    name: MSVC, ${{ matrix.os }} ${{ matrix.architecture }}, full, no BLAS, ${{ matrix.python_version }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: windows-2022
            architecture: x86
            python_version: '3.15t-dev'
          - os: windows-11-arm
            architecture: arm64
            python_version: '3.12'
    # To enable this job on a fork, comment out:
    if: github.repository == 'numpy/numpy'
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          submodules: recursive
          fetch-tags: true
          persist-credentials: false

      - name: Setup Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: ${{ matrix.python_version }}
          architecture: ${{ matrix.architecture }}

      - name: Setup MSVC
        uses: bus1/cabuild/action/msdevshell@e22aba57d6e74891d059d66501b6b5aed8123c4d  # v1
        with:
          architecture: ${{ matrix.architecture }}

      - name: Build and install
        run: |
          python -m pip install . -v -Ccompile-args="-j2" -Csetup-args="-Dallow-noblas=true" 2>&1 | tee build.log

      - name: Check warnings
        uses: ./.github/check-warnings
        with:
          log-file: ./build.log
          allowlist: ./.github/check-warnings/msvc-allowed-warnings.txt
          warning-regex: "warning C|Command line warning"

      - name: Install test dependencies
        run: |
          python -m pip install -r requirements/test_requirements.txt

      - name: Run test suite (full)
        run: |
          cd tools
          python -m pytest --pyargs numpy -n auto --timeout=600 --durations=10

  #=======================================================================================
  msvc_python64bit_openblas:
    name: MSVC, x86_64, ${{ matrix.TEST_MODE }}, openblas${{ matrix.BLAS }}
    runs-on: windows-2022
    strategy:
      fail-fast: false
      matrix:
        include:
          - BLAS: 64
            TEST_MODE: full
            pyver: '3.14'
          - BLAS: 32
            TEST_MODE: fast
            pyver: '3.12'

    # To enable this job on a fork, comment out:
    if: github.repository == 'numpy/numpy'
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          submodules: recursive
          fetch-tags: true
          persist-credentials: false

      - name: Setup Python
        uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: ${{ matrix.pyver }}

      - name: pkg-config
        run: |
          python -m pip install pkgconf==2.5.1.post1

      - name: Dependencies
        run: |
          python -m pip install -r requirements/test_requirements.txt
          python -m pip install -r requirements/build_requirements.txt

      - name: Build and install
        run: |
          pip install -r requirements/ci_requirements.txt
          spin config-openblas --with-scipy-openblas=${{ matrix.BLAS }}
          $env:PKG_CONFIG_PATH="$pwd/.openblas"
          python -m pip install --no-build-isolation . -v -Csetup-args="--vsenv" -Csetup-args="-Dallow-noblas=false"

      - name: Run test suite ${{ matrix.TEST_MODE }}
        run: |
          cd tools
          # Get a gfortran onto the path for f2py tests
          $env:PATH = "c:\\rtools45\\x86_64-w64-mingw32.static.posix\\bin;$env:PATH"
          If ( "${{ matrix.TEST_MODE }}" -eq "full" ) {
            python -m pytest --pyargs numpy -rsx -n2 --durations=10
          } else {
            python -m pytest --pyargs numpy -m "not slow" -n2 --timeout=600 --durations=10 -rsx
          }
