public void CalculatedMetricReportsErrorWhenProjectionIsNotDouble()
        {
            // ARRANGE
            var metricInfo = new CalculatedMetricInfo()
            {
                Id            = "Metric1",
                TelemetryType = TelemetryType.Request,
                Projection    = "Id",
                Aggregation   = AggregationType.Sum,
                FilterGroups  = new FilterConjunctionGroupInfo[0]
            };

            var telemetry = new RequestTelemetry()
            {
                Id = "NotDoubleValue"
            };

            CollectionConfigurationError[] errors;
            var metric = new CalculatedMetric <RequestTelemetry>(metricInfo, out errors);

            // ACT
            try
            {
                metric.Project(telemetry);
            }
            catch (ArgumentOutOfRangeException e)
            {
                // ASSERT
                Assert.IsTrue(e.ToString().Contains("Id"));
                return;
            }

            Assert.Fail();
        }
        public void CalculatedMetricProjectsCorrectlyWhenTrain()
        {
            // ARRANGE
            var metricInfo = new CalculatedMetricInfo()
            {
                Id            = "Metric1",
                TelemetryType = TelemetryType.Request,
                Projection    = "Context.Operation.Name",
                Aggregation   = AggregationType.Sum,
                FilterGroups  = new FilterConjunctionGroupInfo[0]
            };

            var telemetry = new RequestTelemetry()
            {
                Context = { Operation = { Name = "123.56" } }
            };

            // ACT
            CollectionConfigurationError[] errors;
            var    metric     = new CalculatedMetric <RequestTelemetry>(metricInfo, out errors);
            double projection = metric.Project(telemetry);

            // ASSERT
            Assert.AreEqual(AggregationType.Sum, metric.AggregationType);
            Assert.AreEqual(0, errors.Length);
            Assert.AreEqual(123.56, projection);
        }
        public void CalculatedMetricProjectsCorrectlyWhenTimeSpan()
        {
            // ARRANGE
            var metricInfo = new CalculatedMetricInfo()
            {
                Id            = "Metric1",
                TelemetryType = TelemetryType.Request,
                Projection    = "Duration",
                Aggregation   = AggregationType.Avg,
                FilterGroups  = new FilterConjunctionGroupInfo[0]
            };

            var telemetry = new RequestTelemetry()
            {
                Duration = TimeSpan.FromMilliseconds(120)
            };

            // ACT
            CollectionConfigurationError[] errors;
            var    metric     = new CalculatedMetric <RequestTelemetry>(metricInfo, out errors);
            double projection = metric.Project(telemetry);

            // ASSERT
            Assert.AreEqual(AggregationType.Avg, metric.AggregationType);
            Assert.AreEqual(0, errors.Length);
            Assert.AreEqual(120, projection);
        }
        public void CalculatedMetricProjectsCorrectlyWhenCustomMetric()
        {
            // ARRANGE
            var metricInfo = new CalculatedMetricInfo()
            {
                Id            = "Metric1",
                TelemetryType = TelemetryType.Request,
                Projection    = "CustomMetrics.Metric1",
                Aggregation   = AggregationType.Sum,
                FilterGroups  = new FilterConjunctionGroupInfo[0]
            };

            var telemetry = new RequestTelemetry()
            {
                Metrics = { ["Metric1"] = 1.75d }
            };

            // ACT
            CollectionConfigurationError[] errors;
            var    metric     = new CalculatedMetric <RequestTelemetry>(metricInfo, out errors);
            double projection = metric.Project(telemetry);

            // ASSERT
            Assert.AreEqual(AggregationType.Sum, metric.AggregationType);
            Assert.AreEqual(0, errors.Length);
            Assert.AreEqual(1.75d, projection);
        }