From dcf313c11939361d6a3bc1e86fda8d91a41337bb Mon Sep 17 00:00:00 2001 From: Christian Siewert Date: Tue, 18 Nov 2025 16:56:38 +0100 Subject: [PATCH] Add tests for finding solution files and update code accordingly --- global.json | 6 -- src/Moryx.Cli.Templates/Solution.cs | 19 +++-- .../Templates/SolutionTests/SolutionTests.cs | 85 +++++++++++++++++++ 3 files changed, 97 insertions(+), 13 deletions(-) delete mode 100644 global.json create mode 100644 src/Tests/Moryx.Cli.Tests/Templates/SolutionTests/SolutionTests.cs diff --git a/global.json b/global.json deleted file mode 100644 index 1a058b2..0000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "sdk": { - "version": "8.0.300", - "rollForward": "disable" - } -} diff --git a/src/Moryx.Cli.Templates/Solution.cs b/src/Moryx.Cli.Templates/Solution.cs index 3d0acea..97e0c50 100644 --- a/src/Moryx.Cli.Templates/Solution.cs +++ b/src/Moryx.Cli.Templates/Solution.cs @@ -14,19 +14,24 @@ public static void Assert(string dir, Action then, Action onErro public static string GetSolutionName(string dir, Action onError) { - var files = Directory.GetFiles(dir, "*.slnx"); - if (files.Length == 0) + return GetSolutionName(Directory.GetFiles(dir, "*.sln*"), onError); + } + + public static string GetSolutionName(string[] files, Action onError) + { + string[] filteredFiles = [.. files.Where(f => f.EndsWith(".slnx"))]; + if (filteredFiles.Length == 0) { - files = Directory.GetFiles(dir, "*.sln"); + filteredFiles = [.. files.Where(f => f.EndsWith(".sln"))]; } - if (files.Length > 1) + if (filteredFiles.Length > 0) { - if (files.Length == 1) + if (filteredFiles.Length == 1) { - return Path.GetFileNameWithoutExtension(files[0]); + return Path.GetFileNameWithoutExtension(filteredFiles[0]); } - if (files.Length > 1) + if (filteredFiles.Length > 1) { onError("Too many _solutions_ found. Please make sure, there is only one solution."); return ""; diff --git a/src/Tests/Moryx.Cli.Tests/Templates/SolutionTests/SolutionTests.cs b/src/Tests/Moryx.Cli.Tests/Templates/SolutionTests/SolutionTests.cs new file mode 100644 index 0000000..1eeea45 --- /dev/null +++ b/src/Tests/Moryx.Cli.Tests/Templates/SolutionTests/SolutionTests.cs @@ -0,0 +1,85 @@ +using Moq; +using Moryx.Cli.Templates; +using Moryx.Cli.Templates.Models; +using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser; + +namespace Moryx.Cli.Tests.Templates.SolutionTests +{ + public class SolutionTests + { + private const string SlnFilename = "Project1.sln"; + private const string SlnxFilename = "Project1x.slnx"; + private TemplateConfiguration _templateConfiguration = new(); + private Template _template; + + [SetUp] + public void Setup() + { + var settingsMock = new Mock(); + settingsMock.SetupGet(m => m.SourceDirectory).Returns(DummyFileList.SourceDir()); + } + + [Test] + public void SingleSlnFileWillReturnFilename() + { + string[] files = [SlnFilename, "Class1.cs"]; + + var result = Solution.GetSolutionName(files, Assert.Fail); + + Assert.That(result, Is.EqualTo("Project1")); + } + + [Test] + public void SingleSlnxFileWillReturnFilename() + { + string[] files = [SlnxFilename, "Class1.cs"]; + + var result = Solution.GetSolutionName(files, Assert.Fail); + + Assert.That(result, Is.EqualTo("Project1x")); + } + + [Test] + public void SingleSlnAndSingleSlnxCanCoexistPrioritizingSlnx() + { + string[] files = [SlnxFilename, SlnFilename]; + + var result = Solution.GetSolutionName(files, Assert.Fail); + + Assert.That(result, Is.EqualTo("Project1x")); + } + + [Test] + public void MultipleSlnFilesWillResultInError() + { + string[] files = [SlnFilename, "Project2.sln", "Project3.sln"]; + var errorDelegate = new Mock>(); + + var result = Solution.GetSolutionName(files, errorDelegate.Object); + + errorDelegate.Verify(m => m("Too many _solutions_ found. Please make sure, there is only one solution."), Times.Once); + } + + [Test] + public void MultipleSlnxFilesWillResultInError() + { + string[] files = [SlnxFilename, "Project2.slnx", "Project3.slnx"]; + var errorDelegate = new Mock>(); + + var result = Solution.GetSolutionName(files, errorDelegate.Object); + + errorDelegate.Verify(m => m("Too many _solutions_ found. Please make sure, there is only one solution."), Times.Once); + } + + [Test] + public void NoSlnOrSlnxFilesWillResultInError() + { + string[] files = ["Class1.cs", "Class2.cs"]; + var errorDelegate = new Mock>(); + + var result = Solution.GetSolutionName(files, errorDelegate.Object); + + errorDelegate.Verify(m => m("No _solutions_ found. Please make sure, there is a VisualStudio solution in this directory."), Times.Once); + } + } +}