public void SeriesCountLimit()
        {
            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           1000,
                    valuesPerDimensionLimit:    100,
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(-1));
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(0));

                Assert.AreEqual(100, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(100, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(100, config.GetValuesPerDimensionLimit(10));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(11));
            }
            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           1000,
                    valuesPerDimensionLimits:   new[] { 42 },
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(-1));
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(0));

                Assert.AreEqual(42, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(42, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(42, config.GetValuesPerDimensionLimit(10));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(11));
            }
            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           1000,
                    valuesPerDimensionLimits:   new[] { 11, 12, 13, 14 },
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(-1));
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(0));

                Assert.AreEqual(11, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(12, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(13, config.GetValuesPerDimensionLimit(3));
                Assert.AreEqual(14, config.GetValuesPerDimensionLimit(4));
                Assert.AreEqual(14, config.GetValuesPerDimensionLimit(6));
                Assert.AreEqual(14, config.GetValuesPerDimensionLimit(10));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(11));
            }
            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           1000,
                    valuesPerDimensionLimits:   new[] { 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21 },
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(-1));
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(0));

                Assert.AreEqual(11, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(12, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(13, config.GetValuesPerDimensionLimit(3));
                Assert.AreEqual(14, config.GetValuesPerDimensionLimit(4));
                Assert.AreEqual(15, config.GetValuesPerDimensionLimit(5));
                Assert.AreEqual(16, config.GetValuesPerDimensionLimit(6));
                Assert.AreEqual(17, config.GetValuesPerDimensionLimit(7));
                Assert.AreEqual(18, config.GetValuesPerDimensionLimit(8));
                Assert.AreEqual(19, config.GetValuesPerDimensionLimit(9));
                Assert.AreEqual(20, config.GetValuesPerDimensionLimit(10));

                Assert.ThrowsException <ArgumentOutOfRangeException>(() => config.GetValuesPerDimensionLimit(11));
            }
        }
        public void Ctor()
        {
            {
                var config = new MetricConfiguration(
                    seriesCountLimit: 1000,
                    valuesPerDimensionLimit: 100,
                    seriesConfig: new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));
                Assert.IsFalse(config.ApplyDimensionCapping);
            }

            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           1000,
                    valuesPerDimensionLimit:    100,
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));
                Assert.IsNotNull(config);
                Assert.AreEqual(1000, config.SeriesCountLimit);
                Assert.AreEqual(100, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(100, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(100, config.GetValuesPerDimensionLimit(10));
                Assert.IsNotNull(config.SeriesConfig);
                Assert.IsInstanceOfType(config.SeriesConfig, typeof(MetricSeriesConfigurationForMeasurement));
                Assert.AreEqual(false, config.SeriesConfig.RequiresPersistentAggregation);
                Assert.AreEqual(false, ((MetricSeriesConfigurationForMeasurement)config.SeriesConfig).RestrictToUInt32Values);
            }
            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           1,
                    valuesPerDimensionLimit:    0,
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: true));
                Assert.IsNotNull(config);
                Assert.AreEqual(1, config.SeriesCountLimit);
                Assert.AreEqual(0, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(0, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(0, config.GetValuesPerDimensionLimit(10));
                Assert.IsNotNull(config.SeriesConfig);
                Assert.IsInstanceOfType(config.SeriesConfig, typeof(MetricSeriesConfigurationForMeasurement));
                Assert.AreEqual(false, config.SeriesConfig.RequiresPersistentAggregation);
                Assert.AreEqual(true, ((MetricSeriesConfigurationForMeasurement)config.SeriesConfig).RestrictToUInt32Values);
            }
            {
                var config = new MetricConfiguration(
                    seriesCountLimit:           Int32.MaxValue,
                    valuesPerDimensionLimit:    Int32.MaxValue,
                    seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false));
                Assert.IsNotNull(config);
                Assert.AreEqual(Int32.MaxValue, config.SeriesCountLimit);
                Assert.AreEqual(Int32.MaxValue, config.GetValuesPerDimensionLimit(1));
                Assert.AreEqual(Int32.MaxValue, config.GetValuesPerDimensionLimit(2));
                Assert.AreEqual(Int32.MaxValue, config.GetValuesPerDimensionLimit(10));
                Assert.IsNotNull(config.SeriesConfig);
                Assert.IsInstanceOfType(config.SeriesConfig, typeof(MetricSeriesConfigurationForMeasurement));
                Assert.AreEqual(false, config.SeriesConfig.RequiresPersistentAggregation);
                Assert.AreEqual(false, ((MetricSeriesConfigurationForMeasurement)config.SeriesConfig).RestrictToUInt32Values);
            }
            {
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => new MetricConfiguration(
                                                                         seriesCountLimit:           0,
                                                                         valuesPerDimensionLimit:    100,
                                                                         seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false)));
            }
            {
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => new MetricConfiguration(
                                                                         seriesCountLimit:           -1,
                                                                         valuesPerDimensionLimit:    100,
                                                                         seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false)));
            }
            {
                Assert.ThrowsException <ArgumentOutOfRangeException>(() => new MetricConfiguration(
                                                                         seriesCountLimit:           1000,
                                                                         valuesPerDimensionLimit:    -1,
                                                                         seriesConfig:               new MetricSeriesConfigurationForMeasurement(restrictToUInt32Values: false)));
            }
            {
                Assert.ThrowsException <ArgumentNullException>(() => new MetricConfiguration(
                                                                   seriesCountLimit:           1000,
                                                                   valuesPerDimensionLimit:    100,
                                                                   seriesConfig:               null));
            }
        }