예제 #1
0
        // It's possible for the user to provide arguments that conflict with each other. This method throws
        // exceptions in these cases.
        public static bool ValidateArgumentsModel(ArgumentsModel argumentsModel)
        {
            // Respond with "how to use" if no arguments are provided.
            if (!argumentsModel.NumberProvided && !argumentsModel.MathFact && !argumentsModel.TriviaFact && !argumentsModel.RandomNumber)
            {
                throw new ArgumentException(ErrorConstants.HOW_TO_USE);
            }

            // Make sure we didn't both provide a number and request a random one
            if (argumentsModel.NumberProvided && argumentsModel.RandomNumber)
            {
                throw new ArgumentException(ErrorConstants.BOTH_RANDOM_AND_NUMBER_PROVIDED);
            }

            // Make sure we either were given a number or a random number was requested.
            if (!argumentsModel.NumberProvided && !argumentsModel.RandomNumber)
            {
                throw new ArgumentException(ErrorConstants.NEITHER_RANDOM_OR_NUMBER_PROVIDED);
            }

            // Make sure we're not requesting both a math fact and a trivia fact.
            if (argumentsModel.MathFact && argumentsModel.TriviaFact)
            {
                throw new ArgumentException(ErrorConstants.BOTH_MATH_AND_TRIVIA_FACT_PROVIDED);
            }

            // Make sure we're making a request for either a trivia or a math fact.
            if (!argumentsModel.MathFact && !argumentsModel.TriviaFact)
            {
                throw new ArgumentException(ErrorConstants.NEITHER_MATH_OR_TRIVIA_FACT_PROVIDED);
            }

            return(true);
        }
        public ActionResult <double> Post([FromBody] ArgumentsModel model)
        {
            double?result = null;

            if (model == null)
            {
                return(BadRequest("Неверно указаны аргументы"));
            }

            switch (model.Operation)
            {
            case "sum":
                result = CalculatorFunctions.Sum(model.FirstDigit, model.SecondDigit);
                break;

            case "multiply":
                result = CalculatorFunctions.Multiply(model.FirstDigit, model.SecondDigit);
                break;

            //TODO: Добавление новых операций
            default:
                return(BadRequest("Неправильно указана операция"));
            }

            return(result);
        }
예제 #3
0
 public Dumper(ISource source, IDestination destination, ConsoleLifetime hostLifetime, ILogger <Dumper> logger, ArgumentsModel model)
 {
     _source       = source;
     _destination  = destination;
     _hostLifetime = hostLifetime;
     _logger       = logger;
     _model        = model;
 }
        public ZipDestination(ArgumentsModel model, ILogger <ZipDestination> logger)
        {
            _logger = logger;
            _logger.LogDebug("Writing to zip file at {File}", model.Input);

            FileStream zipFs = File.Create(model.Output);

            _zip = new ZipArchive(zipFs, ZipArchiveMode.Create);
        }
        public void ShouldThrowExceptionWhenInvalidArgumentIsPassedIn()
        {
            // Arrange
            string[] args = new string[3] {
                "33", "/m", "sdflkjdsfs"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);
        }
        public void ShouldThrowExceptionIfNumberIsNotFirstArgument()
        {
            // Arrange
            string[] args = new string[2] {
                "/m", "33"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);
        }
예제 #7
0
 // Returns either an endpoint with the user's number or the "random" endpoint.
 private static string NumberOrRandomNumberEndpoint(ArgumentsModel argumentsModel)
 {
     if (argumentsModel.RandomNumber)
     {
         return(APIConstants.RANDOM_NUMBER);
     }
     else
     {
         return(argumentsModel.Number.ToString());
     }
 }
예제 #8
0
 // Returns endpoint for either a math or trivia fact.
 private static string MathOrTriviaFactEndpoint(ArgumentsModel argumentsModel)
 {
     if (argumentsModel.MathFact)
     {
         return(APIConstants.MATH_FACT);
     }
     else
     {
         return(APIConstants.TRIVIA_FACT);
     }
 }
        public ArgumentsModel Build()
        {
            ArgumentsModel argumentsModel = new ArgumentsModel();

            argumentsModel.Number         = _number;
            argumentsModel.NumberProvided = _numberProvided;
            argumentsModel.RandomNumber   = _randomNumber;
            argumentsModel.MathFact       = _mathFact;
            argumentsModel.TriviaFact     = _triviaFact;

            return(argumentsModel);
        }
