steps:
- powershell: |
     python ./skip_ci.py --base-branch-env=SYSTEM_PULLREQUEST_TARGETBRANCH --is-pull-env=SYSTEM_PULLREQUEST_PULLREQUESTID --base-branch-origin
     if ($LastExitCode -ne 0) {
        exit 0
     }

     # remove Chocolately, MinGW, Strawberry Perl from path, so we don't find gcc/gfortran and try to use it
     $env:Path = ($env:Path.Split(';') | Where-Object { $_ -notmatch 'mingw|Strawberry|Chocolatey' }) -join ';'

     # download and install prerequisites
     function DownloadFile([String] $Source, [String] $Destination) {
       $retries = 10
       for ($i = 1; $i -le $retries; $i++) {
           try {
               (New-Object net.webclient).DownloadFile($Source, $Destination)
               break # succeeded
           } catch [net.WebException] {
               if ($i -eq $retries) {
                   throw # fail on last retry
               }
               $backoff = (10 * $i) # backoff 10s, 20s, 30s...
               echo ('{0}: {1}' -f $Source, $_.Exception.Message)
               echo ('Retrying in {0}s...' -f $backoff)
               Start-Sleep -m ($backoff * 1000)
              }
          }
     }

     DownloadFile -Source 'https://github.com/mesonbuild/cidata/raw/master/ninja.exe' -Destination $(System.WorkFolder)\ninja.exe
     DownloadFile -Source 'http://nirbheek.in/files/binaries/pkg-config/win32/pkg-config.exe' -Destination $(System.WorkFolder)\pkg-config.exe
     DownloadFile -Source 'https://download.microsoft.com/download/D/B/B/DBB64BA1-7B51-43DB-8BF1-D1FB45EACF7A/msmpisdk.msi' -Destination msmpisdk.msi
     DownloadFile -Source 'https://download.microsoft.com/download/D/B/B/DBB64BA1-7B51-43DB-8BF1-D1FB45EACF7A/MSMpiSetup.exe' -Destination MSMpiSetup.exe
     if ($env:compiler -ne 'msvc2015') {
       Start-Process msiexec.exe -ArgumentList '/i msmpisdk.msi /quiet' -Wait
       # installer fails "requires an interactive window station" with vs2015 image
       Start-Process .\MSMpiSetup.exe -ArgumentList '-unattend -full' -Wait
     }

     # import ms-mpi env vars (set by installer)
     foreach ($p in "MSMPI_INC", "MSMPI_LIB32", "MSMPI_LIB64") {
       $v = [Environment]::GetEnvironmentVariable($p, "Machine")
       Set-Content "env:$p" "$v"
     }

     if ($env:compiler -eq 'msvc2015') {
       if ($env:arch -eq 'x86') {
         $forcex86 = "--forcex86"
       }

       # download and install python3 and add to path (since it's not installed in vs2015 image!)
       Set-ExecutionPolicy Bypass -Scope Process -Force
       iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
       choco install python3 -y --no-progress $forcex86 --params "/InstallDir:C:\Python3"
       $env:Path = "C:\Python3;$env:Path"

       # add JDK installed in vs2015 image to PATH
       $env:Path = "C:\java\jdk\jdk1.8.0_102\bin\;$env:Path"
     }

     # install boost (except for clang-cl)
     if ($env:arch -eq 'x86') { $boost_bitness = '32' } else { $boost_bitness = '64' }
     if ($env:compiler -eq 'msvc2015') {
       $boost_version = '1.60.0' ; $boost_abi_tag = '14.0'
     } elseif ($env:compiler -eq 'msvc2017') {
       $boost_version = '1.64.0' ; $boost_abi_tag = '14.1'
     }
     if ($boost_version) {
       $boost_filename = $boost_version.Replace('.', '_')
       Downloadfile -Source "https://sourceforge.net/projects/boost/files/boost-binaries/$boost_version/boost_$boost_filename-msvc-$boost_abi_tag-$boost_bitness.exe" -Destination boost_$boost_filename-msvc-$boost_abi_tag-$boost_bitness.exe
       Start-Process "boost_$boost_filename-msvc-$boost_abi_tag-$boost_bitness.exe" -ArgumentList "/dir=$(System.WorkFolder)\boost_$boost_filename /silent" -Wait
       $env:BOOST_ROOT = "$(System.WorkFolder)\boost_$boost_filename"
       $env:Path = "$env:Path;$env:BOOST_ROOT\lib$boost_bitness-msvc-$boost_abi_tag"
     } else {
       $env:BOOST_ROOT = ""
     }

     # install D compiler and dub packages
     if ($env:backend -eq 'ninja') {
          & .\ci\install-dmd.ps1
          $arch = 'x86_mscoff'
          if ($Env:arch -eq 'x64') {
            $arch = 'x86_64'
          }
          & dub fetch urld
          & dub build urld --compiler=dmd --arch=$arch
          & dub fetch dubtestproject
          & dub build dubtestproject:test1 --compiler=dmd --arch=$arch
          & dub build dubtestproject:test2 --compiler=dmd --arch=$arch
        }

     # test_find_program exercises some behaviour which relies on .py being in PATHEXT
     $env:PATHEXT += ';.py'

     # add downloads to PATH
     $env:Path = "$env:SYSTEM_WORKFOLDER;$env:Path"

     $origPath = $env:Path
     # import visual studio variables
     if ($env:compiler -eq 'msvc2015') {
       $vcvars = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
     } elseif($env:compiler -eq 'msvc2019') {
       $vcvars = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat"
     } else {
       $vcvars = "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat"
     }

     ## ask cmd.exe to output the environment table after the batch file completes
     $tempFile = [IO.Path]::GetTempFileName()
     cmd /c " `"$vcvars`" $env:arch && set > `"$tempFile`" "

     ## go through the environment variables in the temp file.
     ## for each of them, set the variable in our local environment.
     Get-Content $tempFile | Foreach-Object {
       if($_ -match "^(.*?)=(.*)$") {
         Set-Content "env:\$($matches[1])" $matches[2]
       }
     }
     Remove-Item $tempFile

     if ($env:compiler -eq 'clang-cl') {
       # drop visual studio from PATH
       # (but leave INCLUDE, LIB and WindowsSdkDir environment variables set)
       $env:Path = $origPath

       # install llvm for clang-cl builds
       DownloadFile -Source 'http://releases.llvm.org/7.0.0/LLVM-7.0.0-win64.exe' -Destination LLVM-7.0.0-win64.exe
       Start-Process .\LLVM-7.0.0-win64.exe -ArgumentList '/S' -Wait
       $env:Path = "C:\Program Files\LLVM\bin;$env:Path"
       $env:CC = "clang-cl"
       $env:CXX = "clang-cl"

       # and use Windows SDK tools
       $env:Path = "$env:WindowsSdkDir\bin\$env:Arch;$env:Path"
     }

     # add .NET framework tools to path for resgen for C# tests
     # (always use 32-bit tool, as there doesn't seem to be a 64-bit tool)
     if ((Get-Command "resgen.exe" -ErrorAction SilentlyContinue) -eq $null) {
       $env:Path = "$env:WindowsSDK_ExecutablePath_x86;$env:Path"
     }

     if ($env:backend -eq 'ninja') {
       ninja --version
     } else {
       MSBuild /version
     }

     echo "=== PATH BEGIN ==="
     echo ($env:Path).Replace(';',"`n")
     echo "=== PATH END ==="
     echo ""
     echo "Locating Python:"
     where.exe python
     python --version

     # Needed for running unit tests in parallel.
     python -m pip --disable-pip-version-check install --upgrade pytest-xdist


     echo ""
     echo "Locating cl, rc:"
     where.exe cl
     where.exe rc

     echo ""
     echo "=== Start running tests ==="
     # Starting from VS2019 Powershell(?) will fail the test run
     # if it prints anything to stderr. Python's test runner
     # does that by default so we need to forward it.
     cmd /c 'python 2>&1' run_tests.py --backend $(backend)

- task: PublishTestResults@2
  inputs:
    testResultsFiles: meson-test-run.xml
    testRunTitle: $(System.JobName)
    publishRunAttachments: true
  condition: not(canceled())

- task: CopyFiles@2
  inputs:
    contents: 'meson-test-run.*'
    targetFolder: $(Build.ArtifactStagingDirectory)
  condition: not(canceled())

- task: PublishBuildArtifacts@1
  inputs:
    artifactName: $(System.JobName)
  condition: not(canceled())
