parameters:
- name: ImageNames
  type: object
  default:
    Linux: "ubuntu-latest"
    Windows: "windows-latest"
    macOS: "macos-latest"
- name: TestProjects
  type: string
  default: "tests/**/*Tests.csproj"
- name: DotNetSdkVersion
  type: string
  default: 3.1.100

jobs:
  - job: Test
    displayName: Test
    strategy:
      matrix:
        ${{ each imageName in parameters.ImageNames }}:
          ${{ imageName.key }}:
            ImageName: ${{ imageName.value }}
    pool:
      vmImage: "$(ImageName)"
    steps:
      - checkout: self
        clean: true
        submodules: true
        persistCredentials: false

      # This is required for the SonarCloud analyzer
      - task: UseDotNet@2
        displayName: "Install .NET Core SDK 2.1"
        condition: eq(variables['ImageName'], 'ubuntu-latest')
        inputs:
          packageType: sdk
          version: '2.1.805'

      - task: UseDotNet@2
        displayName: "Update DotNet"
        inputs:
          packageType: sdk
          version: ${{ parameters.DotNetSdkVersion }}

      - task: SonarCloudPrepare@1
        displayName: 'Prepare analysis on SonarCloud'
        condition: eq(variables['ImageName'], 'ubuntu-latest')
        enabled: false
        inputs:
          SonarCloud: 'Sonarcloud for Jellyfin'
          organization: 'jellyfin'
          projectKey: 'jellyfin_jellyfin'

      - task: DotNetCoreCLI@2
        displayName: 'Run CLI Tests'
        inputs:
          command: "test"
          projects: ${{ parameters.TestProjects }}
          arguments: '--configuration Release --collect:"XPlat Code Coverage" --settings tests/coverletArgs.runsettings --verbosity minimal "-p:GenerateDocumentationFile=False"'
          publishTestResults: true
          testRunTitle: $(Agent.JobName)
          workingDirectory: "$(Build.SourcesDirectory)"

      - task: SonarCloudAnalyze@1
        displayName: 'Run Code Analysis'
        condition: eq(variables['ImageName'], 'ubuntu-latest')
        enabled: false

      - task: SonarCloudPublish@1
        displayName: 'Publish Quality Gate Result'
        condition: eq(variables['ImageName'], 'ubuntu-latest')
        enabled: false

      - task: Palmmedia.reportgenerator.reportgenerator-build-release-task.reportgenerator@4
        condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) # !! THIS is for V1 only V2 will/should support merging
        displayName: 'Run ReportGenerator'
        inputs:
          reports: "$(Agent.TempDirectory)/**/coverage.cobertura.xml"
          targetdir: "$(Agent.TempDirectory)/merged/"
          reporttypes: "Cobertura"

      ## V2 is already in the repository but it does not work "wrong number of segments" YAML error.
      - task: PublishCodeCoverageResults@1
        condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux')) # !! THIS is for V1 only V2 will/should support merging
        displayName: 'Publish Code Coverage'
        inputs:
          codeCoverageTool: "cobertura"
          #summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml' # !!THIS IS FOR V2
          summaryFileLocation: "$(Agent.TempDirectory)/merged/**.xml"
          pathToSources: $(Build.SourcesDirectory)
          failIfCoverageEmpty: true

      - task: PublishPipelineArtifact@1
        displayName: 'Publish OpenAPI Artifact'
        condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
        inputs:
          targetPath: "tests/Jellyfin.Api.Tests/bin/Release/netcoreapp3.1/openapi.json"
          artifactName: 'OpenAPI Spec'