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
    container: ubuntu:24.04
    steps:
      - name: Install g++ and multilib
        run: |
          apt-get update
          apt-get install -y git make gcc-13 g++-13 gcc-13-multilib g++-13-multilib
          update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
          update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
          update-alternatives --set gcc /usr/bin/gcc-13
          update-alternatives --set g++ /usr/bin/g++-13

      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: Setup premake
        uses: abel0b/setup-premake@v2.4
        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.4
        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