diff --git a/CliFx.Tests/CliApplicationTests.cs b/CliFx.Tests/CliApplicationTests.cs index 74c8ca3..6d7bf9b 100644 --- a/CliFx.Tests/CliApplicationTests.cs +++ b/CliFx.Tests/CliApplicationTests.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; -using System.Threading.Tasks; +using System.Threading.Tasks; using CliFx.Services; using CliFx.Tests.TestObjects; -using Moq; using NUnit.Framework; namespace CliFx.Tests @@ -17,11 +15,13 @@ namespace CliFx.Tests var command = new TestCommand(); var expectedExitCode = await command.ExecuteAsync(); - var commandResolverMock = new Mock(); - commandResolverMock.Setup(m => m.ResolveCommand(It.IsAny>())).Returns(command); - var commandResolver = commandResolverMock.Object; + var commandOptionParser = new CommandOptionParser(); - var application = new CliApplication(commandResolver); + var typeProvider = new TypeProvider(typeof(TestCommand)); + var commandOptionConverter = new CommandOptionConverter(); + var commandResolver = new CommandResolver(typeProvider, commandOptionConverter); + + var application = new CliApplication(commandOptionParser, commandResolver); // Act var exitCodeValue = await application.RunAsync(); diff --git a/CliFx.Tests/CliFx.Tests.csproj b/CliFx.Tests/CliFx.Tests.csproj index 4e246c7..6bd5873 100644 --- a/CliFx.Tests/CliFx.Tests.csproj +++ b/CliFx.Tests/CliFx.Tests.csproj @@ -8,10 +8,9 @@ - - - - + + + diff --git a/CliFx.Tests/CommandOptionConverterTests.cs b/CliFx.Tests/CommandOptionConverterTests.cs index 81f2ebb..3d3ab09 100644 --- a/CliFx.Tests/CommandOptionConverterTests.cs +++ b/CliFx.Tests/CommandOptionConverterTests.cs @@ -11,7 +11,7 @@ namespace CliFx.Tests [TestFixture] public class CommandOptionConverterTests { - private static IEnumerable GetData_ConvertOption() + private static IEnumerable GetTestCases_ConvertOption() { yield return new TestCaseData( new CommandOption("option", "value"), @@ -171,7 +171,7 @@ namespace CliFx.Tests } [Test] - [TestCaseSource(nameof(GetData_ConvertOption))] + [TestCaseSource(nameof(GetTestCases_ConvertOption))] public void ConvertOption_Test(CommandOption option, Type targetType, object expectedConvertedValue) { // Arrange @@ -181,10 +181,13 @@ namespace CliFx.Tests var convertedValue = converter.ConvertOption(option, targetType); // Assert - Assert.That(convertedValue, Is.EqualTo(expectedConvertedValue)); + Assert.Multiple(() => + { + Assert.That(convertedValue, Is.EqualTo(expectedConvertedValue)); - if (convertedValue != null) - Assert.That(convertedValue, Is.AssignableTo(targetType)); + if (convertedValue != null) + Assert.That(convertedValue, Is.AssignableTo(targetType)); + }); } } } \ No newline at end of file diff --git a/CliFx.Tests/CommandOptionParserTests.cs b/CliFx.Tests/CommandOptionParserTests.cs index f7f3af3..1167be5 100644 --- a/CliFx.Tests/CommandOptionParserTests.cs +++ b/CliFx.Tests/CommandOptionParserTests.cs @@ -8,7 +8,7 @@ namespace CliFx.Tests [TestFixture] public class CommandOptionParserTests { - private static IEnumerable GetData_ParseOptions() + private static IEnumerable GetTestCases_ParseOptions() { yield return new TestCaseData(new string[0], CommandOptionSet.Empty); @@ -154,7 +154,7 @@ namespace CliFx.Tests } [Test] - [TestCaseSource(nameof(GetData_ParseOptions))] + [TestCaseSource(nameof(GetTestCases_ParseOptions))] public void ParseOptions_Test(IReadOnlyList commandLineArguments, CommandOptionSet expectedCommandOptionSet) { // Arrange @@ -164,17 +164,20 @@ namespace CliFx.Tests var optionSet = parser.ParseOptions(commandLineArguments); // Assert - Assert.That(optionSet.CommandName, Is.EqualTo(expectedCommandOptionSet.CommandName), "Command name"); - Assert.That(optionSet.Options.Count, Is.EqualTo(expectedCommandOptionSet.Options.Count), "Option count"); - - for (var i = 0; i < optionSet.Options.Count; i++) + Assert.Multiple(() => { - Assert.That(optionSet.Options[i].Name, Is.EqualTo(expectedCommandOptionSet.Options[i].Name), - $"Option[{i}] name"); + Assert.That(optionSet.CommandName, Is.EqualTo(expectedCommandOptionSet.CommandName), "Command name"); + Assert.That(optionSet.Options.Count, Is.EqualTo(expectedCommandOptionSet.Options.Count), "Option count"); - Assert.That(optionSet.Options[i].Values, Is.EqualTo(expectedCommandOptionSet.Options[i].Values), - $"Option[{i}] values"); - } + for (var i = 0; i < optionSet.Options.Count; i++) + { + Assert.That(optionSet.Options[i].Name, Is.EqualTo(expectedCommandOptionSet.Options[i].Name), + $"Option[{i}] name"); + + Assert.That(optionSet.Options[i].Values, Is.EqualTo(expectedCommandOptionSet.Options[i].Values), + $"Option[{i}] values"); + } + }); } } } \ No newline at end of file diff --git a/CliFx.Tests/CommandResolverTests.cs b/CliFx.Tests/CommandResolverTests.cs index fcd38bd..1be1d25 100644 --- a/CliFx.Tests/CommandResolverTests.cs +++ b/CliFx.Tests/CommandResolverTests.cs @@ -3,7 +3,6 @@ using CliFx.Exceptions; using CliFx.Models; using CliFx.Services; using CliFx.Tests.TestObjects; -using Moq; using NUnit.Framework; namespace CliFx.Tests @@ -11,7 +10,7 @@ namespace CliFx.Tests [TestFixture] public class CommandResolverTests { - private static IEnumerable GetData_ResolveCommand() + private static IEnumerable GetTestCases_ResolveCommand() { yield return new TestCaseData( new CommandOptionSet(new[] @@ -48,34 +47,28 @@ namespace CliFx.Tests } [Test] - [TestCaseSource(nameof(GetData_ResolveCommand))] + [TestCaseSource(nameof(GetTestCases_ResolveCommand))] public void ResolveCommand_Test(CommandOptionSet commandOptionSet, TestCommand expectedCommand) { // Arrange - var commandTypes = new[] {typeof(TestCommand)}; - - var typeProviderMock = new Mock(); - typeProviderMock.Setup(m => m.GetTypes()).Returns(commandTypes); - var typeProvider = typeProviderMock.Object; - - var optionParserMock = new Mock(); - optionParserMock.Setup(m => m.ParseOptions(It.IsAny>())).Returns(commandOptionSet); - var optionParser = optionParserMock.Object; - + var typeProvider = new TypeProvider(typeof(TestCommand)); var optionConverter = new CommandOptionConverter(); - var resolver = new CommandResolver(typeProvider, optionParser, optionConverter); + var resolver = new CommandResolver(typeProvider, optionConverter); // Act - var command = resolver.ResolveCommand() as TestCommand; + var command = resolver.ResolveCommand(commandOptionSet) as TestCommand; // Assert - Assert.That(command, Is.Not.Null); - Assert.That(command.StringOption, Is.EqualTo(expectedCommand.StringOption), nameof(command.StringOption)); - Assert.That(command.IntOption, Is.EqualTo(expectedCommand.IntOption), nameof(command.IntOption)); + Assert.Multiple(() => + { + Assert.That(command, Is.Not.Null); + Assert.That(command.StringOption, Is.EqualTo(expectedCommand.StringOption), nameof(command.StringOption)); + Assert.That(command.IntOption, Is.EqualTo(expectedCommand.IntOption), nameof(command.IntOption)); + }); } - private static IEnumerable GetData_ResolveCommand_IsRequired() + private static IEnumerable GetTestCases_ResolveCommand_IsRequired() { yield return new TestCaseData(CommandOptionSet.Empty); @@ -88,26 +81,17 @@ namespace CliFx.Tests } [Test] - [TestCaseSource(nameof(GetData_ResolveCommand_IsRequired))] + [TestCaseSource(nameof(GetTestCases_ResolveCommand_IsRequired))] public void ResolveCommand_IsRequired_Test(CommandOptionSet commandOptionSet) { // Arrange - var commandTypes = new[] {typeof(TestCommand)}; - - var typeProviderMock = new Mock(); - typeProviderMock.Setup(m => m.GetTypes()).Returns(commandTypes); - var typeProvider = typeProviderMock.Object; - - var optionParserMock = new Mock(); - optionParserMock.Setup(m => m.ParseOptions(It.IsAny>())).Returns(commandOptionSet); - var optionParser = optionParserMock.Object; - + var typeProvider = new TypeProvider(typeof(TestCommand)); var optionConverter = new CommandOptionConverter(); - var resolver = new CommandResolver(typeProvider, optionParser, optionConverter); + var resolver = new CommandResolver(typeProvider, optionConverter); // Act & Assert - Assert.Throws(() => resolver.ResolveCommand()); + Assert.Throws(() => resolver.ResolveCommand(commandOptionSet)); } } } \ No newline at end of file diff --git a/CliFx/CliApplication.cs b/CliFx/CliApplication.cs index 75414d2..24ce922 100644 --- a/CliFx/CliApplication.cs +++ b/CliFx/CliApplication.cs @@ -7,25 +7,26 @@ namespace CliFx { public partial class CliApplication : ICliApplication { + private readonly ICommandOptionParser _commandOptionParser; private readonly ICommandResolver _commandResolver; - public CliApplication(ICommandResolver commandResolver) + public CliApplication(ICommandOptionParser commandOptionParser, ICommandResolver commandResolver) { + _commandOptionParser = commandOptionParser; _commandResolver = commandResolver; } public CliApplication() - : this(GetDefaultCommandResolver(Assembly.GetCallingAssembly())) + : this(new CommandOptionParser(), GetDefaultCommandResolver(Assembly.GetCallingAssembly())) { } public async Task RunAsync(IReadOnlyList commandLineArguments) { - // Resolve and execute command - var command = _commandResolver.ResolveCommand(commandLineArguments); - var exitCode = await command.ExecuteAsync(); + var optionSet = _commandOptionParser.ParseOptions(commandLineArguments); + var command = _commandResolver.ResolveCommand(optionSet); - // TODO: print message if error? + var exitCode = await command.ExecuteAsync(); return exitCode.Value; } @@ -36,10 +37,9 @@ namespace CliFx private static ICommandResolver GetDefaultCommandResolver(Assembly assembly) { var typeProvider = TypeProvider.FromAssembly(assembly); - var commandOptionParser = new CommandOptionParser(); var commandOptionConverter = new CommandOptionConverter(); - return new CommandResolver(typeProvider, commandOptionParser, commandOptionConverter); + return new CommandResolver(typeProvider, commandOptionConverter); } } } \ No newline at end of file diff --git a/CliFx/Services/CommandResolver.cs b/CliFx/Services/CommandResolver.cs index 698a41b..ef9d1c1 100644 --- a/CliFx/Services/CommandResolver.cs +++ b/CliFx/Services/CommandResolver.cs @@ -11,14 +11,11 @@ namespace CliFx.Services public class CommandResolver : ICommandResolver { private readonly ITypeProvider _typeProvider; - private readonly ICommandOptionParser _commandOptionParser; private readonly ICommandOptionConverter _commandOptionConverter; - public CommandResolver(ITypeProvider typeProvider, - ICommandOptionParser commandOptionParser, ICommandOptionConverter commandOptionConverter) + public CommandResolver(ITypeProvider typeProvider, ICommandOptionConverter commandOptionConverter) { _typeProvider = typeProvider; - _commandOptionParser = commandOptionParser; _commandOptionConverter = commandOptionConverter; } @@ -71,10 +68,8 @@ namespace CliFx.Services $"Apply {nameof(CommandAttribute)} to give command a name."); } - public Command ResolveCommand(IReadOnlyList commandLineArguments) + public Command ResolveCommand(CommandOptionSet optionSet) { - var optionSet = _commandOptionParser.ParseOptions(commandLineArguments); - // Get command type var commandType = !optionSet.CommandName.IsNullOrWhiteSpace() ? GetCommandType(optionSet.CommandName) diff --git a/CliFx/Services/Extensions.cs b/CliFx/Services/Extensions.cs deleted file mode 100644 index c391a19..0000000 --- a/CliFx/Services/Extensions.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace CliFx.Services -{ - public static class Extensions - { - public static Command ResolveCommand(this ICommandResolver commandResolver) => commandResolver.ResolveCommand(new string[0]); - } -} \ No newline at end of file diff --git a/CliFx/Services/ICommandResolver.cs b/CliFx/Services/ICommandResolver.cs index 76e8407..1b3b4d0 100644 --- a/CliFx/Services/ICommandResolver.cs +++ b/CliFx/Services/ICommandResolver.cs @@ -1,9 +1,9 @@ -using System.Collections.Generic; +using CliFx.Models; namespace CliFx.Services { public interface ICommandResolver { - Command ResolveCommand(IReadOnlyList commandLineArguments); + Command ResolveCommand(CommandOptionSet optionSet); } } \ No newline at end of file diff --git a/Readme.md b/Readme.md index 23430f8..f7f0039 100644 --- a/Readme.md +++ b/Readme.md @@ -26,7 +26,6 @@ To be added with a stable release... ## Libraries used -- [Moq](https://github.com/Moq/moq4) - [NUnit](https://github.com/nunit/nunit) ## Donate