public async Task <ValidationResult> ValidateTextAnalysisInputAsync(TextAnalysisInput textAnalysisInput)
        {
            // Null objects are not handled by Fluent Validation so it has to be handled first
            if (textAnalysisInput == null)
            {
                return(new ValidationResult("VE_TextAnalysisInput_NotNull_001", "TextAnalysisInput should NOT be NULL"));
            }

            if (textAnalysisInput.Text == null)
            {
                return(new ValidationResult("VE_TextAnalysisInput_Text_NotNull_001", "Text should NOT be NULL"));
            }

            if (textAnalysisInput.Subtext == null)
            {
                return(new ValidationResult("VE_TextAnalysisInput_Subtext_NotNull_001", "Subtext should NOT be NULL"));
            }

            // Fluent Validation
            var fluentValidationResult = await _textAnalysisInputValidator.ValidateAsync(textAnalysisInput);

            // Mapping through extension methods
            var validationResult = fluentValidationResult.MapToValidationResultModel();

            return(validationResult);
        }
        [InlineData("Polly put the kettle on, polly put the kettle on, poLLy put the kettle on we'll all have tea", "XX")] // another invalid text and subtext
        public async void GetCharacterPositionsAsync_InputIsValid_XX_NaResult(string text, string subtext)
        {
            // Arrange
            var textAnalysisInput = new TextAnalysisInput()
            {
                Text    = text,
                Subtext = subtext
            };

            var validationResult = _fixture.Build <ValidationResult>().Create();

            validationResult.IsValid = true;

            _validationService
            .Setup(svc => svc.ValidateTextAnalysisInputAsync(It.IsAny <TextAnalysisInput>()))
            .ReturnsAsync(validationResult);

            // Act
            var result = await _characterPositionsService.GetCharacterPositionsAsync(textAnalysisInput);

            // Assert
            result.Should().NotBeNull();
            result.Count.Should().Be(1);

            var characterPositionNA = result.Find(x => x.Mark.Equals("N/A"));

            characterPositionNA.Should().NotBeNull();
        }
        public async Task <string> PostAsync([FromBody] TextAnalysisInput textAnalysisInput)
        {
            // Using Dependency Injected service
            var result = await _characterPositionsService.GetCharacterPositionsAsync(textAnalysisInput);

            string jsonResult = JsonConvert.SerializeObject(result, Formatting.Indented);

            return(jsonResult);
        }
        /// <summary>
        /// Main entry point for the Controller to get Character Positions.
        /// </summary>
        /// <param name="textAnalysisInput">Input for Text Analysis.</param>
        /// <returns>Character Position List or Error List.</returns>
        public async Task <List <CharacterPosition> > GetCharacterPositionsAsync(TextAnalysisInput textAnalysisInput)
        {
            var validationResult = await _validationService.ValidateTextAnalysisInputAsync(textAnalysisInput);

            if (!validationResult.IsValid)
            {
                return(validationResult.MapToCharacterPositionListModel());
            }

            var positionsIntCollection = GetMatchedSubtextPositions(textAnalysisInput.Text, textAnalysisInput.Subtext);

            positionsIntCollection.Sort();

            return(positionsIntCollection.MapToCharacterPositionListModel());
        }
        [InlineData(null, null)]  // yet another valid text and subtext
        public async void ValidateTextAnalysisInputAsync_InputIsInValid_ValidationFails(string text, string subtext)
        {
            // Arrange
            var textAnalysisInput = new TextAnalysisInput()
            {
                Text    = text,
                Subtext = subtext
            };

            // Act
            var validationResult = await _validationService.ValidateTextAnalysisInputAsync(textAnalysisInput);

            // Assert
            validationResult.Should().NotBeNull();
            validationResult.IsValid.Should().BeFalse();
        }
        [InlineData("asdf", "df")]       // yet another valid text and subtext
        public async void ValidateTextAnalysisInputAsync_InputIsValid_ValidationSucceeds(string text, string subtext)
        {
            // Arrange
            var textAnalysisInput = new TextAnalysisInput()
            {
                Text    = text,
                Subtext = subtext
            };

            // Act
            var validationResult = await _textAnalysisValidator.ValidateAsync(textAnalysisInput);

            // Assert
            validationResult.Should().NotBeNull();
            validationResult.IsValid.Should().BeTrue();
        }
        [InlineData("Polly put the kettle on, polly put the kettle on, poLLy put the kettle on we'll all have tea", "lL")] // another valid text and subtext
        public async void GetCharacterPositionsAsync_InputIsValid_LL_OkResult(string text, string subtext)
        {
            // Arrange
            var textAnalysisInput = new TextAnalysisInput()
            {
                Text    = text,
                Subtext = subtext
            };

            var validationResult = _fixture.Build <ValidationResult>().Create();

            validationResult.IsValid = true;

            _validationService
            .Setup(svc => svc.ValidateTextAnalysisInputAsync(It.IsAny <TextAnalysisInput>()))
            .ReturnsAsync(validationResult);

            // Act
            var result = await _characterPositionsService.GetCharacterPositionsAsync(textAnalysisInput);

            // Assert
            result.Should().NotBeNull();
            result.Count.Should().Be(5);

            // 3, 28, 53, 78, 82
            var characterPosition3 = result.Find(x => x.Mark.Equals("3"));

            characterPosition3.Should().NotBeNull();

            var characterPosition28 = result.Find(x => x.Mark.Equals("28"));

            characterPosition28.Should().NotBeNull();

            var characterPosition53 = result.Find(x => x.Mark.Equals("53"));

            characterPosition53.Should().NotBeNull();

            var characterPosition78 = result.Find(x => x.Mark.Equals("78"));

            characterPosition78.Should().NotBeNull();

            var characterPosition82 = result.Find(x => x.Mark.Equals("82"));

            characterPosition82.Should().NotBeNull();
        }