Skip to content

Commit

Permalink
Merge pull request #178 from nils-a/feature/nullable
Browse files Browse the repository at this point in the history
Feature/nullable
  • Loading branch information
nils-a committed Dec 7, 2021
2 parents e52264f + 8c254dd commit 9154dd5
Show file tree
Hide file tree
Showing 230 changed files with 10,401 additions and 10,612 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -51,3 +51,4 @@ docs/input/tasks/*

# Wyam related
config.wyam.*
.idea/
6 changes: 6 additions & 0 deletions global.json
@@ -0,0 +1,6 @@
{
"sdk": {
"version": "6.0.100",
"rollForward": "latestFeature"
}
}
31 changes: 31 additions & 0 deletions recipe.cake
Expand Up @@ -14,11 +14,42 @@ BuildParameters.SetParameters(
repositoryOwner: "cake-contrib",
shouldRunDotNetCorePack: true,
shouldUseDeterministicBuilds: true,
shouldRunDupFinder: false, // dupFinder is missing in 2021.3.0-eap
shouldRunInspectCode: false, // we're shipping a custom version of it below
preferredBuildProviderType: BuildProviderType.GitHubActions,
preferredBuildAgentOperatingSystem: PlatformFamily.Linux);

BuildParameters.PrintParameters(Context);

ToolSettings.SetToolSettings(context: Context);
ToolSettings.SetToolPreprocessorDirectives(
reSharperTools: "#tool nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2021.3.0-eap10&prerelease");

Build.RunDotNetCore();

// additional workaround for https://github.com/cake-contrib/Cake.Recipe/issues/862
// to suppress the --build/--no-build warning that is generated in the default
BuildParameters.Tasks.InspectCodeTask = Task("InspectCode2021")
.WithCriteria(() => BuildParameters.BuildAgentOperatingSystem == PlatformFamily.Windows, "Skipping due to not running on Windows")
.Does<BuildData>(data => RequireTool(ToolSettings.ReSharperTools, () => {
var inspectCodeLogFilePath = BuildParameters.Paths.Directories.InspectCodeTestResults.CombineWithFilePath("inspectcode.xml");
var settings = new InspectCodeSettings() {
SolutionWideAnalysis = true,
OutputFile = inspectCodeLogFilePath,
ArgumentCustomization = x => x.Append("--no-build")
};
if (FileExists(BuildParameters.SourceDirectoryPath.CombineWithFilePath(BuildParameters.ResharperSettingsFileName)))
{
settings.Profile = BuildParameters.SourceDirectoryPath.CombineWithFilePath(BuildParameters.ResharperSettingsFileName);
}
InspectCode(BuildParameters.SolutionFilePath, settings);
// Pass path to InspectCode log file to Cake.Issues.Recipe
IssuesParameters.InputFiles.InspectCodeLogFilePath = inspectCodeLogFilePath;
})
);
BuildParameters.Tasks.AnalyzeTask.IsDependentOn("InspectCode2021");
IssuesBuildTasks.ReadIssuesTask.IsDependentOn("InspectCode2021");
10 changes: 0 additions & 10 deletions src/.idea/.idea.Cake.7zip/.idea/.gitignore

This file was deleted.

1 change: 0 additions & 1 deletion src/.idea/.idea.Cake.7zip/.idea/.name

This file was deleted.

10 changes: 0 additions & 10 deletions src/.idea/.idea.Cake.7zip/.idea/CakeRider.xml

This file was deleted.

4 changes: 0 additions & 4 deletions src/.idea/.idea.Cake.7zip/.idea/encodings.xml

This file was deleted.

8 changes: 0 additions & 8 deletions src/.idea/.idea.Cake.7zip/.idea/indexLayout.xml

This file was deleted.

6 changes: 0 additions & 6 deletions src/.idea/.idea.Cake.7zip/.idea/vcs.xml

This file was deleted.

99 changes: 49 additions & 50 deletions src/Cake.7zip.Tests/Commands/AbstractOutputCommandTests.cs
Expand Up @@ -7,56 +7,55 @@

using Xunit;

namespace Cake.SevenZip.Tests.Commands
namespace Cake.SevenZip.Tests.Commands;

public class AbstractOutputCommandTests
{
public class AbstractOutputCommandTests
[Fact]
public void AbstractOutputCommand_sets_raw_output()
{
var command = new Mock<BaseOutputCommand<IOutput>>();
var parser = new Mock<IOutputParser<IOutput>>();
command.Setup(c => c.OutputParser).Returns(parser.Object);
var expected = new[] { "this", "was", "the", "output" };
var partialMock = command.Object;
string[]? actual = null;
partialMock.RawOutputAction = o => actual = o;

((ICanParseOutput)partialMock).SetRawOutput(expected);

actual.ShouldBeEquivalentTo(expected);
}

[Fact]
public void AbstractOutputCommand_sets_nothing_when_called_with_null()
{
var command = new Mock<BaseOutputCommand<IOutput>>();
var parser = new Mock<IOutputParser<IOutput>>();
command.Setup(c => c.OutputParser).Returns(parser.Object);
var partialMock = command.Object;
string[]? actual = null;
partialMock.RawOutputAction = o => actual = o;

((ICanParseOutput)partialMock).SetRawOutput(null!);

actual.ShouldBeEmpty();
}

[Fact]
public void AbstractOutputCommand_uses_parser_to_set_non_raw_output()
{
[Fact]
public void AbstractOutputCommand_sets_raw_output()
{
var command = new Mock<BaseOutputCommand<IOutput>>();
var parser = new Mock<IOutputParser<IOutput>>();
command.Setup(c => c.OutputParser).Returns(parser.Object);
var expected = new[] { "this", "was", "the", "output" };
var partialMock = command.Object;
string[] actual = null;
partialMock.RawOutputAction = o => actual = o;

((ICanParseOutput)partialMock).SetRawOutput(expected);

actual.ShouldBeEquivalentTo(expected);
}

[Fact]
public void AbstractOutputCommand_sets_nothing_when_called_with_null()
{
var command = new Mock<BaseOutputCommand<IOutput>>();
var parser = new Mock<IOutputParser<IOutput>>();
command.Setup(c => c.OutputParser).Returns(parser.Object);
var partialMock = command.Object;
string[] actual = null;
partialMock.RawOutputAction = o => actual = o;

((ICanParseOutput)partialMock).SetRawOutput(null);

actual.ShouldBeNull();
}

[Fact]
public void AbstractOutputCommand_uses_parser_to_set_non_raw_output()
{
var expected = new Mock<IOutput>();
var command = new Mock<BaseOutputCommand<IOutput>>();
var parser = new Mock<IOutputParser<IOutput>>();
parser.Setup(p => p.Parse(It.IsAny<string[]>())).Returns(expected.Object);
command.Setup(c => c.OutputParser).Returns(parser.Object);
var partialMock = command.Object;
object actual = null;
partialMock.OutputAction = o => actual = o;

((ICanParseOutput)partialMock).SetRawOutput(new string[] { });

actual.ShouldBe(expected.Object);
}
var expected = new Mock<IOutput>();
var command = new Mock<BaseOutputCommand<IOutput>>();
var parser = new Mock<IOutputParser<IOutput>>();
parser.Setup(p => p.Parse(It.IsAny<string[]>())).Returns(expected.Object);
command.Setup(c => c.OutputParser).Returns(parser.Object);
var partialMock = command.Object;
object? actual = null;
partialMock.OutputAction = o => actual = o;

((ICanParseOutput)partialMock).SetRawOutput(new string[] { });

actual.ShouldBe(expected.Object);
}
}
}
43 changes: 21 additions & 22 deletions src/Cake.7zip.Tests/Commands/BenchmarkCommandTests.cs
Expand Up @@ -9,33 +9,32 @@

using Xunit;

namespace Cake.SevenZip.Tests.Commands
namespace Cake.SevenZip.Tests.Commands;

public class BenchmarkCommandTests
{
public class BenchmarkCommandTests
[Theory]
[ClassData(typeof(TestData))]
public void OutputCommand_uses_its_own_parser<T>(BaseOutputCommand<T> command, Type expectedParserType)
where T : IOutput
{
[Theory]
[ClassData(typeof(TestData))]
public void OutputCommand_uses_its_own_parser<T>(BaseOutputCommand<T> command, Type expectedParserType)
where T : IOutput
var actual = command.OutputParser;
actual.ShouldNotBeNull();
actual.ShouldBeOfType(expectedParserType);
}

private class TestData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
var actual = command.OutputParser;
actual.ShouldNotBeNull();
actual.ShouldBeOfType(expectedParserType);
yield return new object[] { new InformationCommand(), typeof(InformationOutputParser) };
yield return new object[] { new TestCommand(), typeof(TestOutputParser) };
yield return new object[] { new HashCommand(), typeof(HashOutputParser) };
}

private class TestData : IEnumerable<object[]>
IEnumerator IEnumerable.GetEnumerator()
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { new InformationCommand(), typeof(InformationOutputParser) };
yield return new object[] { new TestCommand(), typeof(TestOutputParser) };
yield return new object[] { new HashCommand(), typeof(HashOutputParser) };
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
return GetEnumerator();
}
}
}
}
111 changes: 55 additions & 56 deletions src/Cake.7zip.Tests/Commands/CommandExtensionTests.cs
Expand Up @@ -6,62 +6,61 @@

using Xunit;

namespace Cake.SevenZip.Tests.Commands
namespace Cake.SevenZip.Tests.Commands;

public class CommandExtensionTests
{
public class CommandExtensionTests
[Fact]
public void Extension_RequireNotNull_works_for_objects()
{
"".RequireNotNull("boom");

// ok, no throw.
}

[Fact]
public void Extension_RequireNotNull_throws_for_null()
{
object? o = null;
// ReSharper disable once ExpressionIsAlwaysNull
Action action = () => o.RequireNotNull("boom");

action.ShouldThrow<ArgumentException>().Message.ShouldBe("boom");
}

[Fact]
public void Extension_RequireNotNull_does_not_throw_for_alternatives()
{
[Fact]
public void Extension_RequireNotNull_works_for_objects()
{
"".RequireNotNull("boom");

// ok, no throw.
}

[Fact]
public void Extension_RequireNotNull_throws_for_null()
{
object o = null;
// ReSharper disable once ExpressionIsAlwaysNull
Action action = () => o.RequireNotNull("boom");

action.ShouldThrow<ArgumentException>().Message.ShouldBe("boom");
}

[Fact]
public void Extension_RequireNotNull_does_not_throw_for_alternatives()
{
object o = null;

// ReSharper disable once ExpressionIsAlwaysNull
o.RequireNotNull("boom", "");

// ok, no throw.
}

[Fact]
public void Extension_RequireNotEmpty_works_for_enumerables()
{
(new[] { "" }).RequireNotEmpty("boom");

// ok, no throw.
}

[Fact]
public void Extension_RequireNotEmpty_throws_for_empty_enumerables()
{
Action action = () => (new object[] { }).RequireNotEmpty("boom");

action.ShouldThrow<ArgumentException>().Message.ShouldBe("boom");
}

[Fact]
public void Extension_RequireNotEmpty_does_not_throw_for_enumerable_alternatives()
{
// ReSharper disable once CoVariantArrayConversion
(new object[] { }).RequireNotEmpty("boom", new[] { new[] { "" } }); // two arrays, because of the "params-array"

// ok, no throw.
}
object? o = null;

// ReSharper disable once ExpressionIsAlwaysNull
o.RequireNotNull("boom", "");

// ok, no throw.
}

[Fact]
public void Extension_RequireNotEmpty_works_for_enumerables()
{
(new[] { "" }).RequireNotEmpty("boom");

// ok, no throw.
}

[Fact]
public void Extension_RequireNotEmpty_throws_for_empty_enumerables()
{
Action action = () => (new object[] { }).RequireNotEmpty("boom");

action.ShouldThrow<ArgumentException>().Message.ShouldBe("boom");
}

[Fact]
public void Extension_RequireNotEmpty_does_not_throw_for_enumerable_alternatives()
{
// ReSharper disable once CoVariantArrayConversion
(new object[] { }).RequireNotEmpty("boom", new[] { new[] { "" } }); // two arrays, because of the "params-array"

// ok, no throw.
}
}
}

0 comments on commit 9154dd5

Please sign in to comment.