name: Continuous Integration

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

jobs:
  makefile-build:
    name: Makefile build and test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
            build-essential \
            bison \
            flex \
            zlib1g-dev \
            octave \
            octave-dev

      - name: Build
        run: make bin

      - name: Run tests
        run: make test

  cmake-build:
    name: CMake build and test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
            build-essential \
            cmake \
            bison \
            flex \
            zlib1g-dev

      - name: Configure CMake
        run: cmake -S . -B build -DBUILD_TESTING=ON

      - name: Build
        run: cmake --build build --target mwrap

      - name: Run tests
        run: cmake --build build --target mwrap_tests

  matlab-examples:
    name: Build and test MATLAB examples
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
            build-essential \
            cmake \
            bison \
            flex \
            zlib1g-dev

      - name: Set up MATLAB
        uses: matlab-actions/setup-matlab@v2

      - name: Configure with CMake
        run: |
          cmake -S . -B build-matlab \
            -DMWRAP_BUILD_EXAMPLES=ON \
            -DMWRAP_COMPILE_MEX=ON \
            -DBUILD_TESTING=ON

      - name: Build examples and tests
        run: |
          cmake --build build-matlab --target mwrap_examples
          cmake --build build-matlab --target mwrap_testing_mex

      - name: Run MATLAB tests
        uses: matlab-actions/run-command@v2
        with:
          command: addpath('testing'); run_matlab_tests('build-matlab', '.')

  octave-examples:
    name: Build and test Octave examples
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
            build-essential \
            cmake \
            bison \
            flex \
            zlib1g-dev \
            octave \
            octave-dev

      - name: Configure examples with CMake
        run: |
          cmake -S . -B build-octave \
            -DMWRAP_BUILD_EXAMPLES=ON \
            -DMWRAP_COMPILE_MEX=ON \
            -DMWRAP_MEX_BACKEND=OCTAVE \
            -DBUILD_TESTING=ON

      - name: Build Octave examples
        run: cmake --build build-octave --target mwrap_examples

      - name: Run Octave example tests
        run: ctest --test-dir build-octave --output-on-failure -R '^octave-'

  python-tests:
    name: Python mwrap tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends \
            build-essential \
            cmake \
            bison \
            flex \
            zlib1g-dev

      - name: Build C++ mwrap
        run: |
          cmake -S . -B build
          cmake --build build --target mwrap

      - name: Run Python tests
        run: bash testing/test_python.sh build/src/mwrap python/mwrap
