name: Cross-platform tests on: pull_request: push: branches: [master] permissions: contents: read jobs: unit-tests: name: Unit tests (${{ matrix.project }}) runs-on: ubuntu-latest timeout-minutes: 30 strategy: fail-fast: false max-parallel: 4 matrix: project: - OpenNest.Tests - OpenNest.Engine.Tests - OpenNest.IO.Tests - OpenNest.Server.Tests steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: persist-credentials: false - uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4 with: dotnet-version: '8.0.x' - name: Run ${{ matrix.project }} run: dotnet test "${{ matrix.project }}/${{ matrix.project }}.csproj" synthetic-nests: name: Six synthetic Irregular nests runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: persist-credentials: false - uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4 with: dotnet-version: '8.0.x' - name: Test fail-closed final CI check run: python3 scripts/test_ci_results.py -v - name: Check six synthetic Irregular nests timeout-minutes: 6 run: | python3 scripts/test_check_synthetic_nests.py -v python3 scripts/check-synthetic-nests.py --parallel 2 # Preserve the existing check name for required-status consumers. tests: name: tests needs: [unit-tests, synthetic-nests] if: ${{ always() }} runs-on: ubuntu-latest timeout-minutes: 5 steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: persist-credentials: false - name: Require every test job to succeed env: UNIT_TEST_RESULT: ${{ needs.unit-tests.result }} SYNTHETIC_RESULT: ${{ needs.synthetic-nests.result }} run: bash scripts/check-ci-results.sh "$UNIT_TEST_RESULT" "$SYNTHETIC_RESULT" windows-desktop: # WinForms tests need a Windows desktop runtime; the Linux job can only # cross-compile them. FrontEnd.Tests run here too, alongside the desktop. runs-on: windows-2022 timeout-minutes: 20 defaults: run: shell: pwsh env: DOTNET_CLI_TELEMETRY_OPTOUT: '1' DOTNET_NOLOGO: '1' steps: - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: persist-credentials: false - uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4 with: dotnet-version: '8.0.x' - name: Run Windows desktop and front-end tests # A test silent for 5 minutes is killed and named in the log, with a # mini dump in TestResults, instead of holding the runner until the # job timeout. run: | $failed = @() foreach ($project in @('OpenNest.WinForms.Tests', 'OpenNest.FrontEnd.Tests')) { dotnet test "$project/$project.csproj" -c Release --blame-hang-timeout 5m --blame-hang-dump-type mini --logger "trx;LogFileName=$project.trx" --results-directory TestResults if ($LASTEXITCODE -ne 0) { $failed += $project } } if ($failed.Count -gt 0) { throw "Failed: $($failed -join ', ')" } - name: Test acceptance evidence checker run: python scripts/test_windows_acceptance.py -v - name: Verify named Windows acceptance coverage if: always() run: python scripts/windows_acceptance.py --results TestResults - name: Upload test results if: always() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: windows-desktop-test-results path: TestResults/ if-no-files-found: warn retention-days: 14