예제 #1
0
        protected virtual GeckoLineChart BuildLinechartData(LineChartArgs args,
                                                            IEnumerable <LineChartData> sourceData,
                                                            List <DateTime> xAxis,
                                                            GeckoValues yAxis)
        {
            var data = new GeckoLineChart();

            for (var i = 0; i < sourceData.Count(); i++)
            {
                if (i != 0 && (i % args.Sample != 0))
                {
                    continue;
                }

                // start at the newest and work backwards
                var j   = sourceData.Count() - i - 1;
                var lci = sourceData.ElementAt(j);

                xAxis.Add(lci.When);
                yAxis.Add(lci.Value);
                data.Item.Add(Scale(lci.Value,
                                    args.ScaleUp,
                                    args.ScaleDown,
                                    args.DecimalPlaces).ToString());
            }

            // finally reverse the data order oldest->newest
            data.Item.Reverse();
            return(data);
        }
        public void LinechartMinuteCheckRateNoData()
        {
            var args = new LineChartArgs
            {
                MaxItems      = 60,
                Limit         = 60,
                Check         = "Test",
                Unit          = "minute",
                DataOperation = DataOperationType.Count,
                Outcome       = OutcomeType.Any,
                DecimalPlaces = 0,
                EndDate       = new DateTime(2011, 04, 11, 12, 0, 0)
            };

            using (var domain = new GeckoboardDataServiceLinechartDomain(args))
            {
                Feature.WithScenario("There is no minute monitorwang data for the args specified")
                .Given(domain.ThereIsNoData)
                .When(domain.TheLinechartCheckRateMethodIsInvoked)
                .Then(domain.TheResultIsNotNull)
                .And(domain.TheResultSettingsIsNotNull)
                .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems))
                .And(domain.AllTheResultsAreZero)
                .And(domain.TheSettingsXAxisHasThreeValues)
                .And(domain.TheSettingsXAxisHas_AsTheMinValue, "11:01")
                .And(domain.TheSettingsXAxisHas_AsTheMaxValue, "12:00")
                .ExecuteWithReport();
            }
        }
        public void LinechartDayCheckRateNoData()
        {
            var args = new LineChartArgs
            {
                MaxItems      = 20,
                Limit         = 10,
                Check         = "Test",
                Unit          = "day",
                DataOperation = DataOperationType.Count,
                Outcome       = OutcomeType.Any,
                DecimalPlaces = 0,
                EndDate       = new DateTime(2011, 04, 11, 12, 0, 0)
            };

            using (var domain = new GeckoboardDataServiceLinechartDomain(args))
            {
                var xMin = args.EndDate.Subtract(TimeSpan.FromDays(args.Limit - 1));
                xMin = new DateTime(xMin.Year, xMin.Month, xMin.Day, 0, 0, 0);
                var xMax = new DateTime(args.EndDate.Year, args.EndDate.Month, args.EndDate.Day, 0, 0, 0);

                Feature.WithScenario("There is no daily monitorwang data for the args specified")
                .Given(domain.ThereIsNoData)
                .When(domain.TheLinechartCheckRateMethodIsInvoked)
                .Then(domain.TheResultIsNotNull)
                .And(domain.TheResultSettingsIsNotNull)
                .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems))
                .And(domain.AllTheResultsAreZero)
                .And(domain.TheSettingsXAxisHasThreeValues)
                .And(domain.TheSettingsXAxisHas_AsTheMinValue, xMin.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat))
                .And(domain.TheSettingsXAxisHas_AsTheMaxValue, xMax.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat))
                .ExecuteWithReport();
            }
        }
        public void LinechartDayLimitGreaterThanMaxItem()
        {
            var args = new LineChartArgs
            {
                MaxItems      = 10,
                Limit         = 20,
                Check         = "Test",
                Unit          = "day",
                DataOperation = DataOperationType.Count,
                Outcome       = OutcomeType.Any,
                DecimalPlaces = 0,
                EndDate       = new DateTime(2011, 04, 11, 12, 0, 0)
            };

            using (var domain = new GeckoboardDataServiceLinechartDomain(args))
            {
                var xMin = new DateTime(2011, 03, 24, 0, 0, 0);
                var xMax = new DateTime(args.EndDate.Year, args.EndDate.Month, args.EndDate.Day, 0, 0, 0);

                Feature.WithScenario("There are more items requested than the max allowed")
                .Given(domain.ThereIsNoData)
                .When(domain.TheLinechartCheckRateMethodIsInvoked)
                .Then(domain.TheResultIsNotNull)
                .And(domain.TheResultSettingsIsNotNull)
                .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems))
                .And(domain.AllTheResultsAreZero)
                .And(domain.TheSampleIsEvery_Items, 2)
                .And(domain.TheSettingsXAxisHasThreeValues)
                .And(domain.TheSettingsXAxisHas_AsTheMinValue, xMin.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat))
                .And(domain.TheSettingsXAxisHas_AsTheMaxValue, xMax.ToString(GeckoboardDataServiceImpl.Linechart.X_Axis_DateFormat))
                .ExecuteWithReport();
            }
        }