예제 #10
0
        public void ShouldCreateEmptyModel()
        {
            // Arrange / Act
            ArgumentsModel argumentsModel = new ArgumentsModel();

            // Assert
            Assert.AreEqual(0, argumentsModel.Number);
            Assert.AreEqual(false, argumentsModel.RandomNumber);
            Assert.AreEqual(false, argumentsModel.MathFact);
            Assert.AreEqual(false, argumentsModel.TriviaFact);
            Assert.AreEqual(false, argumentsModel.NumberProvided);
        }
        public void ShouldReturnURLForProvidedNumberTriviaFact()
        {
            // Arrange
            ArgumentsModelBuilder argumentsModelBuilder = new ArgumentsModelBuilder();
            ArgumentsModel        argumentsModel        = argumentsModelBuilder.WithNumber(33).WithTriviaFact().Build();

            // Act
            string endpointUrl = NumfactsAPIClient.BuildAPIEndpointUrl(argumentsModel);

            // Assert
            Assert.AreEqual($"https://numbersapi.p.rapidapi.com/33/trivia", endpointUrl);
        }
        public void ShouldReturnURLForRandomNumberMathFact()
        {
            // Arrange
            ArgumentsModelBuilder argumentsModelBuilder = new ArgumentsModelBuilder();
            ArgumentsModel        argumentsModel        = argumentsModelBuilder.WithRandomNumber().WithMathFact().Build();

            // Act
            string endpointUrl = NumfactsAPIClient.BuildAPIEndpointUrl(argumentsModel);

            // Assert
            Assert.AreEqual($"https://numbersapi.p.rapidapi.com/random/math", endpointUrl);
        }
        public void ShouldThrowExceptionWhenTriviaFactIsProvidedButNumberIsNot()
        {
            // Arrange
            string[] args = new string[1] {
                "/t"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);

            // Assert
            bool modelIsValid = ArgumentsHandler.ValidateArgumentsModel(argumentsModel);
        }
        public void ShouldThrowExceptionWhenBothMathAndTriviaFactsAreRequested()
        {
            // Arrange
            string[] args = new string[2] {
                "/m", "/t"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);

            // Assert
            bool modelIsValid = ArgumentsHandler.ValidateArgumentsModel(argumentsModel);
        }
        public void ShouldThrowExceptionWhenBothNumberAndRandomNumberAreRequested()
        {
            // Arrange
            string[] args = new string[2] {
                "33", "/r"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);

            // Assert
            bool modelIsValid = ArgumentsHandler.ValidateArgumentsModel(argumentsModel);
        }
예제 #16
0
        public void ShouldHoldRandomNumberBooleanAndMathFactBoolean()
        {
            ArgumentsModel argumentsModel = new ArgumentsModel();

            argumentsModel.RandomNumber = true;
            argumentsModel.MathFact     = true;
            argumentsModel.TriviaFact   = false;

            Assert.AreEqual(true, argumentsModel.RandomNumber);
            Assert.AreEqual(true, argumentsModel.MathFact);
            Assert.AreEqual(false, argumentsModel.TriviaFact);
            Assert.AreEqual(false, argumentsModel.NumberProvided);
        }
        public void ShouldCreateModelWithSingleIntegerArgument()
        {
            // Arrange
            string[] args = new string[1] {
                "33"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);

            // Assert
            Assert.AreEqual(33, argumentsModel.Number);
            Assert.IsTrue(argumentsModel.NumberProvided);
        }
예제 #18
0
        public void ShouldCreateModelWithBuilderDefaults()
        {
            // Arrange
            ArgumentsModelBuilder argumentsModelBuilder = new ArgumentsModelBuilder();

            // Act
            ArgumentsModel argumentsModel = argumentsModelBuilder.Build();

            // Assert
            Assert.AreEqual(int.MinValue, argumentsModel.Number);
            Assert.AreEqual(false, argumentsModel.RandomNumber);
            Assert.AreEqual(false, argumentsModel.MathFact);
            Assert.AreEqual(false, argumentsModel.TriviaFact);
        }
        public void ShouldConsiderModelValidWithRandomNumberAndTriviaFact()
        {
            // Arrange
            string[] args = new string[2] {
                "/r", "/t"
            };
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);

            // Act
            bool modelIsValid = ArgumentsHandler.ValidateArgumentsModel(argumentsModel);

            // Assert
            Assert.IsTrue(modelIsValid);
        }
