/// <inheritdoc />
 public IReservoirSnapshot GetSnapshot()
 {
     return(new WavefrontHistogramSnapshot(
                wavefrontHistogram.GetSnapshot(),
                WavefrontHistogramImpl.Serialize(wavefrontHistogram.FlushDistributions())
                ));
 }
        public void TestSnapshot()
        {
            var currentTime = DateTime.UtcNow;

            long clockMillis() => DateTimeUtils.UnixTimeMilliseconds(currentTime);

            var powHistogram           = CreatePowHistogram(clockMillis);
            var rangeHistogram         = CreateRangeHistogram(clockMillis);
            var multiThreadedHistogram = CreateMultiThreadedHistogram(clockMillis);
            var emptyHistogram         = new WavefrontHistogramImpl(clockMillis);

            currentTime = currentTime.AddMinutes(1);

            var powSnapshot           = powHistogram.GetSnapshot();
            var rangeSnapshot         = rangeHistogram.GetSnapshot();
            var multiThreadedSnapshot = multiThreadedHistogram.GetSnapshot();
            var emptySnapshot         = emptyHistogram.GetSnapshot();

            // Test snapshot for the pow histogram

            Assert.Equal(9, powSnapshot.Count);
            Assert.Equal(100000, powSnapshot.Max);
            Assert.Equal(13457.9, powSnapshot.Mean, 1);
            Assert.Equal(0.1, powSnapshot.Min);
            Assert.Equal(7, powSnapshot.Size);
            Assert.Equal(121121.1, powSnapshot.Sum);
            Assert.Equal(
                PowDict.SelectMany(entry => Enumerable.Repeat(entry.Key, entry.Value)),
                powSnapshot.Values
                );
            Assert.Equal(100, powSnapshot.GetValue(0.5d));

            // Test snapshot for the range histogram

            Assert.Equal(1000, rangeSnapshot.Count);
            Assert.Equal(1000, rangeSnapshot.Max);
            Assert.Equal(500.5, rangeSnapshot.Mean);
            Assert.Equal(1, rangeSnapshot.Min);
            Assert.Equal(288.6749902572095, rangeSnapshot.StdDev, 0);
            Assert.Equal(500500, rangeSnapshot.Sum);
            Assert.InRange(rangeSnapshot.GetValue(0.5d), 490.5, 510.5);
            Assert.InRange(rangeSnapshot.GetValue(0.75d), 745.5, 755.5);
            Assert.InRange(rangeSnapshot.GetValue(0.95d), 949, 952);
            Assert.InRange(rangeSnapshot.GetValue(0.98d), 980, 981);
            Assert.InRange(rangeSnapshot.GetValue(0.99d), 990, 991);
            Assert.InRange(rangeSnapshot.GetValue(0.999d), 999, 1000);

            // Test snapshot for multi-threaded histogram

            Assert.Equal(100, multiThreadedSnapshot.Count);
            Assert.Equal(28.86607004772212, multiThreadedSnapshot.StdDev, 0);
            Assert.Equal(5050, multiThreadedSnapshot.Sum);
            Assert.Equal(100, multiThreadedSnapshot.GetValue(0.999d), 1);

            // Test snapshot for empty histogram

            Assert.Equal(0, emptySnapshot.StdDev);
        }