name: Run unit tests

on: [push, pull_request]
permissions:
  contents: read

jobs:
  lint:
    name: Check PHP syntax
    runs-on: ubuntu-latest
    steps:
      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.1'
          tools: composer:v2
          coverage: none

      - uses: actions/checkout@v3

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

      - 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: Drop incompatible packages
        run: composer remove --no-interaction --dev phpunit/phpunit brianium/paratest psalm/plugin-phpunit weirdan/prophecy-shim

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

      - run: |
          git ls-files | grep \\\.php$ | grep -v ^dictionaries/scripts/* | ./vendor/bin/parallel-lint --stdin
  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 "::set-output name=count::$(php -r 'echo json_encode([ ${{ env.CHUNK_COUNT }} ]);')"
          echo "::set-output name=chunks::$(php -r 'echo json_encode(range(1, ${{ env.CHUNK_COUNT }} ));')"

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

    runs-on: ubuntu-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: 5

    steps:
      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'
          tools: composer:v2
          coverage: none
          extensions: decimal

      - uses: actions/checkout@v3

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

      - 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: Run unit tests
        run: bin/tests-github-actions.sh
