name: Tests

on:
    push: ~
    pull_request: ~

permissions:
  contents: read

jobs:
    phpcs:
        name: PHPCS
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v4

            - uses: shivammathur/setup-php@v2
              with:
                  php-version: 7.4
                  extensions: curl, mbstring, yaml
                  coverage: none
                  tools: composer:v2, cs2pr

            - run: composer update --no-progress

            - run: vendor/bin/phpcs -q --report=checkstyle | cs2pr

    phpunit:
        name: PHPUnit on ${{ matrix.php }} ${{ matrix.composer-flags }}
        runs-on: ubuntu-latest
        continue-on-error: ${{ !matrix.stable }}
        strategy:
            fail-fast: false
            matrix:
                php: ['7.4', '8.0', '8.1', '8.2', '8.3']
                stable: [true]
                coverage: [true]
                composer-flags: ['']
                include:
                    - php: '7.4'
                      stable: true
                      coverage: false
                      composer-flags: '--prefer-lowest'
                    - php: '8.4'
                      stable: false
                      coverage: false
                      composer-flags: '--ignore-platform-req=php'

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

            - uses: shivammathur/setup-php@v2
              with:
                  php-version: ${{ matrix.php }}
                  extensions: curl, mbstring, yaml
                  coverage: pcov
                  tools: composer:v2

            - run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

            - run: composer update --no-progress ${{ matrix.composer-flags }}

            - run: vendor/bin/phpunit --no-coverage
              if: ${{ !matrix.coverage }}

            - run: vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
              if: ${{ matrix.coverage }}

            - run: php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover
              if: ${{ matrix.coverage }}
              continue-on-error: true

    phpstan:
        name: PHPStan
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v4

            - uses: shivammathur/setup-php@v2
              with:
                  php-version: 7.4
                  extensions: curl, mbstring, yaml
                  coverage: none
                  tools: composer:v2

            - run: composer update --no-progress

            - run: vendor/bin/phpstan analyse --no-progress

    psalm:
        name: Psalm
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v4

            - uses: shivammathur/setup-php@v2
              with:
                  php-version: 7.4
                  extensions: curl, mbstring, yaml
                  coverage: none
                  tools: composer:v2

            - run: composer update --no-progress

            - run: vendor/bin/psalm --no-progress --stats --threads=$(nproc) --output-format=github --shepherd

    docs-lint:
        permissions:
          contents: read  # for actions/checkout to fetch code
          statuses: write  # for github/super-linter/slim to mark status of each linter run
        name: Markdownlint
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v4

            - uses: github/super-linter/slim@v5.0.0
              env:
                  DEFAULT_BRANCH: main
                  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
                  LINTER_RULES_PATH: '.' # From https://github.com/github/super-linter/pull/859#issuecomment-709625090
                  VALIDATE_MARKDOWN: true
                  MARKDOWN_CONFIG_FILE: docs/.markdownlint.yml
                  FILTER_REGEX_INCLUDE: '/docs/.*'
