name: Tests

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

env:
  CARGO_TERM_COLOR: always

jobs:
  build:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}
          key: ${{ runner.os }}-cache-build-v${{ inputs.cache-version }}
      - name: Build release
        run: |
          sudo apt-get install -y pkg-config libssl-dev musl musl-dev musl-tools
          rustup target add x86_64-unknown-linux-musl
          cargo install --path=crates/aiken --target=x86_64-unknown-linux-musl
          mv $(which aiken) aiken
          ldd aiken
      - uses: actions/upload-artifact@v4
        with:
          name: aiken-${{ github.sha }}-${{ runner.arch }}-${{ runner.os }}
          path: ./aiken

  acceptance_tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}
          key: ${{ runner.os }}-cache-build-v${{ inputs.cache-version }}
      - name: Run examples
        run: |
          cargo run -r -- check examples/hello_world
          cargo run -r -- check examples/gift_card
      - name: Run acceptance tests
        working-directory: examples/acceptance_tests
        run: |
          cargo install cbor-diag-cli
          bash ci
        shell: bash

  unit_tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}
          key: ${{ runner.os }}-cache-tests-v${{ inputs.cache-version }}
      - name: Run unit tests
        run: cargo test --verbose --workspace

  benchmarks:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}
          key: ${{ runner.os }}-cache-build-v${{ inputs.cache-version }}
      - name: Run benchmarks
        run: |
          cargo run -r -- check benchmarks

  checks:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: Swatinem/rust-cache@v2
        with:
          save-if: ${{ github.ref == 'refs/heads/main' }}
          key: ${{ runner.os }}-cache-unit-v${{ inputs.cache-version }}
      - name: Format
        run: cargo fmt --all -- --check
      - name: Clippy
        run: cargo clippy --all-targets --all-features -- -D warnings
