name: Tests

on:
  workflow_call:

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

jobs:
  tests:
    name: ${{ matrix.os }} API-${{ matrix.electronVersion }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-22.04, ubuntu-24.04, windows-2022, windows-2025, macos-14, macos-15-intel, macos-26]
        electronVersion: ['30.4.0', '38.2.2']
        include:
          - os: ubuntu-22.04
            rid: linux-x64
          - os: ubuntu-24.04
            rid: linux-x64
          - os: windows-2022
            rid: win-x64
          - os: windows-2025
            rid: win-x64
          - os: macos-14
            rid: osx-arm64
          - os: macos-15-intel
            rid: osx-x64
          - os: macos-26
            rid: osx-arm64

    env:
      DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
      DOTNET_NOLOGO: 1
      CI: true
      ELECTRON_ENABLE_LOGGING: 1

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Random delay (0-20 seconds)
        shell: bash
        run: |
          DELAY=$((RANDOM % 21))
          echo "Waiting for $DELAY seconds..."
          sleep $DELAY

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.0.x'

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: Restore
        run: dotnet restore -r ${{ matrix.rid }} -p:RuntimeIdentifier=${{ matrix.rid }} -p:ElectronVersion=${{ matrix.electronVersion }} src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj

      - name: Build
        run: dotnet build --no-restore -c Release -r ${{ matrix.rid }} -p:RuntimeIdentifier=${{ matrix.rid }} -p:ElectronVersion=${{ matrix.electronVersion }} src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj

      - name: Install Linux GUI dependencies
        if: runner.os == 'Linux'
        run: |
          set -e
          sudo apt-get update
          . /etc/os-release
          if [ "$VERSION_ID" = "24.04" ]; then ALSA_PKG=libasound2t64; else ALSA_PKG=libasound2; fi
          echo "Using ALSA package: $ALSA_PKG"
          sudo apt-get install -y xvfb \
            libgtk-3-0 libnss3 libgdk-pixbuf-2.0-0 libdrm2 libgbm1 libxss1 libxtst6 libatk-bridge2.0-0 libatk1.0-0 libatspi2.0-0 libx11-xcb1 "$ALSA_PKG"

      - name: Run tests (Linux)
        if: runner.os == 'Linux'
        continue-on-error: true
        run: |
          mkdir -p test-results
          xvfb-run -a dotnet test src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj \
            -c Release --no-build -r ${{ matrix.rid }} -p:RuntimeIdentifier=${{ matrix.rid }} -p:ElectronVersion=${{ matrix.electronVersion }} \
            --logger "trx;LogFileName=${{ matrix.os }}-electron-${{ matrix.electronVersion }}.trx" \
            --logger "console;verbosity=detailed" \
            --results-directory test-results

      - name: Run tests (Windows)
        if: runner.os == 'Windows'
        continue-on-error: true
        run: |
          New-Item -ItemType Directory -Force -Path test-results | Out-Null
          dotnet test src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj -c Release --no-build -r ${{ matrix.rid }} -p:RuntimeIdentifier=${{ matrix.rid }} -p:ElectronVersion=${{ matrix.electronVersion }} --logger "trx;LogFileName=${{ matrix.os }}-electron-${{ matrix.electronVersion }}.trx" --logger "console;verbosity=detailed" --results-directory test-results

      - name: Run tests (macOS)
        if: runner.os == 'macOS'
        continue-on-error: true
        run: |
          mkdir -p test-results
          dotnet test src/ElectronNET.IntegrationTests/ElectronNET.IntegrationTests.csproj -c Release --no-build -r ${{ matrix.rid }} -p:RuntimeIdentifier=${{ matrix.rid }} -p:ElectronVersion=${{ matrix.electronVersion }} --logger "trx;LogFileName=${{ matrix.os }}-electron-${{ matrix.electronVersion }}.trx" --logger "console;verbosity=detailed" --results-directory test-results

      - name: Upload raw test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results-${{ matrix.os }}-electron-${{ matrix.electronVersion }}
          path: test-results/*.trx
          retention-days: 7

  summary:
    name: Test Results
    runs-on: ubuntu-24.04
    if: always()
    needs: [tests]

    permissions:
      actions: read
      contents: read
      checks: write
      pull-requests: write

    steps:
      - name: Download all test results
        uses: actions/download-artifact@v4
        with:
          path: test-results

      - name: Setup .NET (for CTRF conversion)
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '10.0.x'

      - name: Install CTRF TRX→CTRF converter (dotnet tool)
        run: |
          dotnet new tool-manifest
          dotnet tool install DotnetCtrfJsonReporter --local

      - name: Convert TRX → CTRF and clean names (filePath=OS|Electron X.Y.Z)
        shell: bash
        run: |
          set -euo pipefail
          mkdir -p ctrf
          shopt -s globstar nullglob
          conv=0
          for trx in test-results/**/*.trx; do
            base="$(basename "$trx" .trx)"  # e.g. ubuntu-22.04-electron-30.4.0
            os="${base%%-electron-*}"
            electron="${base#*-electron-}"
            label="$os|Electron $electron"
            outdir="ctrf/${label}"
            mkdir -p "$outdir"
            out="${outdir}/ctrf-report.json"

            dotnet tool run DotnetCtrfJsonReporter -p "$trx" -d "$outdir" -f "ctrf-report.json"

            jq --arg fp "$label" '.results.tests |= map(.filePath = $fp)' "$out" > "${out}.tmp" && mv "${out}.tmp" "$out"

            echo "Converted & normalized $trx -> $out"
            conv=$((conv+1))
          done
          echo "Processed $conv TRX file(s)"

      - name: Publish Test Report
        if: always()
        uses: ctrf-io/github-test-reporter@v1
        with:
          report-path: 'ctrf/**/*.json'
          summary: true
          pull-request: false
          status-check: false
          status-check-name: 'Integration Tests'
          use-suite-name: true
          update-comment: true
          always-group-by: true
          overwrite-comment: true
          exit-on-fail: true
          group-by: 'suite'
          upload-artifact: true
          fetch-previous-results: true
          summary-report: false
          summary-delta-report: true
          github-report: true
          test-report: false
          test-list-report: false
          failed-report: true
          failed-folded-report: false
          skipped-report: true
          suite-folded-report: true
          suite-list-report: false
          file-report: true
          previous-results-report: true
          insights-report: true
          flaky-report: true
          flaky-rate-report: true
          fail-rate-report: false
          slowest-report: false
          report-order: 'summary-delta-report,failed-report,skipped-report,suite-folded-report,file-report,previous-results-report,github-report'
        env:
          GITHUB_TOKEN: ${{ github.token }}

      - name: Save PR Number
        if: github.event_name == 'pull_request'
        run: echo "PR_NUMBER=${{ github.event.pull_request.number }}" >> $GITHUB_ENV

      - name: Write PR Number to File
        if: github.event_name == 'pull_request'
        run: echo "$PR_NUMBER" > pr_number.txt
        shell: bash

      - name: Upload PR Number Artifact
        if: github.event_name == 'pull_request'
        uses: actions/upload-artifact@v4
        with:
          name: pr_number
          path: pr_number.txt

      - name: Summary
        run: echo "All matrix test jobs completed."
