name: Test

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  rustfmt:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
          components: rustfmt
      - uses: actions/checkout@v4
      - name: Check formatting
        run: cargo fmt --all -- --check

  clippy:
    needs: rustfmt
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
        # Latest stable and MSRV. We only run checks with all features enabled
        # for the MSRV build to keep CI fast, since other configurations should also work.
        rust_version: [stable, "1.71.0"]
    steps:
      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: ${{ matrix.rust_version }}
          components: clippy
      - uses: actions/checkout@v4

      - name: Run `cargo clippy` with no features
        if: ${{ matrix.rust_version == 'stable' }}
        run: cargo clippy --verbose --no-default-features -- -D warnings -D clippy::dbg_macro

      - name: Run `cargo clippy` with `image-data` feature
        if: ${{ matrix.rust_version == 'stable' }}
        run: cargo clippy --verbose --no-default-features --features image-data -- -D warnings -D clippy::dbg_macro

      - name: Run `cargo clippy` with `wayland-data-control` feature
        if: ${{ matrix.rust_version == 'stable' }}
        run: cargo clippy --verbose --no-default-features --features wayland-data-control -- -D warnings -D clippy::dbg_macro

      - name: Run `cargo clippy` with all features
        run: cargo clippy --verbose --all-features -- -D warnings -D clippy::dbg_macro

      - name: Run `cargo clippy` with dependency version checks
        if: ${{ matrix.rust_version == 'stable' }}
        run: |
          cargo update -p windows-sys
          cargo clippy --verbose --all-features -- -D warnings -D clippy::dbg_macro 

  test:
    needs: clippy
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        # No Linux test for now as it just fails due to not having a desktop environment.
        os: [macos-latest, windows-latest]
    steps:
      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
      - name: Checkout
        uses: actions/checkout@v4
      - name: Run tests with no features
        run: cargo test --no-default-features
      - name: Run tests with `image-data` feature
        run: cargo test --no-default-features --features image-data
      - name: Run tests with `wayland-data-control` feature
        run: cargo test --no-default-features --features wayland-data-control
      - name: Run tests with all features
        run: cargo test --all-features

  miri:
    needs: clippy
    env:
      MIRIFLAGS: -Zmiri-symbolic-alignment-check
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        # Currently, only Windows has soundness tests.
        os: [windows-latest]
    steps:
      - uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: nightly-2023-10-08
          components: miri

      - name: Checkout
        uses: actions/checkout@v4

      - name: Check soundness
        run: cargo miri test windows --features image-data

  semver:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - name: Check semver
      uses: obi1kenobi/cargo-semver-checks-action@v2
