name: ci

on:
  push:
    branches:
      - master
  pull_request:

env:
  CARGO_TERM_COLOR: always

jobs:
  test:
    name: Build and run tests
    runs-on: ubuntu-latest
    strategy:
      matrix:
        toolchain:
          - "1.56"
          - stable
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v3
      - name: "Setup toolchain"
        run: |
          rustup update ${{ matrix.toolchain }}
          rustup default ${{ matrix.toolchain }}
      - name: "Build"
        run: |
          make all
          cargo build --workspace --no-default-features
      - name: "Run tests"
        env:
            RUSTDOCFLAGS: -D warnings
        run: |
          make check
  test_html:
    name: Build and run HTML tests
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v3
      - name: "Setup toolchain"
        run: |
          rustup update 1.56
          rustup default 1.56
      - name: "Run HTML unit tests"
        run: make test_html_ut
      - name: "Setup node"
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: "Compare HTML with reference implementation"
        run: make test_html_ref
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3
      - name: "Setup toolchain"
        run: |
          rustup update 1.56
          rustup default 1.56
          rustup component add rustfmt
          rustup component add clippy
      - name: "Check linting"
        run: make lint
  fuzz:
    name: Fuzz
    strategy:
      matrix:
        target:
          - parse
          - html
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout"
        uses: actions/checkout@v3
      - name: "Setup toolchain"
        run: |
          rustup update nightly
          rustup default nightly
          cargo install cargo-afl
      - name: "Fuzz"
        run: |
          echo core | sudo tee /proc/sys/kernel/core_pattern
          AFL_TARGET=${{ matrix.target }} make afl_quick
  bench:
    name: Benchmark
    runs-on: ubuntu-latest
    steps:
      - name: "Checkout repo"
        uses: actions/checkout@v3
      - name: "Setup toolchain"
        run: |
          rustup update stable
          rustup default stable
          sudo apt-get install valgrind
      - name: "Fetch benchmark inputs"
        run: make bench
      - name: "Benchmark"
        run: |
          cargo bench -p bench-crit all > crit
          cargo bench -p bench-iai > iai
      - name: "Artifact results"
        uses: actions/upload-artifact@v3
        with:
          name: benchmark
          path: |
            crit
            iai
