name: nalgebra CI build

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  CARGO_TERM_COLOR: always

jobs:
  check-fmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Check formatting
        run: cargo fmt -- --check
  clippy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install clippy
        run: rustup component add clippy
      - name: Run clippy
        run: cargo clippy
  build-nalgebra:
    runs-on: ubuntu-latest
    #    env:
    #      RUSTFLAGS: -D warnings
    steps:
      - uses: actions/checkout@v4
      - name: Build --no-default-feature
        run: cargo build --no-default-features;
      - name: Build (default features)
        run: cargo build;
      - name: Build --features serde-serialize
        run: cargo build --features serde-serialize
      - name: Check nalgebra-lapack
        run: cd nalgebra-lapack; cargo check --features serde-serialize;
      - name: Build nalgebra-sparse --no-default-features
        run: cd nalgebra-sparse; cargo build --no-default-features;
      - name: Build nalgebra-sparse (default features)
        run: cd nalgebra-sparse; cargo build;
      - name: Build nalgebra-sparse --all-features
        run: cd nalgebra-sparse; cargo build --all-features;
  # Run this on it’s own job because it alone takes a lot of time.
  # So it’s best to let it run in parallel to the other jobs.
  build-nalgebra-all-features:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: cargo build --all-features;
      - run: cargo build -p nalgebra-glm --all-features;
  check-nalgebra-msrv:
    runs-on: ubuntu-latest
    env:
      RUSTFLAGS: -D warnings
    steps:
      - name: Select rustc  version
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.87.0
          override: true
      - uses: actions/checkout@v4
      - name: check
        run: cargo check --all-targets --features arbitrary,rand,serde-serialize,sparse,debug,io,compare,libm,proptest-support,slow-tests,rkyv-safe-deser,rayon;
  test-nalgebra:
    runs-on: ubuntu-latest
    #    env:
    #      RUSTFLAGS: -D warnings
    steps:
      # Tests are run with a specific version of the compiler to avoid
      # trybuild errors when a new compiler version is out. This can be
      # bumped as needed after running the tests with TRYBUILD=overwrite
      # to re-generate the error reference.
      - name: Select rustc  version
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.87.0
          override: true
      - uses: actions/checkout@v4
      - name: test
        run: cargo test --features arbitrary,rand,serde-serialize,sparse,debug,io,compare,libm,proptest-support,slow-tests,rkyv-safe-deser,rayon;
  test-nalgebra-glm:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: test nalgebra-glm
        run: cargo test -p nalgebra-glm --features arbitrary,serde-serialize;
  test-nalgebra-sparse:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: test nalgebra-sparse
        # Manifest-path is necessary because cargo otherwise won't correctly forward features
        # We increase number of proptest cases to hopefully catch more potential bugs
        run: PROPTEST_CASES=10000 cargo test --manifest-path=nalgebra-sparse/Cargo.toml --features compare,proptest-support,io,serde-serialize
      - name: test nalgebra-sparse (slow tests)
        # Unfortunately, the "slow-tests" take so much time that we need to run them with --release
        run: PROPTEST_CASES=10000 cargo test --release --manifest-path=nalgebra-sparse/Cargo.toml --features compare,proptest-support,io,serde-serialize,slow-tests slow
  test-nalgebra-macros:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: test nalgebra-macros
        run: cargo test -p nalgebra-macros
  test-nalgebra-lapack:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: test nalgebra-lapack
        run: cargo test -p nalgebra-lapack --features proptest-support;
  build-wasm:
    runs-on: ubuntu-latest
    #    env:
    #      RUSTFLAGS: -D warnings
    steps:
      - uses: actions/checkout@v4
      - run: rustup target add wasm32-unknown-unknown
      - name: build nalgebra
        run: cargo build --verbose --target wasm32-unknown-unknown;
      - name: build nalgebra-glm
        run: cargo build -p nalgebra-glm --verbose --target wasm32-unknown-unknown;
  build-no-std:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install latest stable
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          targets: "x86_64-unknown-none,thumbv7em-none-eabihf"
      - name: build x86_64-unknown-none
        run: cargo build --verbose --no-default-features --target=x86_64-unknown-none
      - name: build x86_64-unknown-none --features rand-no-std
        run: cargo build --verbose --no-default-features --features rand-no-std --target=x86_64-unknown-none
      - name: build x86_64-unknown-none --features alloc
        run: cargo build --verbose --no-default-features --features alloc --target=x86_64-unknown-none
      - name: build thumbv7em-none-eabihf
        run: cargo build --verbose --no-default-features --target=thumbv7em-none-eabihf
      - name: build x86_64-unknown-none nalgebra-glm
        run: cargo build --verbose --no-default-features -p nalgebra-glm --target=x86_64-unknown-none
      - name: build thumbv7em-none-eabihf nalgebra-glm
        run: cargo build --verbose --no-default-features -p nalgebra-glm --target=thumbv7em-none-eabihf
  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Generate documentation
        run: cargo doc
