//[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 void OutputResult(MedianVarianceResult result)
        {
            //Always good to validate the input parameter in public methods
            if (result == null)
            {
                return;
            }

            foreach (var row in result.VarianceData)
            {
                Console.WriteLine($"{result.FileName} {row.Date} {row.Value} {result.Median}");
            }
        }
        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);
        }