<Project ToolsVersion="14.0" DefaultTargets="Test">
  <Import Project="test/TestPackageProjects.targets" />
  <Import Project="test/TestProjects.targets" />

  <PropertyGroup>
    <PathListSeparator>:</PathListSeparator>
    <PathListSeparator Condition=" '$(OSName)' == 'win' ">%3b</PathListSeparator>
    <ExecPath>$(OutputDirectory)$(PathListSeparator)$(PATH)</ExecPath>
    <ExecPath Condition=" '$(OSName)' == 'win' ">$(OutputDirectory)</ExecPath>
    <TestPackagesDir>$(TestOutputDir)/packages/</TestPackagesDir>
    <TestArtifactsDir>$(TestOutputDir)/artifacts/</TestArtifactsDir>
    <TestResultXmlDir>$(TestOutputDir)/results/</TestResultXmlDir>
  </PropertyGroup>

  <ItemGroup>
    <TestTaskEnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsDir)" />
  </ItemGroup>

  <PropertyGroup>
    <RunTestEnvironmentVariables>@(TestTaskEnvironmentVariables)</RunTestEnvironmentVariables>
  </PropertyGroup>

  <Target Name="Test"
          Condition=" '$(CLIBUILD_SKIP_TESTS)' != 'true' "
          DependsOnTargets="BuildTests;">

    <ItemGroup>
      <ProjectsToTest Include="build/test/RunTest.proj">
        <Properties>
          CLIBuildDll=$(CLIBuildDll);
          Configuration=$(Configuration);
          EnvironmentVariables=$(RunTestEnvironmentVariables);
          TestProject=%(TestProjects.Identity);
          TestResultXmlDir=$(TestResultXmlDir);
          ToolPath=$(OutputDirectory);
          WorkingDirectory=$([System.IO.Directory]::GetParent(%(TestProjects.Identity)))
        </Properties>
      </ProjectsToTest>
    </ItemGroup>

    <!-- Begin Workaround lack of a stable package version for depedencies; copy into simulated stable version folders -->
 
    <PropertyGroup>
        <StableSharedFrameworkDirectory>$(OutputDirectory)/shared/Microsoft.NETCore.App/$(SharedFrameworkStableVersion)</StableSharedFrameworkDirectory>
        <StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes>$(Stage2WithBackwardsCompatibleRuntimesOutputDirectory)/shared/Microsoft.NETCore.App/$(SharedFrameworkStableVersion)</StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes>
    </PropertyGroup>

    <ItemGroup>  
        <Stabilize_SourceFiles_2_0 Include="$(OutputDirectory)/shared/Microsoft.NETCore.App/$(MicrosoftNETCoreAppPackageVersion)/*.*"/>
        <SimulatedStableSharedFrameworkDirectories Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
                                          Include="$(StableSharedFrameworkDirectory)" />
        <SimulatedStableSharedFrameworkDirectories Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
                                          Include="$(StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes)" />
    </ItemGroup>

    <Copy
        Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
        SourceFiles="@(Stabilize_SourceFiles_2_0)"
        DestinationFiles="@(Stabilize_SourceFiles_2_0->'$(StableSharedFrameworkDirectory)/%(RecursiveDir)%(Filename)%(Extension)')"
    />

    <Copy
        Condition=" '$(IsSharedFrameworkPreReleaseVersion)' == 'True' "
        SourceFiles="@(Stabilize_SourceFiles_2_0)"
        DestinationFiles="@(Stabilize_SourceFiles_2_0->'$(StableSharedFrameworkDirectoryWithBackwardsCompatibleRuntimes)/%(RecursiveDir)%(Filename)%(Extension)')"
    />
 
    <!-- End Workaround lack of a stable package version for depedencies; copy into simulated stable versions -->

    <Message Text="Starting test execution" Importance="High" />
  
    <MSBuild
      BuildInParallel="True"
      Projects="@(ProjectsToTest)">
    </MSBuild>

    <Exec Command="$(DotnetInOutputDirectory) exec $(RoslynDirectory)/bincore/VBCSCompiler.dll -shutdown" />

    <Message Text="Finished test execution" Importance="High" />

    <!-- Begin Workaround lack of a stable package version for depedencies; remove simulated stable version folder. -->

    <RemoveDir Directories="@(SimulatedStableSharedFrameworkDirectories)" />
 
    <!-- End Workaround lack of a stable package version for depedencies; remove simulated stable version folder. -->
  </Target>

  <Target Name="PrepareTests"
          DependsOnTargets="Init;
                            SetupTestProjectData">
    <MakeDir Directories="$(TestPackagesDir)" Condition="!Exists('$(TestPackagesDir)')"/>
  </Target>

  <Target Name="RestoreTests"
          DependsOnTargets="PrepareTests;
                            CreateTestAssetPackageNuPkgs;">
    <DotNetRestore ToolPath="$(OutputDirectory)"
                   ProjectPath="&quot;$(TestDirectory)/Microsoft.DotNet.Cli.Tests.sln&quot;" />
  </Target>

  <Target Name="BuildTests"
          DependsOnTargets="RestoreTests;">
    <DotNetBuild ToolPath="$(OutputDirectory)"
                 ProjectPath="&quot;$(TestDirectory)/Microsoft.DotNet.Cli.Tests.sln&quot;"
                 MaxCpuCount="1" />
  </Target>

  <Target Name="CreateTestAssetPackageNuPkgs"
          DependsOnTargets="SetupTestPackageProjectData;"
          Outputs="%(TestPackageProject.Identity)">

    <DotNetRestore ToolPath="$(OutputDirectory)"
                   WorkingDirectory="$([System.IO.Directory]::GetParent('%(TestPackageProject.ProjectPath)'))"
                   ProjectPath="%(TestPackageProject.ProjectPath)" />
 
    <!-- https://github.com/NuGet/Home/issues/4063 -->
    <DotNetPack Output="$(TestPackagesDir)"
                ProjectPath="%(TestPackageProject.ProjectPath)"
                ToolPath="$(OutputDirectory)"
                VersionSuffix="%(TestPackageProject.VersionSuffix)"
                MsbuildArgs="%(TestPackageProject.MsbuildArgs) /p:SdkNuGetVersion=$(SdkNugetVersion)" />

  </Target>

  <Target Name="EnsureStageSeparation">
    <DotNetMSBuild Arguments="/v:diag $(RepoRoot)/build_projects/Microsoft.DotNet.Cli.Build.SelfTest/InvokeWithStage0.proj /p:OutputDirectory=&quot;$(OutputDirectory)&quot;"
                   ToolPath="$(Stage0Directory)" />
  </Target>
</Project>