name: Run unit tests on Windows

on: [push, pull_request]

permissions:
  contents: read

jobs:
  chunk-matrix:
    permissions:
      contents: none
    name: Generate Chunk Matrix

    runs-on: ubuntu-latest
    env:
      CHUNK_COUNT: 8

    outputs:
      count: ${{ steps.chunk-matrix.outputs.count }}
      chunks: ${{ steps.chunk-matrix.outputs.chunks }}

    steps:
      - id: chunk-matrix
        name: Generates the Chunk Matrix
        run: |
          echo "count=$(php -r 'echo json_encode([ ${{ env.CHUNK_COUNT }} ]);')" >> $GITHUB_OUTPUT
          echo "chunks=$(php -r 'echo json_encode(range(1, ${{ env.CHUNK_COUNT }} ));')" >> $GITHUB_OUTPUT
        shell: bash

  tests:
    name: "Unit Tests - ${{ matrix.chunk }}"

    runs-on: windows-latest
    needs:
      - chunk-matrix

    strategy:
      fail-fast: false
      matrix:
        count: ${{ fromJson(needs.chunk-matrix.outputs.count) }}
        chunk: ${{ fromJson(needs.chunk-matrix.outputs.chunks) }}

    env:
      CHUNK_COUNT: "${{ matrix.count }}"
      CHUNK_NUMBER: "${{ matrix.chunk }}"
      PARALLEL_PROCESSES: 4

    steps:
      - name: Set git to use LF
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf

      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.0'
          ini-values: zend.assertions=1, assert.exception=1, opcache.enable_cli=1, opcache.jit=function, opcache.jit_buffer_size=512M
          tools: composer:v2
          coverage: none
          extensions: none, curl, dom, filter, intl, json, libxml, mbstring, openssl, opcache, pcre, phar, reflection, simplexml, spl, tokenizer, xml, xmlwriter
        env:
          fail-fast: true

      - uses: actions/checkout@v3

      - name: Get Composer Cache Directories
        id: composer-cache
        run: |
          echo "files_cache=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
          echo "vcs_cache=$(composer config cache-vcs-dir)" >> $GITHUB_OUTPUT
        shell: bash

      - name: Generate composer.lock
        run: |
          composer update --no-install
        env:
          COMPOSER_ROOT_VERSION: dev-master

      - name: Cache composer cache
        uses: actions/cache@v3
        with:
          path: |
            ${{ steps.composer-cache.outputs.files_cache }}
            ${{ steps.composer-cache.outputs.vcs_cache }}
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: |
            ${{ runner.os }}-composer-

      - name: Run composer install
        run: composer install -o
        env:
          COMPOSER_ROOT_VERSION: dev-master

      - name: Generate test suits
        run: php bin/generate_testsuites.php $env:CHUNK_COUNT

      - name: Run unit tests
        run: vendor/bin/paratest --processes=$env:PARALLEL_PROCESSES --testsuite=chunk_$env:CHUNK_NUMBER --log-junit build/phpunit/phpunit.xml
