name: CI

on: [pull_request]

jobs:
  linter:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions-rs/toolchain@v1
        with:
            toolchain: 1.75.0
            components: rustfmt, clippy
            override: true
      - name: rustfmt
        run: cargo fmt -- --check
      - name: clippy
        run: cargo clippy --all-features --all-targets -- -D warnings

  unit_tests:
    needs: linter
    strategy:
      matrix:
        toolchain:
          - 1.63
          - nightly
        os:
          - ubuntu-latest
          - macOS-latest
          - windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2
      - name: Install Rust ${{ matrix.toolchain }} toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          override: true
          profile: minimal
      - name: Test on Rust ${{ matrix.toolchain }} (only Windows)
        if: matrix.os == 'windows-latest'
        run: cargo test --verbose --no-default-features
      - name: Test on Rust ${{ matrix.toolchain }} (non Windows)
        if: matrix.os != 'windows-latest'
        run: cargo test --verbose --color always -- --nocapture

  linter_gui:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions-rs/toolchain@v1
        with:
            toolchain: 1.75.0
            components: rustfmt, clippy
            override: true
      - name: rustfmt
        run: cd gui && cargo fmt -- --check
      - name: clippy
        run: |
          sudo apt-get update &&
          sudo apt-get install --allow-downgrades libudev-dev pkg-config libvulkan-dev &&
          cd gui &&
          cargo clippy --all-features --all-targets -- -D warnings

  unit_tests_gui:
    needs: linter_gui
    strategy:
      matrix:
        toolchain:
          - 1.65.0
          - nightly
        os:
          - ubuntu-latest
          - macOS-latest
          - windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout source code
        uses: actions/checkout@v2
      - name: Install Rust ${{ matrix.toolchain }} toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.toolchain }}
          override: true
          profile: minimal
      - name: Test on Rust ${{ matrix.toolchain }} (only Windows)
        if: matrix.os == 'windows-latest'
        run: cd gui && cargo test --verbose --no-default-features
      - name: Test on Rust ${{ matrix.toolchain }} (non Windows)
        if: matrix.os == 'macOS-latest'
        run: cd gui && cargo test --verbose --color always -- --nocapture
      - name: Test on Rust ${{ matrix.toolchain }} (non Windows)
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt-get update &&
          sudo apt-get install libudev-dev libfontconfig1-dev &&
          cd gui &&
          cargo test --verbose --color always -- --nocapture