예제 #5
0
        public GeckoLineChart GetGeckoboardLineChartForCheckRate(LineChartArgs args)
        {
            GeckoLineChart data = null;

            try
            {
                var yAxis = new GeckoValues();
                var xAxis = new List <DateTime>();

                CalculateLinechartSample(args);

                DateTime oldestDate;
                DateTime newestDate;
                CalculateLinechartDateRange(args, out oldestDate, out newestDate);

                // get the actual data from the provider and a "zero set" - a set
                // of zero values for the entire date range
                var dbData   = myDataProvider.GetLineChartDataForCheckRate(args);
                var zeroData = GenerateLinechartZeroSet(args, oldestDate, newestDate);
                // merge the two data sets, using the actual data value where
                // available, otherwise use a zero value
                var mergedData = MergeLinechartData(dbData, zeroData);
                data = BuildLinechartData(args, mergedData, xAxis, yAxis);
                CalculateLinechartSettings(args, data, yAxis, xAxis);
            }
            catch (Exception ex)
            {
                Logger.Error(Logger.Event.During("GetGeckoboardLineChartForCheckRate")
                             .Encountered(ex));
                throw;
            }

            return(data);
        }
        public void LinechartMinuteDataCorrectDecimalPlaces()
        {
            var args = new LineChartArgs
            {
                MaxItems      = 10,
                Limit         = 10,
                Check         = "Test",
                Unit          = "minute",
                DataOperation = DataOperationType.Count,
                Outcome       = OutcomeType.Any,
                DecimalPlaces = 2,
                EndDate       = new DateTime(2011, 04, 11, 12, 0, 0)
            };

            using (var domain = new GeckoboardDataServiceLinechartDomain(args))
            {
                var data = new List <LineChartData>
                {
                    new LineChartData
                    {
                        Value = 100.123,
                        When  = args.EndDate.Subtract(TimeSpan.FromMinutes(2))
                    },
                    new LineChartData
                    {
                        Value = 200.123,
                        When  = args.EndDate.Subtract(TimeSpan.FromMinutes(3))
                    },
                    new LineChartData
                    {
                        Value = 1000.123,
                        When  = args.EndDate.Subtract(TimeSpan.FromMinutes(5))
                    },
                };

                Feature.WithScenario("Data values have the correct number of decimal places")
                .Given(domain.ThisDataIsAvailable, data)
                .When(domain.TheLinechartCheckRateMethodIsInvoked)
                .Then(domain.TheResultIsNotNull)
                .And(domain.TheResultSettingsIsNotNull)
                .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems))
                .And(domain.TheSampleIsEvery_Items, 1)
                .And(domain.TheSettingsXAxisHasThreeValues)
                .And(domain.TheSettingsYAxisHasThreeValues)
                .And(domain.TheSettingsYAxisHas_AsTheMinValue, "0")
                .And(domain.TheSettingsYAxisHas_AsTheMaxValue, "1000")
                .And(domain.TheItemAtIndex_Has_Value, 4, "1000.12")
                .And(domain.TheItemAtIndex_Has_Value, 6, "200.12")
                .And(domain.TheItemAtIndex_Has_Value, 7, "100.12")
                .ExecuteWithReport();
            }
        }
        public void LinechartMinuteDataOutsideLimitRange()
        {
            var args = new LineChartArgs
            {
                MaxItems      = 10,
                Limit         = 10,
                Check         = "Test",
                Unit          = "minute",
                DataOperation = DataOperationType.Count,
                Outcome       = OutcomeType.Any,
                DecimalPlaces = 2,
                EndDate       = new DateTime(2011, 04, 11, 12, 0, 0)
            };

            using (var domain = new GeckoboardDataServiceLinechartDomain(args))
            {
                var data = new List <LineChartData>
                {
                    new LineChartData
                    {
                        Value = 100.123,
                        When  = args.EndDate.Subtract(TimeSpan.FromMinutes(2000))
                    },
                    new LineChartData
                    {
                        Value = 200.123,
                        When  = args.EndDate.Subtract(TimeSpan.FromMinutes(3000))
                    },
                    new LineChartData
                    {
                        Value = 1000.123,
                        When  = args.EndDate.Subtract(TimeSpan.FromMinutes(5000))
                    },
                };

                Feature.WithScenario("Minute data is available but outside the requested range")
                .Given(domain.ThisDataIsAvailable, data)
                .When(domain.TheLinechartCheckRateMethodIsInvoked)
                .Then(domain.TheResultIsNotNull)
                .And(domain.TheResultSettingsIsNotNull)
                .And(domain.TheResultContains_Items, Math.Min(args.Limit, args.MaxItems))
                .And(domain.TheSampleIsEvery_Items, 1)
                .And(domain.TheSettingsXAxisHasThreeValues)
                .And(domain.TheSettingsYAxisHasThreeValues)
                .And(domain.TheSettingsYAxisHas_AsTheMinValue, "0")
                .And(domain.TheSettingsYAxisHas_AsTheMaxValue, "0")
                .And(domain.AllTheResultsAreZero)
                .ExecuteWithReport();
            }
        }
