# GitHub Actions Documentation: https://docs.github.com/en/actions

name: "build"

on: ["pull_request", "push"]

env:
  COMPOSER_ROOT_VERSION: "1.99.99"

jobs:
  coding-standards:
    name: "Coding standards"
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v2"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "latest"
          coverage: "none"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v1"

      - name: "Check syntax (php-parallel-lint)"
        run: "composer lint -- --colors"

      - name: "Check coding standards (PHP_CodeSniffer)"
        run: "./vendor/bin/phpcs --colors"

  static-analysis:
    name: "Static analysis"
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v2"

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "latest"
          coverage: "none"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v1"

      - name: "Statically analyze code (PHPStan)"
        run: "composer phpstan -- --ansi"

      - name: "Statically analyze code (Psalm)"
        run: "composer psalm -- --shepherd"

  benchmark:
    name: "Benchmark"
    runs-on: "ubuntu-latest"

    strategy:
      fail-fast: false
      matrix:
        php-version:
          - "7.2"
          - "7.3"
          - "7.4"
          - "8.0"
        include:
          - php-version: "8.1"
            composer-options: "--ignore-platform-req=php"

    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v2"

      - name: "Install dependencies (apt)"
        run: |
          sudo apt-get update
          sudo apt-get -y install libsodium-dev uuid-dev

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-version }}"
          extensions: bcmath, ctype, gmp, sodium, uuid
          coverage: "none"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v1"

      - name: "Run PHPBench"
        run: "composer phpbench -- --ansi"

  code-coverage:
    name: "Code coverage"
    runs-on: "ubuntu-latest"
    steps:
      - name: "Checkout repository"
        uses: "actions/checkout@v2"

      - name: "Install dependencies (apt)"
        run: |
          sudo apt-get update
          sudo apt-get -y install libsodium-dev uuid-dev

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "latest"
          extensions: bcmath, ctype, gmp, sodium, uuid
          coverage: "pcov"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v1"
        with:
          dependency-versions: "${{ matrix.dependencies }}"

      - name: "Run unit tests (PHPUnit)"
        run: "./vendor/bin/phpunit --verbose --colors=always --coverage-text --coverage-clover build/logs/clover.xml"

      - name: "Publish coverage report to Codecov"
        uses: "codecov/codecov-action@v1"

  unit-tests:
    name: "Unit Tests"
    runs-on: ${{ matrix.operating-system }}

    strategy:
      fail-fast: false
      matrix:
        php-version:
          - "7.2"
          - "7.3"
          - "7.4"
          - "8.0"
        operating-system:
          - "ubuntu-latest"
          - "windows-latest"
        include:
          - php-version: "8.1"
            operating-system: "ubuntu-latest"
            composer-options: "--ignore-platform-req=php"

    steps:
      - name: "Configure Git (for Windows)"
        if: ${{ matrix.operating-system == 'windows-latest' }}
        run: |
          git config --system core.autocrlf false
          git config --system core.eol lf

      - name: "Checkout repository"
        uses: "actions/checkout@v2"

      - name: "Install dependencies (apt)"
        if: ${{ matrix.operating-system == 'ubuntu-latest' }}
        run: |
          sudo apt-get update
          sudo apt-get -y install libsodium-dev uuid-dev

      - name: "Install PHP"
        uses: "shivammathur/setup-php@v2"
        with:
          php-version: "${{ matrix.php-version }}"
          extensions: bcmath, ctype, gmp, sodium, uuid
          coverage: "none"
          ini-values: "memory_limit=-1"

      - name: "Install dependencies (Composer)"
        uses: "ramsey/composer-install@v1"
        with:
          composer-options: "${{ matrix.composer-options }}"

      - name: "Run unit tests (PHPUnit)"
        run: "./vendor/bin/phpunit --verbose --colors=always --no-coverage"
