name: CI Build Tests

on:
  push:
  pull_request:
  release:
    types: [published]
  schedule:
    - cron: '30 3 * * 0'

jobs:
  cpp_build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            CC: gcc-11
            CXX: g++-11
            CMAKE_CMD: cmake ..
            NAME: gcc-11

          - os: ubuntu-latest
            CC: gcc-12
            CXX: g++-12
            CMAKE_CMD: cmake ..
            NAME: gcc-12

          - os: ubuntu-latest
            CC: clang-14
            CXX: clang++-14
            CMAKE_CMD: cmake ..
            NAME: clang-14

          - os: ubuntu-latest
            CC: clang-15
            CXX: clang++-15
            CMAKE_CMD: cmake ..
            NAME: clang-15

          - os: macos-latest
            CC: /opt/homebrew/opt/llvm/bin/clang
            CXX: /opt/homebrew/opt/llvm/bin/clang++
            CMAKE_CMD: cmake ..
            NAME: clang

          - os: macos-latest
            CMAKE_CMD: cmake ..
            NAME: AppleClang

          - os: windows-latest
            CMAKE_CMD: cmake ..
            NAME: msvc

          - os: windows-latest
            CMAKE_CMD: cmake .. -G "Unix Makefiles"
            NAME: mingw-gcc

    name: ${{ matrix.os }}-${{ matrix.NAME }} - C++ Test
    env:
      MSBUILD_PATH: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/MSBuild/Current/Bin"
    steps:
      - uses: actions/checkout@v1
      - name: Checkout Submodules
        run: |
          git submodule update --init --recursive
      - name: Create Build Directory
        run: mkdir build

      - name: Install Dependencies (Linux)
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt update
          sudo apt install -y ccache ${{ matrix.CC }}
          if [[ "${{ matrix.CXX }}" != *"clang"* ]]; then sudo apt install -y ${{ matrix.CXX }}; fi
      - name: Install Dependencies (OSX)
        if: matrix.os == 'macos-latest' && matrix.name != 'AppleClang'
        run: |
          brew cask uninstall --force oclint || true
          brew install llvm || brew upgrade llvm
          brew install ccache || brew upgrade ccache
      - name: Install Dependencies (Windows)
        if: matrix.os == 'windows-latest'
        run: |
          choco install ccache --accept-license

      - name: Retrieve ccache
        uses: actions/cache@v3
        with:
          path: .ccache
          key: ccache-${{ matrix.os }}-${{ matrix.NAME }}

      - name: Execute CMake Process
        env:
          CC: ${{ matrix.CC }}
          CXX: ${{ matrix.CXX }}
          CCACHE_DIR: $GITHUB_WORKSPACE/.ccache
        run: |
          cd build
          ${{ matrix.CMAKE_CMD }} -DBUILD_TEST=1
      - name: Build Project
        env:
          CCACHE_DIR: $GITHUB_WORKSPACE/.ccache
        run: |
          cd build
          cmake --build . -j2

      - name: Test Cryptography (Linux & OSX)
        if: matrix.os != 'windows-latest' || matrix.name == 'mingw-gcc'
        run: |
          cd build
          ./cryptotest
      - name: Test Cryptography (Windows)
        if: matrix.os == 'windows-latest' && matrix.name == 'msvc'
        run: |
          cd build/Debug
          ./cryptotest.exe

      - name: Test SLIP-0010 (Linux & OSX)
        if: matrix.os != 'windows-latest' || matrix.name == 'mingw-gcc'
        run: |
          cd build
          ./test_slip10
      - name: Test SLIP-0010 (Windows)
        if: matrix.os == 'windows-latest' && matrix.name == 'msvc'
        run: |
          cd build/Debug
          ./test_slip10.exe
