diff --git a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/GlobalJsonBuilderTests.cs b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/GlobalJsonBuilderTests.cs index 7e6dcb59..89e34d6f 100644 --- a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/GlobalJsonBuilderTests.cs +++ b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/GlobalJsonBuilderTests.cs @@ -280,4 +280,36 @@ public async Task CreateAsync_WithoutOptionalSettings_OnlyIncludesVersion( // Assert _ = await Assert.That(content).Contains("\"version\""); } + + [Test] + [Arguments("")] + [Arguments(" ")] + public async Task SetRuntimeSdk_WithEmptyOrWhitespace_ThrowsArgumentException(string runtimeVersion) + { + // Arrange + await using var directory = new TemporaryDirectoryBuilder(); + await using var builder = new GlobalJsonBuilder(directory, Constants.RuntimeSdkDefault); + + // Act + void Act() => builder.SetRuntimeSdk(runtimeVersion); + + // Assert + _ = Assert.Throws(Act); + } + + [Test] + public async Task CreateAsync_WithCanceledToken_ThrowsOperationCanceledException() + { + // Arrange + await using var directory = new TemporaryDirectoryBuilder(); + await using var builder = new GlobalJsonBuilder(directory, Constants.RuntimeSdkDefault); + using var cts = new CancellationTokenSource(); + await cts.CancelAsync(); + + // Act + async Task Act() => await builder.CreateAsync(cts.Token); + + // Assert + _ = await Assert.ThrowsAsync(Act); + } } diff --git a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectBuilderExtensionsTests.cs b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectBuilderExtensionsTests.cs index 0057ee70..9c01a3ed 100644 --- a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectBuilderExtensionsTests.cs +++ b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectBuilderExtensionsTests.cs @@ -217,4 +217,66 @@ public async Task AddVBFile_WritesContentToFile(CancellationToken cancellationTo // Assert _ = await Assert.That(fileContent).IsEqualTo(content); } + + [Test] + public async Task AddVBFile_WithEmptyFileName_ThrowsArgumentException() + { + // Arrange + await using var directory = new TemporaryDirectoryBuilder(); + await using var builder = new ProjectBuilder(directory, Constants.VBNetProjectFileName); + var fileName = string.Empty; + const string content = "Public Class Program End Class"; + + // Act + void Act() => builder.AddVBFile(fileName, content); + + // Assert + _ = Assert.Throws(Act); + } + + [Test] + public async Task AddVBFile_WithWhitespaceFileName_ThrowsArgumentException() + { + // Arrange + await using var directory = new TemporaryDirectoryBuilder(); + await using var builder = new ProjectBuilder(directory, Constants.VBNetProjectFileName); + const string content = "Public Class Program End Class"; + + // Act + void Act() => builder.AddVBFile(" ", content); + + // Assert + _ = Assert.Throws(Act); + } + + [Test] + public async Task AddVBFile_WithEmptyContent_ThrowsArgumentException() + { + // Arrange + await using var directory = new TemporaryDirectoryBuilder(); + await using var builder = new ProjectBuilder(directory, Constants.VBNetProjectFileName); + const string fileName = "Program"; + var content = string.Empty; + + // Act + void Act() => builder.AddVBFile(fileName, content); + + // Assert + _ = Assert.Throws(Act); + } + + [Test] + public async Task AddVBFile_WithWhitespaceContent_ThrowsArgumentException() + { + // Arrange + await using var directory = new TemporaryDirectoryBuilder(); + await using var builder = new ProjectBuilder(directory, Constants.VBNetProjectFileName); + const string fileName = "Program"; + + // Act + void Act() => builder.AddVBFile(fileName, " "); + + // Assert + _ = Assert.Throws(Act); + } } diff --git a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectFactoryExtensionsTests.cs b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectFactoryExtensionsTests.cs new file mode 100644 index 00000000..bf11c312 --- /dev/null +++ b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/ProjectFactoryExtensionsTests.cs @@ -0,0 +1,44 @@ +namespace NetEvolve.ProjectBuilders.Tests.Unit.Builders; + +using System; +using System.Threading.Tasks; +using NetEvolve.ProjectBuilders.Abstractions; +using NetEvolve.ProjectBuilders.Builders; + +public class ProjectFactoryExtensionsTests +{ + [Test] + [Arguments("")] + [Arguments(" ")] + public async Task AddGlobalJson_WithEmptyOrWhitespaceRuntimeVersion_ThrowsArgumentException(string runtimeVersion) + { + // Arrange + await using var factory = ProjectFactory.Create(); + + // Act + void Act() => factory.AddGlobalJson(runtimeVersion); + + // Assert + _ = Assert.Throws(Act); + } + + [Test] + public async Task AddGlobalJson_WithConfigure_InvokesCallbackWithGlobalJsonBuilder() + { + // Arrange + await using var factory = ProjectFactory.Create(); + IGlobalJsonBuilder? received = null; + var calls = 0; + + // Act + _ = factory.AddGlobalJson(configure: gb => + { + calls++; + received = gb; + }); + + // Assert + _ = await Assert.That(calls).IsEqualTo(1); + _ = await Assert.That(received).IsNotNull().And.IsTypeOf(); + } +} diff --git a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/SubdirectoryBuilderTests.cs b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/SubdirectoryBuilderTests.cs index 778a93f5..45919e0d 100644 --- a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/SubdirectoryBuilderTests.cs +++ b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/SubdirectoryBuilderTests.cs @@ -90,7 +90,8 @@ public async Task CreateFile_WithExistingFileName_ThrowsArgumentException() void Act() => _ = subdirectory.CreateFile("file.txt"); // Assert - _ = Assert.Throws(Act); + var ex = Assert.Throws(Act); + _ = await Assert.That(ex.Message).Contains("file.txt").And.Contains("already exists"); } [Test] diff --git a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/TemporaryDirectoryBuilderTests.cs b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/TemporaryDirectoryBuilderTests.cs index 06c2276e..917358dc 100644 --- a/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/TemporaryDirectoryBuilderTests.cs +++ b/tests/NetEvolve.ProjectBuilders.Tests.Unit/Builders/TemporaryDirectoryBuilderTests.cs @@ -36,7 +36,8 @@ public async Task CreateFile_WithExistingFileName_ThrowsArgumentException() void Act() => directory.CreateFile(fileName); // Assert - _ = Assert.Throws(Act); + var ex = Assert.Throws(Act); + _ = await Assert.That(ex.Message).Contains(fileName).And.Contains("already exists"); } [Test]