<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <PathSeparator>/</PathSeparator>
    <PathSeparator Condition=" '$(OSName)' == 'win' ">\</PathSeparator>
  </PropertyGroup>

  <Import Project="test/TestPackageProjects.targets" />
  <Import Project="test/TestAssetProjects.targets" />
  <Import Project="test/TestProjects.targets" />

  <Target Name="Test"
          DependsOnTargets="PrepareTests;
                            BuildTestAssets;
                            BuildTests;">
                            
    <PropertyGroup>
      <PathListSeparator>:</PathListSeparator>
      <PathListSeparator Condition=" '$(OSName)' == 'win' ">%3b</PathListSeparator>
      <ExecPath>$(Stage2Directory)$(PathListSeparator)$(PATH)</ExecPath>
      <ExecPath Condition=" '$(OSName)' == 'win' ">$(Stage2Directory)</ExecPath>
      <TestArtifactsEnv>$(TestArtifactsDir)</TestArtifactsEnv>
    </PropertyGroup>

    <ItemGroup>
      <TestTaskEnvironmentVariables Include="PATH=$(ExecPath)" />
      <TestTaskEnvironmentVariables Include="TEST_ARTIFACTS=$(TestArtifactsEnv)" />
    </ItemGroup>

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

    <ItemGroup>
      <ProjectsToTest Include="build/test/RunTest.proj">
        <Properties>
          CLIBuildDll=$(CLIBuildDll);
          Configuration=$(Configuration);
          EnvironmentVariables=$(RunTestEnvironmentVariables);
          TestProjectName=%(TestProjects.OutputName);
          TestResultXmlDir=$(TestResultXmlDir);
          ToolPath=$(Stage0PjDirectory);
          WorkingDirectory=%(TestProjects.ProjectDir)
        </Properties>
      </ProjectsToTest>
    </ItemGroup>

    <MSBuild
      BuildInParallel="True"
      Projects="@(ProjectsToTest)">
    </MSBuild>
  </Target>

  <Target Name="PrepareTests"
          DependsOnTargets="Init">
    <PropertyGroup>
      <TestPackageBuildVersionSuffix>$(CommitCount)</TestPackageBuildVersionSuffix>
      <TestOutputDir>$(RepoRoot)/artifacts/testpackages/</TestOutputDir>
      <TestPackagesBuildDir>$(TestOutputDir)/packagesBuild/</TestPackagesBuildDir>
      <TestPackagesDir>$(TestOutputDir)/packages/</TestPackagesDir>
      <TestArtifactsDir>$(TestOutputDir)/artifacts/</TestArtifactsDir>
      <TestResultXmlDir>$(TestOutputDir)/results/</TestResultXmlDir>
      <TestDirectory>$(RepoRoot)/test/</TestDirectory>
      <DotnetUnderTest>$(Stage2Directory)</DotnetUnderTest>
    </PropertyGroup>
  </Target>

  <Target Name="BuildTests"
          DependsOnTargets="RestoreTests;
                            SetupTestProjectData;"
          Inputs="%(TestProjects.BuildInputs)"
          Outputs="%(TestProjects.BuildOutput)">

    <DotNetBuildPj  Configuration="$(Configuration)"
                    Framework="%(TestProjects.Framework)"
                    ToolPath="$(Stage0PjDirectory)"
                    WorkingDirectory="%(TestProjects.RelativeDir)" />
  </Target>

  <Target Name="RestoreTests"
          DependsOnTargets="CreateTestAssetPackageNuPkgs;
                            CleanTestProjectsBinObjProjectJson;
                            SetupRestoreTestsInputs;"
          Inputs="@(RestoreTestsInputs)"
          Outputs="@(RestoreTestsInputs->'%(RelativeDir)project.lock.json')">

    <CallTarget Targets="CleanTestProjectsLockFiles"/>

    <DotNetRestorePj  FallbackSource="$(TestPackagesDir)"
                      ToolPath="$(Stage0PjDirectory)"
                      WorkingDirectory="$(TestDirectory)" />
  </Target>

  <Target Name="CleanTestProjectsBinObjProjectJson"
          DependsOnTargets="SetupRestoreTestsInputs;"
          Inputs="@(RestoreTestsInputs)"
          Outputs="@(RestoreTestsInputs->'%(RelativeDir)project.lock.json')">
    <ItemGroup>
      <FilesToDelete Include="$(TestDirectory)**/bin/**/project.json" />
      <FilesToDelete Include="$(TestDirectory)**/obj/**/project.json" />
    </ItemGroup>

    <Delete Files="@(FilesToDelete)" />

    <ItemGroup>
      <FilesToDelete Remove="*" />
    </ItemGroup>
  </Target>

  <Target Name="SetupRestoreTestsInputs"
          DependsOnTargets="PrepareTests;" >
    <ItemGroup>
      <RestoreTestsInputs Include="$(TestDirectory)/**/project.json"
                          Exclude="$(TestDirectory)/**/bin/**/project.json" />
    </ItemGroup>
  </Target>

  <Target Name="BuildTestAssets"
          DependsOnTargets="BuildTestAssetProjects;
                            BuildDesktopTestAssetProjects;">
  </Target>

  <Target Name="BuildTestAssetProjects"
          DependsOnTargets="RestoreTestAssetProjects;
                            SetupTestAssetProjectData;"
          Inputs="%(TestAssetProjects.BuildInputs)"
          Outputs="%(TestAssetProjects.BuildOutput)">

    <DotNetBuildPj  Framework="netcoreapp1.0"
                    ProjectPath="$(RepoRoot)%(TestAssetProjects.ProjectPath)"
                    ToolPath="$(Stage0PjDirectory)"
                    WorkingDirectory="%(TestAssetProjects.RelativeDir)" />
  </Target>

  <Target Name="RestoreTestAssetProjects"
          DependsOnTargets="CreateTestAssetPackageNuPkgs;
                            SetupRestoreTestAssetProjectsInputs;"
          Inputs="@(RestoreTestAssetProjectsInputs)"
          Outputs="@(RestoreTestAssetProjectsInputs->'%(RelativeDir)/project.lock.json')">

    <DotNetRestorePj  FallbackSource="$(TestPackagesDir)"
                      ToolPath="$(Stage0PjDirectory)"
                      WorkingDirectory="$(RepoRoot)TestAssets/TestProjects/" />
  </Target>

  <Target Name="SetupRestoreTestAssetProjectsInputs" >
    <ItemGroup>
      <RestoreTestAssetProjectsInputs Include="$(RepoRoot)/TestAssets/TestProjects/**/project.json" />
    </ItemGroup>
  </Target>

  <Target Name="CleanTestAssetProjectsLockFiles" >
    <ItemGroup>
      <TestAssetProjectsLockFiles Include="$(RepoRoot)/TestAssets/TestProjects/**/project.lock.json" />
    </ItemGroup>
    <Delete Files="@(TestAssetProjectsLockFiles)" />
  </Target>

  <Target Name="CleanTestProjectsLockFiles" >
    <ItemGroup>
      <TestProjectsLockFiles Include="$(RepoRoot)/test/**/project.lock.json" />
    </ItemGroup>
    <Delete Files="@(TestProjectsLockFiles)" />
  </Target>

  <Target Name="BuildDesktopTestAssetProjects"
          Condition=" '$(IsDesktopAvailable)' == 'True' "
          DependsOnTargets="RestoreDesktopTestAssetProjects">
    <ItemGroup>
      <NoAutoBuildDesktopTestAssets Include="$(RepoRoot)TestAssets\DesktopTestProjects\**\.noautobuild" />
      <NoAutoBuildDesktopTestAssetProjects Include="%(NoAutoBuildDesktopTestAssets.RelativeDir)project.json" />
      <BuildableDesktopTestAssetProjects Include="$(RepoRoot)TestAssets\DesktopTestProjects\**\project.json"
                                         Exclude="@(NoAutoBuildDesktopTestAssetProjects)" />
    </ItemGroup>

    <Message Text="Skipping projects with .noautobuild files:" />
    <Message Text="%(NoAutoBuildDesktopTestAssetProjects.FullPath)" />

    <DotNetBuild  Configuration="$(Configuration)"
                  Framework="net46"
                  ProjectPath="%(BuildableDesktopTestAssetProjects.FullPath)"
                  ToolPath="$(Stage0PjDirectory)"
                  WorkingDirectory="%(BuildableDesktopTestAssetProjects.RelativeDir)" />
  </Target>

  <Target Name="RestoreDesktopTestAssetProjects"
          Condition=" '$(IsDesktopAvailable)' == 'True' "
          DependsOnTargets="CreateTestAssetPackageNuPkgs;
                            SetupRestoreDesktopTestAssetProjectsInputs;"
          Inputs="@(RestoreDesktopTestAssetProjectsInputs)"
          Outputs="@(RestoreDesktopTestAssetProjectsInputs->'%(RelativeDir)/project.lock.json')">

    <DotNetRestorePj  FallbackSource="$(TestPackagesDir)"
                      ToolPath="$(Stage0PjDirectory)"
                      WorkingDirectory="$(RepoRoot)TestAssets\DesktopTestProjects\" />
  </Target>

  <Target Name="SetupRestoreDesktopTestAssetProjectsInputs">
    <ItemGroup>
      <RestoreDesktopTestAssetProjectsInputs Include="$(RepoRoot)TestAssets\DesktopTestProjects\**\project.json" />
    </ItemGroup>
  </Target>

  <Target Name="CreateTestAssetPackageNuPkgs"
          DependsOnTargets="BuildTestAssetPackageProjects;
                            SetupTestPackageProjectData;"
          Inputs="%(TestPackageProject.PackInputs)"
          Outputs="%(TestPackageProject.PackOutputs)">

    <DotNetPackPj BuildBasePath="$(TestPackagesBuildDir)"
                  NoBuild="True"
                  Output="$(TestPackagesDir)"
                  ProjectPath="%(TestPackageProject.FullPath)"
                  ToolPath="$(Stage0PjDirectory)"
                  VersionSuffix="%(TestPackageProject.VersionSuffix)" />
  </Target>

  <Target Name="BuildTestAssetPackageProjects"
          DependsOnTargets="RestoreTestAssetPackageProjects;
                            SetupTestPackageProjectData;"
          Inputs="%(TestPackageProject.BuildInputs)"
          Outputs="%(TestPackageProject.BuildOutputs)">

    <DotNetBuildPj  BuildBasePath="$(TestPackagesBuildDir)"
                    Framework="%(TestPackageProject.Framework)"
                    ProjectPath="%(TestPackageProject.FullPath)"
                    ToolPath="$(Stage0PjDirectory)"
                    WorkingDirectory="%(BuildableTestAssetProjects.RelativeDir)" />
  </Target>

  <Target Name="RestoreTestAssetPackageProjects"
          DependsOnTargets="PrepareTests;
                            SetupRestoreTestAssetPackageProjectsInputs;"
          Inputs="@(RestoreTestAssetPackageProjectsInputs)"
          Outputs="@(RestoreTestAssetPackageProjectsInputs->'%(RelativeDir)/project.lock.json')">

    <DotNetRestorePJ  ToolPath="$(Stage0PjDirectory)"
                      WorkingDirectory="$(RepoRoot)/TestAssets/TestPackages/" />
  </Target>

  <Target Name="SetupRestoreTestAssetPackageProjectsInputs"
          DependsOnTargets="Init;">
    <ItemGroup>
      <RestoreTestAssetPackageProjectsInputs Include="$(RepoRoot)/TestAssets/TestPackages/**/project.json" />
    </ItemGroup>
  </Target>
</Project>