Example #1
0
        public float Calculate(CrossSectionDataModel data)
        {
            ValidateData(data);

            MeasurePoint second       = data.MeasurePoints[1];
            float        startSection = second.Depth * second.DistanceFromInitialPoint / 8 * (second.Velocity.Average() * _riverBankFlowFactor);

            MeasurePoint beforeLast = data.MeasurePoints[data.MeasurePoints.Length - 1];
            float        endSection = beforeLast.Depth * (data.MeasurePoints.Last().DistanceFromInitialPoint - beforeLast.DistanceFromInitialPoint) / 8 * (beforeLast.Velocity.Average() * _riverBankFlowFactor);

            float discharge = startSection + endSection;

            for (var i = 1; i < data.MeasurePoints.Length - 1; i++)
            {
                MeasurePoint previous = data.MeasurePoints[i - 1];
                MeasurePoint next     = data.MeasurePoints[i + 1];

                float sectionWidth     = next.DistanceFromInitialPoint - previous.DistanceFromInitialPoint;
                float sectionArea      = sectionWidth / 2 * data.MeasurePoints[i].Depth;
                float sectionDischarge = data.MeasurePoints[i].Velocity.Average() * sectionArea;
                discharge += sectionDischarge;
            }

            return(discharge);
        }
Example #2
0
        public void CalculatorShouldReturnCorrectResult(CrossSectionDataModel data, int allowedErrors, float expectedResult, float expectedAccuracy)
        {
            var calculator = new DividedCrossSectionMethod(1, allowedErrors);

            float result = calculator.Calculate(data);

            Assert.AreEqual(expectedResult, result);
            Assert.AreEqual(expectedAccuracy, data.ReadAccuracy);
        }
Example #3
0
        public void CalculatorValidateDataShouldThrowFloodingException(CrossSectionDataModel data)
        {
            var calculator = new DividedCrossSectionMethod();

            Assert.Throws <FloodingException>(() =>
            {
                calculator.ValidateData(data);
            });
        }
Example #4
0
        public void CalculatorValidateDataShouldThrowExceptionIfMissingData(CrossSectionDataModel data)
        {
            var calculator = new DividedCrossSectionMethod();

            Assert.Throws <ArgumentException>(() =>
            {
                calculator.ValidateData(data);
            });
        }
Example #5
0
        public void CalculatorValidateDataShouldThrowExceptionIfWrongMeasurement(CrossSectionDataModel data)
        {
            var calculator = new DividedCrossSectionMethod();
            var ex         = Assert.Throws <Exception>(() =>
            {
                calculator.ValidateData(data);
            });

            Assert.AreEqual(ex.Message, "Measurements order disruption");
        }
Example #6
0
        public void ValidateData(CrossSectionDataModel data)
        {
            if (data?.MeasurePoints == null)
            {
                throw new ArgumentException("Missing data", nameof(MeasurePoint));
            }

            data.MeasurePoints = data.MeasurePoints
                                 .Where(x => x != null)
                                 .OrderBy(x => x.OrderId).ToArray();

            if (data.MeasurePoints.Length < 3)
            {
                throw new ArgumentException("Missing data", nameof(MeasurePoint));
            }

            MeasurePoint last  = data.MeasurePoints.Last();
            MeasurePoint first = data.MeasurePoints.First();
            IEnumerable <MeasurePoint> failedMeasures = data.MeasurePoints
                                                        .Where(x => x.OrderId > first.OrderId && x.OrderId < last.OrderId && (Math.Abs(x.Velocity.Average()) < 0.0001 || Math.Abs(x.DistanceFromInitialPoint) < 0.0001)).ToArray();

            data.MeasurePoints = data.MeasurePoints.Except(failedMeasures).ToArray();

            if (first.Depth > 0 || last.Depth > 0)
            {
                throw new FloodingException("Flooding alarm");
            }

            if (failedMeasures.Count() > _allowedErrors)
            {
                throw new ArgumentException("Incomplete data", nameof(MeasurePoint));
            }

            float lastDistance = -1;

            foreach (MeasurePoint measurePoint in data.MeasurePoints)
            {
                if (measurePoint.DistanceFromInitialPoint <= lastDistance)
                {
                    throw new Exception("Measurements order disruption");
                }
                lastDistance = measurePoint.DistanceFromInitialPoint;
            }

            data.ReadAccuracy = failedMeasures.Any()
                            ? 100 - failedMeasures.Count() / (float)data.MeasurePoints.Length * 100
                            : 100;
        }
Example #7
0
        public void DataProcessorShouldSaveDataIfNoException()
        {
            Mock.Get(_dischargeCalculator)
            .Setup(x => x.Calculate(It.IsAny <CrossSectionDataModel>()))
            .Returns(1);
            Mock.Get(_methodFactory)
            .Setup(x => x.SelectCalculator(It.IsAny <string>(), It.IsAny <ISettings>()))
            .Returns(_dischargeCalculator);

            CrossSectionDataModel data = GetDataMock();

            GetProcessor().ProcessIncomingData(data);

            Mock.Get(_repository).Verify(x => x.SaveReading(data, It.IsAny <float>()), Times.Once);
            Mock.Get(_logger).Verify(x => x.Error(It.IsAny <Exception>()), Times.Never);
        }
Example #8
0
        public void DataProcessorShouldNotAlarmIfSettingIsOffOnlyLogWarning()
        {
            Mock.Get(_settings).SetupGet(x => x.AlarmFlooding).Returns(false);
            Mock.Get(_dischargeCalculator)
            .Setup(x => x.Calculate(It.IsAny <CrossSectionDataModel>()))
            .Throws <FloodingException>();
            Mock.Get(_methodFactory)
            .Setup(x => x.SelectCalculator(It.IsAny <string>(), It.IsAny <ISettings>()))
            .Returns(_dischargeCalculator);

            CrossSectionDataModel data = GetDataMock();

            GetProcessor().ProcessIncomingData(data);

            Mock.Get(_repository).Verify(x => x.SaveReading(data, It.IsAny <float>()), Times.Once);
            Mock.Get(_logger).Verify(x => x.Error(It.IsAny <FloodingException>()), Times.Never);
            Mock.Get(_logger).Verify(x => x.Warn(It.IsAny <FloodingException>()), Times.Once);
        }
Example #9
0
 public void ValidateData(CrossSectionDataModel data)
 {
     throw new NotImplementedException();
 }
Example #10
0
 public float Calculate(CrossSectionDataModel data)
 {
     throw new NotImplementedException();
 }