예제 #8
0
        protected virtual IEnumerable <LineChartData> GenerateLinechartZeroSet(LineChartArgs args, DateTime oldestDate, DateTime newestDate)
        {
            const double value = 0;
            var          data  = new List <LineChartData>();

            switch (args.Unit.ToLowerInvariant())
            {
            case "day":
                for (var i = args.Limit - 1; i >= 0; i--)
                {
                    var baseDate = newestDate.Subtract(TimeSpan.FromDays(i));
                    data.Add(new LineChartData
                    {
                        Value = value,
                        When  = new DateTime(baseDate.Year, baseDate.Month, baseDate.Day)
                    });
                }
                break;

            case "hour":
                for (var i = args.Limit - 1; i >= 0; i--)
                {
                    var baseDate = newestDate.Subtract(TimeSpan.FromHours(i));
                    data.Add(new LineChartData
                    {
                        Value = value,
                        When  = new DateTime(baseDate.Year, baseDate.Month, baseDate.Day,
                                             baseDate.Hour, 0, 0)
                    });
                }
                break;

            default:
                for (var i = args.Limit - 1; i >= 0; i--)
                {
                    var baseDate = newestDate.Subtract(TimeSpan.FromMinutes(i));
                    data.Add(new LineChartData
                    {
                        Value = value,
                        When  = new DateTime(baseDate.Year, baseDate.Month, baseDate.Day,
                                             baseDate.Hour, baseDate.Minute, 0)
                    });
                }
                break;
            }

            return(data);
        }
