private string CreateGraph(Dictionary <string, string> rawParameters)
        {
            if (_result.Count == 0)
            {
                return(NoDataCaption);
            }
            if (!_compareType.IsNumeric())
            {
                return("no numeric comparison");
            }

            var parameters     = new TimeSeriesGraphParameters(rawParameters);
            var startTimestamp = parameters.StartTimestamp;
            var endTimestamp   = parameters.EndTimestamp;
            // we need to recalculate the boundary values if limits were provided
            var recalculateNeeded = startTimestamp != null || endTimestamp != null;
            var dataSubset        = recalculateNeeded ? _result.Subset(startTimestamp, endTimestamp) : _result;

            if (dataSubset.Count == 0)
            {
                return(NoDataCaption);
            }
            var yDimension = Dimension.GetValueRange(dataSubset.Values, parameters.MinValue, parameters.MaxValue);

            startTimestamp ??= dataSubset.Keys.First();
            endTimestamp ??= dataSubset.Keys.Last();

            var chart = new TimeSeriesChart();

            return(chart.ChartInHtmlFor(
                       dataSubset,
                       new AxisLimits(startTimestamp.Value, endTimestamp.Value, yDimension),
                       new Size(parameters.Width, parameters.Height)
                       ));
        }
        public void TimeSeriesChartVerySmallRangeTest()
        {
            var table = new MeasurementComparisonDictionary();

            var          startTimestamp = DateTime.Today;
            const double minY           = 49.93;
            const double maxY           = 50.02;

            table.Add(startTimestamp, new MeasurementComparisonMock("49.95", "49.95", CompareOutcome.None));
            table.Add(startTimestamp.AddSeconds(1), new MeasurementComparisonMock("50.0", "50.0", CompareOutcome.None));
            // Ading a double NaN to check whether that is ignored
            table.Add(startTimestamp.AddSeconds(2), new MeasurementComparisonMock("NaN", "NaN", CompareOutcome.None));
            var chart        = new TimeSeriesChart();
            var base64Result = chart.ChartInHtmlFor(table,
                                                    new AxisLimits(startTimestamp, startTimestamp.AddSeconds(1), new Dimension(minY, maxY)),
                                                    new Size(800, 600));

            AssertChartImage(base64Result, SmallRangeFile, nameof(TimeSeriesChartVerySmallRangeTest));
        }
        public void TimeSeriesChartMinutesTimeTest()
        {
            var table = new MeasurementComparisonDictionary();

            var          startTimestamp = DateTime.Today;
            const double minY           = -1;
            const double maxY           = 50;

            table.Add(startTimestamp, new MeasurementComparisonMock("49.95", "49.95", CompareOutcome.None));
            table.Add(startTimestamp.AddSeconds(9660), new MeasurementComparisonMock("-0.50", "-0.50", CompareOutcome.None));
            table.Add(startTimestamp.AddSeconds(19320), new MeasurementComparisonMock("3.00", "3.20", CompareOutcome.OutsideToleranceIssue));

            var endTimestamp = table.Last().Key;
            var chart        = new TimeSeriesChart();
            var base64Result = chart.ChartInHtmlFor(table,
                                                    new AxisLimits(startTimestamp, endTimestamp, new Dimension(minY, maxY)),
                                                    new Size(800, 600));

            AssertChartImage(base64Result, MinutesTimeRangeExpectedFile, nameof(TimeSeriesChartMinutesTimeTest));
        }