name: ci

on:
  push:
    branches:
      - "main"
  pull_request:
    branches:
      - "main"

env:
  PREMAKE_VERSION: "5.0.0-beta2"

jobs:
  build-test-linux:
    env:
      PREMAKE_CONFIG: gmake2
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Install multilib
        run: |
          sudo apt-get update
          sudo apt-get install gcc-multilib g++-multilib

      - name: Setup premake
        uses: abel0b/setup-premake@v2.3
        with:
          version: ${{ env.PREMAKE_VERSION }}

      - name: Premake generate
        working-directory: ${{ github.workspace }}
        run: premake5 ${{ env.PREMAKE_CONFIG }}

      - name: Build
        working-directory: ${{ github.workspace }}
        run: make -C build -j$(nproc) config=release_x86 all

      - name: Test
        working-directory: ${{ github.workspace }}/build/lib/Release_x86/tests
        run: |
          ./ObjCommonTests
          ./ObjLoadingTests
          ./ParserTests
          ./ZoneCodeGeneratorLibTests
          ./ZoneCommonTests

  build-test-windows:
    env:
      PREMAKE_CONFIG: vs2022
    runs-on: windows-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Add MSBuild to PATH
        uses: microsoft/setup-msbuild@v2.0.0

      - name: Setup premake
        uses: abel0b/setup-premake@v2.3
        with:
          version: ${{ env.PREMAKE_VERSION }}

      - name: Premake generate
        working-directory: ${{ github.workspace }}
        run: premake5 ${{ env.PREMAKE_CONFIG }}

      - name: Build
        working-directory: ${{ github.workspace }}
        run: msbuild /m /p:Configuration=Release /p:Platform=Win32 build

      - name: Test
        working-directory: ${{ github.workspace }}/build/lib/Release_x86/tests
        run: |
          $combinedExitCode = 0
          ./ObjCommonTests
          $combinedExitCode = [System.Math]::max($combinedExitCode, $LASTEXITCODE)
          ./ObjLoadingTests
          $combinedExitCode = [System.Math]::max($combinedExitCode, $LASTEXITCODE)
          ./ParserTests
          $combinedExitCode = [System.Math]::max($combinedExitCode, $LASTEXITCODE)
          ./ZoneCodeGeneratorLibTests
          $combinedExitCode = [System.Math]::max($combinedExitCode, $LASTEXITCODE)
          ./ZoneCommonTests
          $combinedExitCode = [System.Math]::max($combinedExitCode, $LASTEXITCODE)
          exit $combinedExitCode