parameters:
  additionalBuildArguments: ''

steps:
- checkout: self
  fetchDepth: 1
  submodules: true
  clean: true

- task: UseDotNet@2
  displayName: 'Use .NET 8 SDK'
  inputs:
    packageType: sdk
    version: '8.x'
    includePreviewVersions: true

- task: PowerShell@2
  displayName: Verify XAML formatting
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\applyXamlStyling.ps1'
    arguments: -Passive
    pwsh: true

- task: PowerShell@2
  displayName: Verify Nuget package versions for PowerToys.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyNugetPackages.ps1'
    arguments: -solution '$(build.sourcesdirectory)\PowerToys.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for PowerToys.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\PowerToys.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for BugReportTool.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for WebcamReportTool.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\tools\WebcamReportTool\WebcamReportTool.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for StylesReportTool.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln'
    pwsh: true

- task: PowerShell@2
  displayName: Verify Arm64 configuration for PowerToysSetup.sln
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyArm64Configuration.ps1'
    arguments: -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln'
    pwsh: true

- task: VisualStudioTestPlatformInstaller@1
  displayName: Ensure VSTest Platform

- task: VSBuild@1
  displayName: 'Build PowerToys.sln'
  inputs:
    solution: '**\PowerToys.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }}
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build BugReportTool.sln'
  inputs:
    solution: '**\BugReportTool.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }}
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build WebcamReportTool.sln'
  inputs:
    solution: '**\WebcamReportTool.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }}
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build StylesReportTool.sln'
  inputs:
    solution: '**\StylesReportTool.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: -restore ${{ parameters.additionalBuildArguments }}
    maximumCpuCount: true

- task: PowerShell@2
  displayName: Download and install WiX 3.14 development build
  inputs:
    targetType: filePath
    filePath: '$(build.sourcesdirectory)\.pipelines\installWiX.ps1'

- task: VSBuild@1
  displayName: 'Build PowerToys per-machine MSI'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysInstaller -restore ${{ parameters.additionalBuildArguments }}
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build PowerToys per-machine Bootstrapper'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysBootstrapper ${{ parameters.additionalBuildArguments }}
    clean: false
    maximumCpuCount: true

- task: PowerShell@2
  displayName: Clean installer dir before building per-user installer
  inputs:
    targetType: inline
    script: git clean -xfd  -e *exe -- .\installer\
    pwsh: true

- task: VSBuild@1
  displayName: 'Build PowerToys per-user MSI'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysInstaller -restore ${{ parameters.additionalBuildArguments }} /p:PerUser=true
    maximumCpuCount: true

- task: VSBuild@1
  displayName: 'Build PowerToys per-user Bootstrapper'
  inputs:
    solution: '**\installer\PowerToysSetup.sln'
    vsVersion: 17.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArgs: /t:PowerToysBootstrapper ${{ parameters.additionalBuildArguments }} /p:PerUser=true
    clean: false
    maximumCpuCount: true

# Check if deps.json files don't reference different dll versions.
- task: PowerShell@2
  displayName: Audit deps.json files for all applications
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyDepsJsonLibraryVersions.ps1'
    arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
    pwsh: true

# Check if asset files on the main application paths are playing nice and avoiding basic conflicts.
- task: PowerShell@2
  displayName: Audit base applications path asset conflicts
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyPossibleAssetConflicts.ps1'
    arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
    pwsh: true

- task: PowerShell@2
  displayName: Audit WinAppSDK applications path asset conflicts
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyPossibleAssetConflicts.ps1'
    arguments: -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)\WinUI3Apps'
    pwsh: true

# directly not doing WinAppDriver testing
- task: VSTest@2
  displayName: 'MS Tests'
  condition: ne(variables['BuildPlatform'], 'arm64') # No arm64 agents to run the tests.
  inputs:
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\UnitTests-GcodeThumbnailProvider.dll
      **\UnitTests-StlThumbnailProvider.dll
      **\UnitTests-PdfThumbnailProvider.dll
      **\Settings.UI.UnitTests.dll
      **\UnitTests-GcodePreviewHandler.dll
      **\UnitTests-PdfPreviewHandler.dll
      **\UnitTests-PreviewHandlerCommon.dll
      **\Microsoft.PowerToys.Run.Plugin.Registry.UnitTests.dll
      **\UnitTest-ColorPickerUI.dll
      **\Microsoft.Interop.Tests.dll
      **\ImageResizer.Test.dll
      **\Community.PowerToys.Run.Plugin.UnitConverter.UnitTest.dll
      **\Community.PowerToys.Run.Plugin.ValueGenerator.UnitTests.dll
      **\Microsoft.Plugin.Folder.UnitTests.dll
      **\Microsoft.Plugin.Program.UnitTests.dll
      **\Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest.dll
      **\Microsoft.Plugin.Uri.UnitTests.dll
      **\Wox.Test.dll
      **\Microsoft.PowerToys.Run.Plugin.System.UnitTests.dll
      **\Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.dll
      **\Microsoft.Plugin.WindowsTerminal.UnitTests.dll
      **\Microsoft.Plugin.WindowWalker.UnitTests.dll
      **\PreviewPaneUnitTests.dll
      **\UnitTests-SvgThumbnailProvider.dll
      **\UnitTests-SvgPreviewHandler.dll
      **\PowerToys.Hosts.Tests.dll
      **\MouseJumpUI.UnitTests.dll
      !**\obj\**
      !**\ref\**

# Native dlls
- task: VSTest@2
  condition: ne(variables['BuildPlatform'],'arm64') # No arm64 agents to run the tests.
  displayName: 'Native Tests'
  inputs:
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\KeyboardManagerEngineTest.dll
      **\KeyboardManagerEditorTest.dll
      **\UnitTests-CommonLib.dll
      **\PowerRenameUnitTests.dll
      **\powerpreviewTest.dll
      **\UnitTests-FancyZones.dll
      !**\obj\**

- task: PowerShell@2
  displayName: Trigger dotnet welcome message so that it does not cause errors on other scripts
  inputs:
    targetType: 'inline'
    script: |
      dotnet list $(build.sourcesdirectory)\src\common\Common.UI\Common.UI.csproj package

- task: PowerShell@2
  displayName: Verify Notice.md and Nuget packages match
  inputs:
    filePath: '$(build.sourcesdirectory)\.pipelines\verifyNoticeMdAgainstNugetPackages.ps1'
    arguments: -path '$(build.sourcesdirectory)\'
    pwsh: true