예제 #20
0
        public AmqpDestination(ArgumentsModel model, ILogger <AmqpDestination> logger)
        {
            _model  = model;
            _logger = logger;

            Uri amqpUri = new Uri(model.Output);

            _logger.LogDebug("Connecting to AMQP for writing at {Uri}", amqpUri);

            UriConnectionFactory connectionFactory = new UriConnectionFactory(amqpUri);

            _connection = connectionFactory.CreateConnection();
            _channel    = _connection.CreateModel();
        }
예제 #21
0
        public AmqpSource(ArgumentsModel model, ILogger <AmqpSource> logger)
        {
            _model     = model;
            _logger    = logger;
            _remaining = model.MessageLimit ?? -1;

            Uri amqpUri = new Uri(model.Input);

            _logger.LogDebug("Connecting to AMQP for reading at {Uri}", amqpUri);

            UriConnectionFactory connectionFactory = new UriConnectionFactory(amqpUri);

            _connection = connectionFactory.CreateConnection();
            _channel    = _connection.CreateModel();
        }
        public void ParameterAdd(string text, object value, SqlVariables var, SqlDirections direction = SqlDirections.Input)
        {
            if (string.IsNullOrEmpty(text))
            {
                throw new ArgumentNullException(EntitierStrings.MustProvideName);
            }
            var model = new ArgumentsModel {
                Text = text, Value = value, Var = var, Directions = direction
            };

            if (_parameters == null)
            {
                _parameters = new List <ArgumentsModel>();
            }
            _parameters.Add(model);
        }
예제 #23
0
        public void ShouldCreateModelWithNumber()
        {
            // Arrange
            ArgumentsModelBuilder argumentsModelBuilder = new ArgumentsModelBuilder();

            argumentsModelBuilder.WithNumber(33);

            // Act
            ArgumentsModel argumentsModel = argumentsModelBuilder.Build();

            // Assert
            Assert.AreEqual(33, argumentsModel.Number);
            Assert.IsTrue(argumentsModel.NumberProvided);
            Assert.AreEqual(false, argumentsModel.RandomNumber);
            Assert.AreEqual(false, argumentsModel.MathFact);
            Assert.AreEqual(false, argumentsModel.TriviaFact);
        }
        public void ShouldCreateModelWithAllPossibleArguments()
        {
            // Arrange
            string[] args = new string[4] {
                "33", "/r", "/m", "/t"
            };

            // Act
            ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(args);

            // Assert
            Assert.AreEqual(33, argumentsModel.Number);
            Assert.IsTrue(argumentsModel.RandomNumber);
            Assert.IsTrue(argumentsModel.MathFact);
            Assert.IsTrue(argumentsModel.TriviaFact);
            Assert.IsTrue(argumentsModel.NumberProvided);
        }
예제 #25
0
        public void ShouldCreateModelWithTriviaFactBoolean()
        {
            // Arrange
            ArgumentsModelBuilder argumentsModelBuilder = new ArgumentsModelBuilder();

            argumentsModelBuilder.WithTriviaFact();

            // Act
            ArgumentsModel argumentsModel = argumentsModelBuilder.Build();

            // Assert
            Assert.AreEqual(int.MinValue, argumentsModel.Number);
            Assert.IsFalse(argumentsModel.NumberProvided);
            Assert.AreEqual(false, argumentsModel.RandomNumber);
            Assert.AreEqual(false, argumentsModel.MathFact);
            Assert.AreEqual(true, argumentsModel.TriviaFact);
        }
