name: .NET Tests
on:
  push:
    branches: [ "main" ]
    paths:
      - 'global.json'
      - '**.cs'
      - '**.axaml'
      - '**.csproj'
      - '**.props'
      - '**.targets'
      - '**.sln'
      - '**.slnx'
      - 'src/.editorconfig'
      - '.github/workflows/dotnet-test.yml'

  pull_request:
    branches: [ "main" ]
    paths:
      - 'global.json'
      - '**.cs'
      - '**.axaml'
      - '**.csproj'
      - '**.props'
      - '**.targets'
      - '**.sln'
      - '**.slnx'
      - 'src/.editorconfig'
      - '.github/workflows/dotnet-test.yml'

  workflow_dispatch:

jobs:
  test-codebase:
    runs-on: windows-latest
    env:
      NUGET_PACKAGES: ${{ github.workspace }}\.nuget\packages

    steps:
    - name: Checkout the repository
      uses: actions/checkout@v7
      with:
        fetch-depth: 0

    - name: Install .NET SDK
      uses: actions/setup-dotnet@v6
      with:
        global-json-file: global.json

    - name: Cache NuGet packages
      uses: actions/cache@v6
      with:
        path: ${{ env.NUGET_PACKAGES }}
        key: ${{ runner.os }}-nuget-${{ hashFiles('global.json', 'src/**/*.csproj', 'src/**/*.props', 'src/**/*.targets', 'src/**/*.sln', 'src/**/*.slnx') }}
        restore-keys: |
          ${{ runner.os }}-nuget-

    - name: Install dependencies
      working-directory: src
      run: dotnet restore UniGetUI.Windows.slnx

    - name: Check whitespace formatting
      run: dotnet format whitespace src --folder --verify-no-changes --verbosity minimal

    - name: Check code style formatting (Avalonia Windows solution)
      working-directory: src
      run: dotnet format style UniGetUI.Windows.slnx --no-restore --verify-no-changes --verbosity minimal

    - name: Build Avalonia Windows solution
      working-directory: src
      run: |
        dotnet build-server shutdown
        dotnet build UniGetUI.Windows.slnx --no-restore --verbosity minimal /p:Platform=x64 /p:UseSharedCompilation=false /m:1

    - name: Run Tests
      working-directory: src
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: dotnet test UniGetUI.Windows.slnx --no-restore --verbosity q --nologo /p:Platform=x64 /p:UseSharedCompilation=false /m:1

    - name: Report full-trim publish warnings
      working-directory: src
      shell: pwsh
      continue-on-error: true
      run: |
        dotnet build-server shutdown
        dotnet publish UniGetUI.Avalonia/UniGetUI.Avalonia.csproj `
          --no-restore `
          --configuration Release `
          --runtime win-x64 `
          --self-contained true `
          --output "${{ runner.temp }}\unigetui-full-trim-publish" `
          /p:Platform=x64 `
          /p:TrimMode=full `
          /p:TrimmerSingleWarn=false `
          /p:UseSharedCompilation=false `
          --verbosity minimal

    - name: Report NativeAOT publish warnings
      working-directory: src
      shell: pwsh
      run: |
        dotnet build-server shutdown
        dotnet restore UniGetUI.Avalonia/UniGetUI.Avalonia.csproj `
          --runtime win-x64 `
          /p:Configuration=Release `
          /p:PublishAot=true `
          /p:SelfContained=true
        dotnet publish UniGetUI.Avalonia/UniGetUI.Avalonia.csproj `
          --no-restore `
          --configuration Release `
          --runtime win-x64 `
          --self-contained true `
          --output "${{ runner.temp }}\unigetui-nativeaot-publish" `
          /m:1 `
          /p:Platform=x64 `
          /p:PublishProfile=Win-x64-NativeAot `
          /p:TrimmerSingleWarn=false `
          /p:UseSharedCompilation=false `
          --verbosity minimal
        if (-not (Test-Path "${{ runner.temp }}\unigetui-nativeaot-publish\UniGetUI.exe")) {
          throw "NativeAOT publish did not produce UniGetUI.exe."
        }
