diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs b/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs index f1924ebb4..a4822a176 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/PackageConstants.cs @@ -9,6 +9,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration { public const string SdkPackageName = "Microsoft.NET.Sdk"; public const string WebSdkPackageName = "Microsoft.NET.Sdk.Web"; + public const string TestSdkPackageName = "Microsoft.NET.Test.Sdk"; + public const string TestSdkPackageVersion = "15.0.0-preview-20161024-02"; + public const string XUnitPackageName = "xunit"; + public const string XUnitPackageVersion = "2.2.0-beta3-build3402"; + public const string XUnitRunnerPackageName = "xunit.runner.visualstudio"; + public const string XUnitRunnerPackageVersion = "2.2.0-beta4-build1188"; public static readonly IDictionary AspProjectDependencyToolsPackages = new Dictionary { {"Microsoft.EntityFrameworkCore.Tools", "Microsoft.EntityFrameworkCore.Tools"}, diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectExtensions.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectExtensions.cs index d08310122..a2e754d26 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectExtensions.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectExtensions.cs @@ -18,6 +18,10 @@ namespace Microsoft.DotNet.ProjectJsonMigration { projectType = ProjectType.Web; } + else if (project.IsTestProject) + { + projectType = ProjectType.Test; + } return projectType; } diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectType.cs b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectType.cs index 97001ace2..659ee6d5d 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/ProjectType.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/ProjectType.cs @@ -3,6 +3,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration internal enum ProjectType { Console, - Web + Web, + Test } } \ No newline at end of file diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs index ac7bddf1c..ab203101d 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs @@ -86,7 +86,8 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules MigrationSettings migrationSettings, ProjectItemGroupElement noFrameworkPackageReferenceItemGroup) { - var type = migrationRuleInputs.DefaultProjectContext.ProjectFile.GetProjectType(); + var project = migrationRuleInputs.DefaultProjectContext.ProjectFile; + var type = project.GetProjectType(); switch (type) { case ProjectType.Web: @@ -101,6 +102,40 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules noFrameworkPackageReferenceItemGroup, mergeExisting: false); break; + case ProjectType.Test: + _transformApplicator.Execute( + PackageDependencyInfoTransform().Transform( + new PackageDependencyInfo + { + Name = PackageConstants.TestSdkPackageName, + Version = PackageConstants.TestSdkPackageVersion + }), + noFrameworkPackageReferenceItemGroup, + mergeExisting: false); + + if (project.TestRunner.Equals("xunit", StringComparison.OrdinalIgnoreCase)) + { + _transformApplicator.Execute( + PackageDependencyInfoTransform().Transform( + new PackageDependencyInfo + { + Name = PackageConstants.XUnitPackageName, + Version = PackageConstants.XUnitPackageVersion + }), + noFrameworkPackageReferenceItemGroup, + mergeExisting: false); + + _transformApplicator.Execute( + PackageDependencyInfoTransform().Transform( + new PackageDependencyInfo + { + Name = PackageConstants.XUnitRunnerPackageName, + Version = PackageConstants.XUnitRunnerPackageVersion + }), + noFrameworkPackageReferenceItemGroup, + mergeExisting: false); + } + break; default: break; } diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs index e2dc2fec6..50066736f 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs @@ -257,5 +257,96 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests items = itemGroup.First().Items.ToArray(); items[0].Include.Should().Be("System"); } + + [Fact] + public void It_migrates_test_projects_to_have_test_sdk() + { + var mockProj = RunPackageDependenciesRuleOnPj(@" + { + ""buildOptions"": { + ""emitEntryPoint"": true + }, + ""frameworks"": { + ""netcoreapp1.0"": {} + }, + ""testRunner"": ""mstest"" + }"); + + mockProj.Items.Should().ContainSingle( + i => (i.Include == "Microsoft.NET.Test.Sdk" && i.ItemType == "PackageReference")); + + mockProj.Items.Should().NotContain( + i => (i.Include == "xunit" && i.ItemType == "PackageReference")); + + mockProj.Items.Should().NotContain( + i => (i.Include == "xunit.runner.visualstudio" && i.ItemType == "PackageReference")); + } + + [Fact] + public void It_migrates_test_projects_to_have_test_sdk_and_xunit_packagedependencies() + { + var mockProj = RunPackageDependenciesRuleOnPj(@" + { + ""buildOptions"": { + ""emitEntryPoint"": true + }, + ""frameworks"": { + ""netcoreapp1.0"": {} + }, + ""testRunner"": ""xunit"" + }"); + + mockProj.Items.Should().ContainSingle( + i => (i.Include == "Microsoft.NET.Test.Sdk" && i.ItemType == "PackageReference")); + + mockProj.Items.Should().ContainSingle( + i => (i.Include == "xunit" && i.ItemType == "PackageReference")); + + mockProj.Items.Should().ContainSingle( + i => (i.Include == "xunit.runner.visualstudio" && i.ItemType == "PackageReference")); + } + + private void EmitsPackageReferences(ProjectRootElement mockProj, params Tuple[] packageSpecs) + { + foreach (var packageSpec in packageSpecs) + { + var packageName = packageSpec.Item1; + var packageVersion = packageSpec.Item2; + var packageTFM = packageSpec.Item3; + + var items = mockProj.Items + .Where(i => i.ItemType == "PackageReference") + .Where(i => string.IsNullOrEmpty(packageTFM) || i.ConditionChain().Any(c => c.Contains(packageTFM))) + .Where(i => i.Include == packageName) + .Where(i => i.GetMetadataWithName("Version").Value == packageVersion); + + items.Should().HaveCount(1); + } + } + + private void EmitsToolReferences(ProjectRootElement mockProj, params Tuple[] toolSpecs) + { + foreach (var toolSpec in toolSpecs) + { + var packageName = toolSpec.Item1; + var packageVersion = toolSpec.Item2; + + var items = mockProj.Items + .Where(i => i.ItemType == "DotNetCliToolReference") + .Where(i => i.Include == packageName) + .Where(i => i.GetMetadataWithName("Version").Value == packageVersion); + + items.Should().HaveCount(1); + } + } + + private ProjectRootElement RunPackageDependenciesRuleOnPj(string s, string testDirectory = null) + { + testDirectory = testDirectory ?? Temp.CreateDirectory().Path; + return TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] + { + new MigratePackageDependenciesAndToolsRule() + }, s, testDirectory); + } } } \ No newline at end of file