name: C++/CUDA

on:
  pull_request:
    branches:
      - main
      - V2
  push:
    branches:
      - main
      - V2

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  check-changed-files:
    uses: ./.github/workflows/check-changed-files.yml

  check-format:
    name: Check Code Format
    runs-on: ubuntu-22.04
    needs: check-changed-files
    steps:
    - name: Checkout
      uses: actions/checkout@v4
    - name: Check clang-format
      if: needs.check-changed-files.outputs.cpp_cuda == 'true'
      run: if [[ $(find ./ \( -path ./icicle/build -prune -o -path ./**/target -prune -o -path ./examples -prune \) -iname *.h -or -iname *.cuh -or -iname *.cu -or -iname *.c -or -iname *.cpp | xargs clang-format --dry-run -ferror-limit=1 -style=file 2>&1) ]]; then echo "Please run clang-format"; exit 1; fi

  test-linux-curve:
    name: Test on Linux
    runs-on: [self-hosted, Linux, X64, icicle]
    needs: [check-changed-files, check-format]
    strategy:
      matrix:
        curve:
          - name: bn254
            build_args: -DG2=ON -DECNTT=ON
          - name: bls12_381
            build_args: -DG2=ON -DECNTT=ON
          - name: bls12_377
            build_args: -DG2=ON -DECNTT=ON
          - name: bw6_761
            build_args: -DG2=ON -DECNTT=ON
          - name: grumpkin
            build_args:

    steps:
    - name: Checkout Repo
      uses: actions/checkout@v4
    - name: Build curve
      working-directory: ./icicle
      if: needs.check-changed-files.outputs.cpp_cuda == 'true'
      run: |
        mkdir -p build && rm -rf build/*
        cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DCURVE=${{ matrix.curve.name }} ${{ matrix.curve.build_args }} -S . -B build
        cmake --build build -j
    - name: Run C++ curve Tests
      working-directory: ./icicle/build/tests
      if: needs.check-changed-files.outputs.cpp_cuda == 'true'
      run: ctest

  test-linux-field:
    name: Test on Linux
    runs-on: [self-hosted, Linux, X64, icicle]
    needs: [check-changed-files, check-format]
    strategy:
      matrix:
        field: 
          - name: babybear
            build_args: -DEXT_FIELD=ON
          - name: stark252
            build_args: -DEXT_FIELD=OFF
    steps:
    - name: Checkout Repo
      uses: actions/checkout@v4
    - name: Build field
      working-directory: ./icicle
      if: needs.check-changed-files.outputs.cpp_cuda == 'true'
      run: |
        mkdir -p build && rm -rf build/*
        cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DFIELD=${{ matrix.field.name }} ${{ matrix.field.build_args }} -S . -B build
        cmake --build build -j
    - name: Run C++ field Tests
      working-directory: ./icicle/build/tests
      if: needs.check-changed-files.outputs.cpp_cuda == 'true'
      run: ctest