public void GetMedianVariance_returns_correct_variance_count(IEnumerable <string> dataValues, int elementCount)
        {
            //Given
            var settings = new SourceFolderSettings
            {
                LowerVariancePC = 20,
                UpperVariancePC = 20,
                FileFormat      = new FileFormat {
                    Delimiter = ","
                },
                FileTypes = new Dictionary <string, string>()
                {
                    { "TOU", "Energy" }, { "LP", "Data Value" }
                }
            };

            decimal median   = 1;
            string  filePath = "C:\\TOU_123.csv";

            moqFileReaderService.Setup(m => m.InitFileReader(It.IsAny <string>(), It.IsAny <string>())).Verifiable();
            moqFileReaderService.Setup(m => m.FileName).Returns("TOU_123.csv");
            moqFileReaderService.Setup(m => m.IterateFileOnColumn(It.IsAny <string>())).Returns(dataValues);
            moqCalcService.Setup(m => m.GetMedian(It.IsAny <IEnumerable <string> >())).Returns(median);
            moqCalcService.Setup(m => m.IsValueInMedianRange(It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>(), It.IsAny <decimal>())).Returns(true);

            var sut = new DataProcessor(moqCalcService.Object, moqFileReaderService.Object);

            //When
            var actual = sut.GetMedianVariance(filePath, settings);

            //Then
            Assert.IsType <MedianVarianceResult>(actual);
            Assert.Equal(elementCount, actual.VarianceData.Count);
        }
        //[InlineData(new object[] { new string[] { "file1.csv", "file2.csv", "file3.csv" } })]
        public void StartProcess_processes_the_files_from_configured_file_location(IEnumerable <string> filesList)
        {
            //given
            moqFolderManager.Setup(m => m.GetAllFiles(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Dictionary <string, string> >())).Returns(filesList);
            var medianVarianceResult = new MedianVarianceResult(It.IsAny <string>(), It.IsAny <List <VarianceData> >(), new Dictionary <string, string>());

            moqDataProcessor.Setup(m => m.GetMedianVariance(It.IsAny <string>(), It.IsAny <SourceFolderSettings>())).Returns(medianVarianceResult);
            moqOutPutService.Setup(m => m.OutputResult(It.IsAny <MedianVarianceResult>())).Verifiable("called");
            var sut = new MedianManager(moqFolderManager.Object, moqDataProcessor.Object, moqOutPutService.Object);
            var sourceFolderSettings = new SourceFolderSettings()
            {
                FileFormat = new FileFormat()
                {
                    Delimiter = ",", Ext = "*.csv"
                },
                FileTypes = new Dictionary <string, string>()
                {
                    { "TOU", "Energy" },
                    { "LP", "Data Value" }
                },
                Path            = "D:\\sample Files",
                LowerVariancePC = 20,
                UpperVariancePC = 20
            };

            //when
            sut.StartProcess(sourceFolderSettings);

            //then
            moqFolderManager.Verify(v => v.GetAllFiles(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <Dictionary <string, string> >()), Times.Once);
            moqDataProcessor.Verify(v => v.GetMedianVariance(It.IsAny <string>(), It.IsAny <SourceFolderSettings>()), Times.Exactly(filesList.Count()));
            moqOutPutService.Verify(v => v.OutputResult(It.IsAny <MedianVarianceResult>()), Times.Exactly(filesList.Count()));
        }
        public int StartProcess(SourceFolderSettings settings)
        {
            int numberofFilesProcessed = 0;
            //Get all valid files paths from the source folder
            var filePaths = _folderManager.GetAllFiles(settings.Path,
                                                       settings.FileFormat.Ext,
                                                       settings.FileTypes);

            try
            {
                foreach (string filePath in filePaths)
                {
                    var response = _dataProcessor.GetMedianVariance(filePath, settings);

                    if (response != null)
                    {
                        numberofFilesProcessed++;
                    }
                    //print now and move to next file.
                    _outputService.OutputResult(response);
                }
            }
            catch (Exception)
            {
                // Yell    Log    Catch  Throw
            }
            return(numberofFilesProcessed);
        }
        public MedianVarianceResult GetMedianVariance(string filePath, SourceFolderSettings settings)
        {
            //Always good to validate the input parameter in public methods
            if (string.IsNullOrEmpty(filePath) || settings == null)
            {
                return(null);
            }


            var result = PopulateMedianVariance(filePath, settings);

            return(result);
        }
        private MedianVarianceResult PopulateMedianVariance(string filePath, SourceFolderSettings settings)
        {
            //Init file reader so that headers/path/delimiter are pre-populated and saved for later usage
            _fileReaderService.InitFileReader(filePath, settings.FileFormat.Delimiter);

            var result = new MedianVarianceResult
                         (
                _fileReaderService.FileName,
                new List <VarianceData>(),
                settings.FileTypes
                         );


            //Let's calculate the median. Pass in the Data Column Name from Model
            result.Median = _calcService.GetMedian(_fileReaderService.IterateFileOnColumn(result.DataColumnName));

            //Iterate each row now
            foreach (var data in _fileReaderService.IterateFileOnColumn(result.DataColumnName))
            {
                //Move to next iteration as value is not a decimal
                if (!decimal.TryParse(data, out decimal dataValue))
                {
                    continue;
                }

                //Let's find out if our value is within variance range
                bool inRange = _calcService.IsValueInMedianRange(result.Median, dataValue, settings.LowerVariancePC, settings.UpperVariancePC);

                if (inRange)
                {
                    //Populate the date from the line being read
                    //No need to iterate over again as FileReaderService keeps the current line saved
                    var date = _fileReaderService.GetColumnValueFromCurrentLine(result.DateTimeColumnName);
                    result.VarianceData.Add(new VarianceData(date, dataValue));
                }
            }

            return(result);
        }