name: elisp tests

on:
  pull_request:
  push:
    branches:
      - master
      - develop

env:
  TEST_SCRIPT: ./.github/workflows/scripts/test
  TESTELPA_REPO: JAremko/testelpa-develop
  GITHUB_WORKSPACE: ${{ github.workspace }}
  CORE_TR: core
  BASE_TR: layers/+distribution/spacemacs-base
  LAYER_TR: layers/+distribution/spacemacs

defaults:
  run:
    shell: bash

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

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        emacs_version: [27.2, 28.1]
    steps:
# Installing Emacs on Unix
    - name: Install Emacs on UNIX
      continue-on-error: true
      id: unix-install-1
      uses: purcell/setup-emacs@master
      with:
        version: ${{ matrix.emacs_version }}
      if: ${{ matrix.os != 'windows-latest' }}

    - name: Install Emacs on UNIX [retry 1]
      continue-on-error: true
      id: unix-install-2
      uses: purcell/setup-emacs@master
      with:
        version: ${{ matrix.emacs_version }}
      if: ${{ matrix.os != 'windows-latest' && steps.unix-install-1.outcome == 'failure' }}

    - name: Install Emacs on UNIX [retry 2]
      continue-on-error: false
      id: unix-install-3
      uses: purcell/setup-emacs@master
      with:
        version: ${{ matrix.emacs_version }}
      if: ${{ matrix.os != 'windows-latest' && steps.unix-install-2.outcome == 'failure' }}

# Installing Emacs on Windows
    - name: Install Emacs on Windows
      continue-on-error: true
      id: windows-install-1
      uses: jcs090218/setup-emacs-windows@master
      with:
        version: ${{ matrix.emacs_version }}
      if: ${{ matrix.os == 'windows-latest' }}

    - name: Install Emacs on Windows [retry 1]
      continue-on-error: true
      id: windows-install-2
      uses: jcs090218/setup-emacs-windows@master
      with:
        version: ${{ matrix.emacs_version }}
      if: ${{ matrix.os == 'windows-latest' && steps.windows-install-1.outcome == 'failure' }}

    - name: Install Emacs on Windows [retry 2]
      continue-on-error: false
      id: windows-install-3
      uses: jcs090218/setup-emacs-windows@master
      with:
        version: ${{ matrix.emacs_version }}
      if: ${{ matrix.os == 'windows-latest' && steps.windows-install-2.outcome == 'failure' }}
# ---------------------------

    - uses: actions/checkout@v2

    - name: Fetch Spacemacs elpa mirror
      run: |
        curl -L \
        https://github.com/$TESTELPA_REPO/releases/latest/download/elpa.zip \
        --output /tmp/elpa.zip

    - name: Unpack elpa mirror
      run: unzip /tmp/elpa.zip -d ../testelpa_mirror

    - name: Dependencies installation for core tests
      run: ${{ env.TEST_SCRIPT }} ${{ env.CORE_TR }} installation
    - name: Core unit testing
      run: ${{ env.TEST_SCRIPT }} ${{ env.CORE_TR }} unit_tests
    - name: Core functional testing
      run: ${{ env.TEST_SCRIPT }} ${{ env.CORE_TR }} func_tests

    - name: Dependencies installation for Base tests
      run: ${{ env.TEST_SCRIPT }} ${{ env.BASE_TR }} installation
    - name: Base unit testing
      run: ${{ env.TEST_SCRIPT }} ${{ env.BASE_TR }} unit_tests
    - name: Base functional testing
      run: ${{ env.TEST_SCRIPT }} ${{ env.BASE_TR }} func_tests

    - name: Dependencies installation for Layers tests
      run: ${{ env.TEST_SCRIPT }} ${{ env.LAYER_TR }} installation
    - name: Layers unit testing
      run: ${{ env.TEST_SCRIPT }} ${{ env.LAYER_TR }} unit_tests
    - name: Layers functional testing
      run: ${{ env.TEST_SCRIPT }} ${{ env.LAYER_TR }} func_tests