예제 #9
0
        protected void CalculateLinechartSample(LineChartArgs args)
        {
            if ((args.Limit / args.Sample) <= args.MaxItems)
            {
                return;
            }

            var s         = (Convert.ToDouble(args.Limit) / Convert.ToDouble(args.MaxItems));
            var newSample = Math.Ceiling(s);

            args.Sample = Convert.ToInt32(newSample);

            Logger.Debug("Calculated sample freq. based on {0} limit: sample every {1} items",
                         args.Limit,
                         args.Sample);
        }
예제 #10
0
        protected void CalculateLinechartSettings(LineChartArgs args,
                                                  GeckoLineChart data,
                                                  GeckoValues yAxis,
                                                  List <DateTime> xAxis)
        {
            var minY = args.ScaleY
                           ? Scale(yAxis.Min(), args.ScaleUp, args.ScaleDown, args.ScaleYDecimalPlaces)
                           : Scale(yAxis.Min(), 1, 1, args.ScaleYDecimalPlaces);
            var midY = args.ScaleY
                           ? Scale(yAxis.Mid(), args.ScaleUp, args.ScaleDown, args.ScaleYDecimalPlaces)
                           : Scale(yAxis.Mid(), 1, 1, args.ScaleYDecimalPlaces);
            var maxY = args.ScaleY
                           ? Scale(yAxis.Max(), args.ScaleUp, args.ScaleDown, args.ScaleYDecimalPlaces)
                           : Scale(yAxis.Max(), 1, 1, args.ScaleYDecimalPlaces);

            var colourKey = string.Format("linechart.{0}.{1}", args.Site, args.Check);

            data.Settings.Colour = myColourPicker.Next(colourKey).ToString();
            data.Settings.Y.Add(minY.ToString());
            data.Settings.Y.Add(midY.ToString());
            data.Settings.Y.Add(maxY.ToString());

            var minDate = xAxis.Min();
            var maxDate = xAxis.Max();

            if (maxDate.Subtract(minDate).TotalDays < 1)
            {
                data.Settings.X.Add(minDate.ToShortTimeString());
                data.Settings.X.Add(minDate.AddMinutes(
                                        maxDate.Subtract(minDate).TotalMinutes / 2).ToShortTimeString());
                data.Settings.X.Add(maxDate.ToShortTimeString());
            }
            else
            {
                var midMins = maxDate.Subtract(minDate).TotalMinutes / 2;
                var midDate = maxDate.Subtract(TimeSpan.FromMinutes(midMins));


                data.Settings.X.Add(minDate.ToString(Linechart.X_Axis_DateFormat));
                data.Settings.X.Add(midDate.ToString(Linechart.X_Axis_DateFormat));
                data.Settings.X.Add(maxDate.ToString(Linechart.X_Axis_DateFormat));
            }
        }
예제 #11
0
        /// <summary>
        /// This will calculate the date range we are generating the linechart for
        /// </summary>
        /// <param name="args"></param>
        /// <param name="oldestDate"></param>
        /// <param name="newestDate"></param>
        /// <returns></returns>
        protected void CalculateLinechartDateRange(LineChartArgs args, out DateTime oldestDate, out DateTime newestDate)
        {
            newestDate = args.EndDate;

            // work out the range
            switch (args.Unit.ToLowerInvariant())
            {
            case "day":
                oldestDate = newestDate.Subtract(TimeSpan.FromDays(args.Limit));
                break;

            case "hour":
                oldestDate = newestDate.Subtract(TimeSpan.FromHours(args.Limit));
                break;

            default:
                oldestDate = newestDate.Subtract(TimeSpan.FromMinutes(args.Limit));
                break;
            }
        }
 public GeckoboardDataServiceLinechartDomain(LineChartArgs args)
     : this()
 {
     myArgs = args;
 }