예제 #26
0
        public static ArgumentsModel CreateArgumentsModelFromUserInput(string[] args)
        {
            // Create the model builder and begin the building process. Check for errors along the way.
            ArgumentsModelBuilder argumentsModelBuilder = new ArgumentsModelBuilder();

            // Loop through each argument and add it to the builder
            for (int i = 0; i < args.Length; i++)
            {
                // If this is the first argument, try to parse it as an integer.
                if (i == 0)
                {
                    bool numberSuccessfullyParsed = int.TryParse(args[i], out int passedInNumber);

                    if (numberSuccessfullyParsed)
                    {
                        argumentsModelBuilder.WithNumber(passedInNumber);
                        continue;
                    }
                }

                // Check for valid options and update model build accordingly.
                switch (args[i])
                {
                case FlagConstants.RANDOM_NUMBER_FLAG:
                    argumentsModelBuilder.WithRandomNumber();
                    break;

                case FlagConstants.MATH_FACT_FLAG:
                    argumentsModelBuilder.WithMathFact();
                    break;

                case FlagConstants.TRIVIA_FACT_FLAG:
                    argumentsModelBuilder.WithTriviaFact();
                    break;

                default:
                    throw new ArgumentException(ErrorConstants.INVALID_INPUT + args[i]);
                }
            }

            ArgumentsModel argumentsModel = argumentsModelBuilder.Build();

            return(argumentsModel);
        }
예제 #27
0
        public void ShouldHoldNumberIntegerAndMathFactBoolean()
        {
            // Arrange
            ArgumentsModel argumentsModel = new ArgumentsModel();

            // Act
            argumentsModel.Number         = 33;
            argumentsModel.NumberProvided = true;
            argumentsModel.RandomNumber   = false;
            argumentsModel.MathFact       = true;
            argumentsModel.TriviaFact     = false;

            // Assert
            Assert.AreEqual(33, argumentsModel.Number);
            Assert.AreEqual(false, argumentsModel.RandomNumber);
            Assert.AreEqual(true, argumentsModel.MathFact);
            Assert.AreEqual(false, argumentsModel.TriviaFact);
            Assert.AreEqual(true, argumentsModel.NumberProvided);
        }
예제 #28
0
        static void Main(string[] args)
        {
            try
            {
                ArgumentsModel arguments = ArgumentsParser.Parse(args);

                HttpListener listener = new HttpListener(Console.Out,
                                                         arguments.WebsiteDirectory,
                                                         arguments.IP,
                                                         arguments.Port);
                listener.ListenLoop();
            }
            catch (Exception exc)
            {
                Console.WriteLine(" >>Error: " + exc.Message);
                Console.WriteLine(" >>Press enter to exit");
                Console.ReadLine();
            }
        }
예제 #29
0
        public static void Main(string[] args)
        {
            try
            {
                // Make sure the arguments are properly split apart before creating the argument model.
                string[] splitArgs = ArgumentsHandler.BreakApartArguments(args);

                // Create arguments model from passed in arguments.
                ArgumentsModel argumentsModel = ArgumentsHandler.CreateArgumentsModelFromUserInput(splitArgs);

                // Validate the arguments model before making the API request.
                ArgumentsHandler.ValidateArgumentsModel(argumentsModel);

                // Notify the user that we're about to make an API request.
                Console.WriteLine(OutputConstants.API_LOADING);

                // Make the API request.
                NumfactsAPIClient numfactsAPIClient = new NumfactsAPIClient(
                    new RestClient(
                        NumfactsAPIClient.BuildAPIEndpointUrl(argumentsModel)
                        )
                    );

                APIResponseModel apiResponseModel = numfactsAPIClient.GetNumFact();

                // Display the results to the user.
                if (apiResponseModel.Found)
                {
                    Console.WriteLine(OutputConstants.FACT_DISPLAY_TEMPLATE, MathOrTriviaFactPrefix(apiResponseModel), apiResponseModel.Number, apiResponseModel.Text);
                }
                else
                {
                    throw new Exception(ErrorConstants.NO_FACT_FOUND + apiResponseModel.Number);
                }
            } catch (Exception ex)
            {
                // Display the error to the user.
                Console.WriteLine(ex.Message);
            }
        }
예제 #30
0
 // Returns the endpoint url we need based upon the user's arguments.
 public static string BuildAPIEndpointUrl(ArgumentsModel argumentsModel)
 {
     return($"{APIConstants.BASE_URL}/{NumberOrRandomNumberEndpoint(argumentsModel)}/{MathOrTriviaFactEndpoint(argumentsModel)}");
 }