public void Run(IEnumerable <string> arguments, IFluentConsoleApplication application) { dynamic packedArguments = new ExpandoObject(); var keyValueArguments = packedArguments as IDictionary <string, object>; // Add current application as part of the arguments keyValueArguments.Add("Application", application); // Add parameters as fields and associate provided values var parametersEnumerator = DefinedCommand.Parameters.GetEnumerator(); var argumentsEnumerator = arguments.GetEnumerator(); while (parametersEnumerator.MoveNext() && argumentsEnumerator.MoveNext()) { var currentParameter = parametersEnumerator.Current; var argumentType = currentParameter.Type; var argumentName = currentParameter.Name; var argumentValue = Convert.ChangeType(currentParameter.GetValue(argumentsEnumerator.Current), argumentType); keyValueArguments.Add(argumentName, argumentValue); } // Run Action(packedArguments); }
public DefinedCommand(IFluentConsoleApplication application, string commandName, string commandDescription) { Application = application; Name = commandName; Description = commandDescription; Parameters = Enumerable.Empty <IDefinedParameter>(); }
public void FluentConsoleApplication_CommandsWithImpliedParsingDelegate_TotalOfCalculation() { // ARRANGE var numberA = 5; var numberB = 2; long sum = 0; double product = 0; IFluentConsoleApplication app = FluentConsoleApplication.Create("Calculator", "Use this application for math.") .DefineCommand("add", "Add two numbers") .WithParameter <int>("X", "First operand") .WithParameter <long>("Y", "Second operand") .Does(args => sum = args.X + args.Y) .DefineCommand("mult", "Multiply two numbers") .WithParameter <double>("X", "First operand") .WithParameter <decimal>("Y", "Second operand") .Does(args => product = args.X * (double)args.Y); // ACT // Emulate user input app.Run($"add {numberA} {numberB}"); app.Run($"mult {numberA} {numberB}"); // ASSERT sum.Should().Be(numberA + numberB); product.Should().BeApproximately(numberA * numberB, precision: 0.01); }
public void FluentConsoleApplication_CommandsFullyDefinedRunWithTokens_ExpectedResults() { // ARRANGE var numberA = 5; var numberB = 2; int sum = 0; double product = 0; IFluentConsoleApplication app = FluentConsoleApplication.Create("Calculator", "Use this application for math.") .DefineCommand("add", "Add two numbers") .WithParameter <int>("X", "First operand", input => int.Parse(input)) .WithParameter <int>("Y", "Second operand", input => int.Parse(input)) .Does(args => sum = args.X + args.Y) .DefineCommand("mult", "Multiply two numbers") .WithParameter <double>("X", "First operand", input => double.Parse(input)) .WithParameter <double>("Y", "Second operand", input => double.Parse(input)) .Does(args => product = args.X * args.Y); // ACT // Emulate user input app.Run(new string[] { "add", numberA.ToString(), numberB.ToString() }); app.Run(new string[] { "mult", numberA.ToString(), numberB.ToString() }); // ASSERT sum.Should().Be(numberA + numberB); product.Should().BeApproximately(numberA * numberB, precision: 0.01); }
public void FluentConsoleApplication_MethodsInvokedWithoutAnyDescriptionProvided_ExpectedResults() { // ARRANGE var numberA = 5; var numberB = 2; int sum = 0; double product = 0; IFluentConsoleApplication app = FluentConsoleApplication.Create("Calculator") .DefineCommand("add") .WithParameter("X", input => int.Parse(input)) .WithParameter <int>("Y", input => int.Parse(input)) .Does(args => sum = args.X + args.Y) .DefineCommand("mult") .WithParameter <double>("X") .WithParameter("Y", input => double.Parse(input)) .Does(args => product = args.X * args.Y); // ACT // Emulate user input app.Run($"add {numberA} {numberB}"); app.Run($"mult {numberA} {numberB}"); // ASSERT sum.Should().Be(numberA + numberB); product.Should().BeApproximately(numberA * numberB, precision: 0.01); }
/// <summary> /// Define a command for a <see cref="IFluentConsoleApplication"/>. /// </summary> /// <param name="application">Application to add the command being defined</param> /// <param name="commandName">Command's name</param> /// <param name="commandDescription">Command's description</param> /// <returns></returns> public static IDefinedCommand DefineCommand(this IFluentConsoleApplication application, string commandName, string commandDescription = null) { return(new DefinedCommand(application, commandName, commandDescription)); }
public FluentConsoleApplication(IFluentConsoleApplication application, IRunnableCommand command) : this(application.Name, application.Description) { RunnableCommands = application.RunnableCommands.Concat(new[] { command }); }