diff --git a/TestAssets/TestProjects/TestAppWithSln/Program.cs b/TestAssets/TestProjects/TestAppWithSln/Program.cs
deleted file mode 100644
index 51233cffa..000000000
--- a/TestAssets/TestProjects/TestAppWithSln/Program.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-
-namespace ConsoleApplication
-{
- public class Program
- {
- public static void Main(string[] args)
- {
- Console.WriteLine("Hello World!");
- }
- }
-}
diff --git a/TestAssets/TestProjects/TestAppWithSln/TestAppWithSln.sln b/TestAssets/TestProjects/TestAppWithSln/TestAppWithSln.sln
deleted file mode 100644
index e6b587e50..000000000
--- a/TestAssets/TestProjects/TestAppWithSln/TestAppWithSln.sln
+++ /dev/null
@@ -1,22 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "TestAppWithSln", "TestAppWithSln.xproj", "{0138CB8F-4AA9-4029-A21E-C07C30F425BA}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0138CB8F-4AA9-4029-A21E-C07C30F425BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0138CB8F-4AA9-4029-A21E-C07C30F425BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0138CB8F-4AA9-4029-A21E-C07C30F425BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0138CB8F-4AA9-4029-A21E-C07C30F425BA}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/TestAssets/TestProjects/TestAppWithSln/TestAppWithSln.xproj b/TestAssets/TestProjects/TestAppWithSln/TestAppWithSln.xproj
deleted file mode 100644
index 53f0c8b7a..000000000
--- a/TestAssets/TestProjects/TestAppWithSln/TestAppWithSln.xproj
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- 14.0.23107
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
-
-
-
- 0138cb8f-4aa9-4029-a21e-c07c30f425ba
- TestAppWithContents
- ..\..\..\artifacts\obj\$(MSBuildProjectName)
- ..\..\..\artifacts\
-
-
- 2.0
-
-
-
\ No newline at end of file
diff --git a/TestAssets/TestProjects/TestAppWithSln/project.json b/TestAssets/TestProjects/TestAppWithSln/project.json
deleted file mode 100644
index 5f8329deb..000000000
--- a/TestAssets/TestProjects/TestAppWithSln/project.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "version": "1.0.0-*",
- "buildOptions": {
- "emitEntryPoint": true
- },
- "dependencies": {
- "Microsoft.NETCore.App": "1.0.1"
- },
- "frameworks": {
- "netcoreapp1.0": {}
- },
- "runtimes": {
- "win7-x64": {},
- "win7-x86": {},
- "osx.10.10-x64": {},
- "osx.10.11-x64": {},
- "ubuntu.14.04-x64": {},
- "ubuntu.16.04-x64": {},
- "centos.7-x64": {},
- "rhel.7.2-x64": {},
- "debian.8-x64": {},
- "fedora.23-x64": {},
- "opensuse.13.2-x64": {}
- }
-}
\ No newline at end of file
diff --git a/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs b/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs
index 937b4ffce..51034eabb 100644
--- a/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs
+++ b/src/Microsoft.DotNet.Cli.Sln.Internal/SlnFile.cs
@@ -1139,7 +1139,7 @@ namespace Microsoft.DotNet.Cli.Sln.Internal
}
}
- class InvalidSolutionFormatException : Exception
+ public class InvalidSolutionFormatException : Exception
{
public InvalidSolutionFormatException(int line) : base("Invalid format in line " + line)
{
diff --git a/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.cs b/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.cs
index 084ac7c91..b5f2c5a13 100644
--- a/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.cs
+++ b/test/Microsoft.DotNet.Cli.Sln.Internal.Tests/Microsoft.DotNet.Cli.Sln.Internal.Tests.cs
@@ -13,65 +13,282 @@ namespace Microsoft.DotNet.Cli.Sln.Internal.Tests
{
public class GivenAnSlnFile : TestBase
{
+ private const string SolutionModified = @"
+Microsoft Visual Studio Solution File, Format Version 14.00
+# Visual Studio 16
+VisualStudioVersion = 16.0.26006.2
+MinimumVisualStudioVersion = 11.0.40219.1
+Project(""{7072A694-548F-4CAE-A58F-12D257D5F486}"") = ""AppModified"", ""AppModified\AppModified.csproj"", ""{9A19103F-16F7-4668-BE54-9A1E7A4F7556}""
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x64.ActiveCfg = Debug|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x64.Build.0 = Debug|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x86.ActiveCfg = Debug|x86
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x86.Build.0 = Debug|x86
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x64.ActiveCfg = Release|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x64.Build.0 = Release|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.ActiveCfg = Release|x86
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = TRUE
+ EndGlobalSection
+EndGlobal
+";
+
+ private const string SolutionWithAppAndLibProjects = @"
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26006.2
+MinimumVisualStudioVersion = 10.0.40219.1
+Project(""{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"") = ""App"", ""App\App.csproj"", ""{7072A694-548F-4CAE-A58F-12D257D5F486}""
+EndProject
+Project(""{13B669BE-BB05-4DDF-9536-439F39A36129}"") = ""Lib"", ""..\Lib\Lib.csproj"", ""{21D9159F-60E6-4F65-BC6B-D01B71B15FFC}""
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x64.ActiveCfg = Debug|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x64.Build.0 = Debug|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x86.ActiveCfg = Debug|x86
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x86.Build.0 = Debug|x86
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x64.ActiveCfg = Release|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x64.Build.0 = Release|x64
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.ActiveCfg = Release|x86
+ {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.Build.0 = Release|x86
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Debug|x64.ActiveCfg = Debug|x64
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Debug|x64.Build.0 = Debug|x64
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Debug|x86.ActiveCfg = Debug|x86
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Debug|x86.Build.0 = Debug|x86
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Release|x64.ActiveCfg = Release|x64
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Release|x64.Build.0 = Release|x64
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Release|x86.ActiveCfg = Release|x86
+ {21D9159F-60E6-4F65-BC6B-D01B71B15FFC}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
+";
+
[Fact]
- public void WhenGivenAValidPathItReadsAnSlnFile()
+ public void WhenGivenAValidSlnFileItReadsAndVerifiesContents()
{
- var solutionDirectory =
- TestAssetsManager.CreateTestInstance("TestAppWithSln", callingMethod: "p").Path;
+ var tmpFile = Temp.CreateFile();
+ tmpFile.WriteAllText(SolutionWithAppAndLibProjects);
- var solutionFullPath = Path.Combine(solutionDirectory, "TestAppWithSln.sln");
-
- var slnFile = SlnFile.Read(solutionFullPath);
+ SlnFile slnFile = SlnFile.Read(tmpFile.Path);
slnFile.FormatVersion.Should().Be("12.00");
- slnFile.ProductDescription.Should().Be("Visual Studio 14");
- slnFile.VisualStudioVersion.Should().Be("14.0.25420.1");
+ slnFile.ProductDescription.Should().Be("Visual Studio 15");
+ slnFile.VisualStudioVersion.Should().Be("15.0.26006.2");
slnFile.MinimumVisualStudioVersion.Should().Be("10.0.40219.1");
- slnFile.BaseDirectory.Should().Be(solutionDirectory);
- slnFile.FullPath.Should().Be(solutionFullPath);
+ slnFile.BaseDirectory.Should().Be(Path.GetDirectoryName(tmpFile.Path));
+ slnFile.FullPath.Should().Be(tmpFile.Path);
- slnFile.Projects.Count.Should().Be(1);
+ slnFile.Projects.Count.Should().Be(2);
var project = slnFile.Projects[0];
- project.Id.Should().Be("{0138CB8F-4AA9-4029-A21E-C07C30F425BA}");
- project.TypeGuid.Should().Be("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}");
- project.Name.Should().Be("TestAppWithSln");
- project.FilePath.Should().Be("TestAppWithSln.xproj");
+ project.Id.Should().Be("{7072A694-548F-4CAE-A58F-12D257D5F486}");
+ project.TypeGuid.Should().Be("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}");
+ project.Name.Should().Be("App");
+ project.FilePath.Should().Be(Path.Combine("App", "App.csproj"));
+ project = slnFile.Projects[1];
+ project.Id.Should().Be("{21D9159F-60E6-4F65-BC6B-D01B71B15FFC}");
+ project.TypeGuid.Should().Be("{13B669BE-BB05-4DDF-9536-439F39A36129}");
+ project.Name.Should().Be("Lib");
+ project.FilePath.Should().Be(Path.Combine("..", "Lib", "Lib.csproj"));
+
+ slnFile.SolutionConfigurationsSection.Count.Should().Be(6);
+ slnFile.SolutionConfigurationsSection
+ .GetValue("Debug|Any CPU", string.Empty)
+ .Should().Be("Debug|Any CPU");
+ slnFile.SolutionConfigurationsSection
+ .GetValue("Debug|x64", string.Empty)
+ .Should().Be("Debug|x64");
+ slnFile.SolutionConfigurationsSection
+ .GetValue("Debug|x86", string.Empty)
+ .Should().Be("Debug|x86");
+ slnFile.SolutionConfigurationsSection
+ .GetValue("Release|Any CPU", string.Empty)
+ .Should().Be("Release|Any CPU");
+ slnFile.SolutionConfigurationsSection
+ .GetValue("Release|x64", string.Empty)
+ .Should().Be("Release|x64");
+ slnFile.SolutionConfigurationsSection
+ .GetValue("Release|x86", string.Empty)
+ .Should().Be("Release|x86");
+
+ slnFile.ProjectConfigurationsSection.Count.Should().Be(2);
+ var projectConfigSection = slnFile
+ .ProjectConfigurationsSection
+ .GetPropertySet("{7072A694-548F-4CAE-A58F-12D257D5F486}");
+ projectConfigSection.Count.Should().Be(12);
+ projectConfigSection
+ .GetValue("Debug|Any CPU.ActiveCfg", string.Empty)
+ .Should().Be("Debug|Any CPU");
+ projectConfigSection
+ .GetValue("Debug|Any CPU.Build.0", string.Empty)
+ .Should().Be("Debug|Any CPU");
+ projectConfigSection
+ .GetValue("Debug|x64.ActiveCfg", string.Empty)
+ .Should().Be("Debug|x64");
+ projectConfigSection
+ .GetValue("Debug|x64.Build.0", string.Empty)
+ .Should().Be("Debug|x64");
+ projectConfigSection
+ .GetValue("Debug|x86.ActiveCfg", string.Empty)
+ .Should().Be("Debug|x86");
+ projectConfigSection
+ .GetValue("Debug|x86.Build.0", string.Empty)
+ .Should().Be("Debug|x86");
+ projectConfigSection
+ .GetValue("Release|Any CPU.ActiveCfg", string.Empty)
+ .Should().Be("Release|Any CPU");
+ projectConfigSection
+ .GetValue("Release|Any CPU.Build.0", string.Empty)
+ .Should().Be("Release|Any CPU");
+ projectConfigSection
+ .GetValue("Release|x64.ActiveCfg", string.Empty)
+ .Should().Be("Release|x64");
+ projectConfigSection
+ .GetValue("Release|x64.Build.0", string.Empty)
+ .Should().Be("Release|x64");
+ projectConfigSection
+ .GetValue("Release|x86.ActiveCfg", string.Empty)
+ .Should().Be("Release|x86");
+ projectConfigSection
+ .GetValue("Release|x86.Build.0", string.Empty)
+ .Should().Be("Release|x86");
+ projectConfigSection = slnFile
+ .ProjectConfigurationsSection
+ .GetPropertySet("{21D9159F-60E6-4F65-BC6B-D01B71B15FFC}");
+ projectConfigSection.Count.Should().Be(12);
+ projectConfigSection
+ .GetValue("Debug|Any CPU.ActiveCfg", string.Empty)
+ .Should().Be("Debug|Any CPU");
+ projectConfigSection
+ .GetValue("Debug|Any CPU.Build.0", string.Empty)
+ .Should().Be("Debug|Any CPU");
+ projectConfigSection
+ .GetValue("Debug|x64.ActiveCfg", string.Empty)
+ .Should().Be("Debug|x64");
+ projectConfigSection
+ .GetValue("Debug|x64.Build.0", string.Empty)
+ .Should().Be("Debug|x64");
+ projectConfigSection
+ .GetValue("Debug|x86.ActiveCfg", string.Empty)
+ .Should().Be("Debug|x86");
+ projectConfigSection
+ .GetValue("Debug|x86.Build.0", string.Empty)
+ .Should().Be("Debug|x86");
+ projectConfigSection
+ .GetValue("Release|Any CPU.ActiveCfg", string.Empty)
+ .Should().Be("Release|Any CPU");
+ projectConfigSection
+ .GetValue("Release|Any CPU.Build.0", string.Empty)
+ .Should().Be("Release|Any CPU");
+ projectConfigSection
+ .GetValue("Release|x64.ActiveCfg", string.Empty)
+ .Should().Be("Release|x64");
+ projectConfigSection
+ .GetValue("Release|x64.Build.0", string.Empty)
+ .Should().Be("Release|x64");
+ projectConfigSection
+ .GetValue("Release|x86.ActiveCfg", string.Empty)
+ .Should().Be("Release|x86");
+ projectConfigSection
+ .GetValue("Release|x86.Build.0", string.Empty)
+ .Should().Be("Release|x86");
+
+ slnFile.Sections.Count.Should().Be(3);
+ var solutionPropertiesSection = slnFile.Sections.GetSection("SolutionProperties");
+ solutionPropertiesSection.Properties.Count.Should().Be(1);
+ solutionPropertiesSection.Properties
+ .GetValue("HideSolutionNode", string.Empty)
+ .Should().Be("FALSE");
}
[Fact]
- public void WhenGivenAValidPathItReadsModifiesThenWritesAnSln()
+ public void WhenGivenAValidSlnFileItModifiesSavesAndVerifiesContents()
{
- var solutionDirectory =
- TestAssetsManager.CreateTestInstance("TestAppWithSln", callingMethod: "p").Path;
+ var tmpFile = Temp.CreateFile();
+ tmpFile.WriteAllText(SolutionWithAppAndLibProjects);
- var solutionFullPath = Path.Combine(solutionDirectory, "TestAppWithSln.sln");
+ SlnFile slnFile = SlnFile.Read(tmpFile.Path);
- var slnFile = SlnFile.Read(solutionFullPath);
- slnFile.FullPath.Should().Be(solutionFullPath);
+ slnFile.FormatVersion = "14.00";
+ slnFile.ProductDescription = "Visual Studio 16";
+ slnFile.VisualStudioVersion = "16.0.26006.2";
+ slnFile.MinimumVisualStudioVersion = "11.0.40219.1";
- slnFile.Projects.Count.Should().Be(1);
+ slnFile.Projects.Count.Should().Be(2);
var project = slnFile.Projects[0];
- project.Name.Should().Be("TestAppWithSln");
- project.Name = "New Project Name";
- project.FilePath.Should().Be("TestAppWithSln.xproj");
- project.FilePath = "New File Path";
+ project.Id = "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}";
+ project.TypeGuid = "{7072A694-548F-4CAE-A58F-12D257D5F486}";
+ project.Name = "AppModified";
+ project.FilePath = Path.Combine("AppModified", "AppModified.csproj");
+ slnFile.Projects.Remove(slnFile.Projects[1]);
- var newSolutionFullPath = Path.Combine(solutionDirectory, "TestAppWithSln_modified.sln");
- slnFile.Write(newSolutionFullPath);
+ slnFile.SolutionConfigurationsSection.Count.Should().Be(6);
+ slnFile.SolutionConfigurationsSection.Remove("Release|Any CPU");
+ slnFile.SolutionConfigurationsSection.Remove("Release|x64");
+ slnFile.SolutionConfigurationsSection.Remove("Release|x86");
- slnFile = SlnFile.Read(newSolutionFullPath);
- slnFile.FormatVersion.Should().Be("12.00");
- slnFile.ProductDescription.Should().Be("Visual Studio 14");
- slnFile.VisualStudioVersion.Should().Be("14.0.25420.1");
- slnFile.MinimumVisualStudioVersion.Should().Be("10.0.40219.1");
- slnFile.BaseDirectory.Should().Be(solutionDirectory);
- slnFile.FullPath.Should().Be(newSolutionFullPath);
- slnFile.Projects.Count.Should().Be(1);
- project = slnFile.Projects[0];
- project.Id.Should().Be("{0138CB8F-4AA9-4029-A21E-C07C30F425BA}");
- project.TypeGuid.Should().Be("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}");
- project.Name.Should().Be("New Project Name");
- project.FilePath.Should().Be("New File Path");
+ slnFile.ProjectConfigurationsSection.Count.Should().Be(2);
+ var projectConfigSection = slnFile
+ .ProjectConfigurationsSection
+ .GetPropertySet("{21D9159F-60E6-4F65-BC6B-D01B71B15FFC}");
+ slnFile.ProjectConfigurationsSection.Remove(projectConfigSection);
+
+ slnFile.Sections.Count.Should().Be(3);
+ var solutionPropertiesSection = slnFile.Sections.GetSection("SolutionProperties");
+ solutionPropertiesSection.Properties.Count.Should().Be(1);
+ solutionPropertiesSection.Properties.SetValue("HideSolutionNode", "TRUE");
+
+ slnFile.Write();
+
+ File.ReadAllText(tmpFile.Path)
+ .Should().Be(SolutionModified);
+ }
+
+ [Fact]
+ public void WhenGivenAnSolutionWithMissingHeaderItThrows()
+ {
+ var tmpFile = Temp.CreateFile();
+ tmpFile.WriteAllText("Invalid Solution");
+
+ Action action = () =>
+ {
+ SlnFile.Read(tmpFile.Path);
+ };
+
+ action.ShouldThrow()
+ .WithMessage("Invalid format in line 1: File header is missing");
}
}
}