/* * Copyright 2016 Naver Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.web.vo.stat.chart; import com.google.common.math.DoubleMath; import org.junit.Assert; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; /** * @author HyunGil Jeong */ public abstract class DownSamplerTestBase<T extends Number & Comparable<? super T>> { public static final int DEFAULT_VALUE = -1; public static final int DOUBLE_COMPARISON_DELTA = 4; public static final int NUM_DECIMALS_FOR_ROUNDED_AVG = 1; protected static final Random RANDOM = new Random(); private DownSampler<T> sampler = getSampler(); protected abstract DownSampler<T> getSampler(); protected abstract T createSample(); protected abstract void assertEquals(T expected, T actual); @Test public void sampler_should_return_default_value() { // Given final List<T> samples = Collections.emptyList(); // When T min = sampler.sampleMin(samples); T max = sampler.sampleMax(samples); double avg = sampler.sampleAvg(samples); double roundedAvg = sampler.sampleAvg(samples, NUM_DECIMALS_FOR_ROUNDED_AVG); // Then Assert.assertEquals(DEFAULT_VALUE, min.intValue()); Assert.assertEquals(DEFAULT_VALUE, max.intValue()); Assert.assertEquals(DEFAULT_VALUE, avg, DOUBLE_COMPARISON_DELTA); Assert.assertEquals(DEFAULT_VALUE, roundedAvg, NUM_DECIMALS_FOR_ROUNDED_AVG); } @Test public void sampler_should_sample_correctly() { // Given final List<T> samples = createSamples(RANDOM.nextInt(20) + 1); final T expectedMin = Collections.min(samples); final T expectedMax = Collections.max(samples); final double expectedMean = DoubleMath.mean(samples); // When T min = sampler.sampleMin(samples); T max = sampler.sampleMax(samples); double avg = sampler.sampleAvg(samples); double roundedAvg = sampler.sampleAvg(samples, NUM_DECIMALS_FOR_ROUNDED_AVG); // Then assertEquals(expectedMin, min); assertEquals(expectedMax, max); Assert.assertEquals(expectedMean, avg, DOUBLE_COMPARISON_DELTA); Assert.assertEquals(expectedMean, roundedAvg, NUM_DECIMALS_FOR_ROUNDED_AVG); } @Test public void sampler_should_sample_correctly_for_single_sample() { // Given final T sample = createSample(); final List<T> samples = Arrays.asList(sample); final T expectedMin = sample; final T expectedMax = sample; final double expectedMean = sample.doubleValue(); // When T min = sampler.sampleMin(samples); T max = sampler.sampleMax(samples); double avg = sampler.sampleAvg(samples); double roundedAvg = sampler.sampleAvg(samples, NUM_DECIMALS_FOR_ROUNDED_AVG); // Then assertEquals(expectedMin, min); assertEquals(expectedMax, max); Assert.assertEquals(expectedMean, avg, DOUBLE_COMPARISON_DELTA); Assert.assertEquals(expectedMean, roundedAvg, NUM_DECIMALS_FOR_ROUNDED_AVG); } private List<T> createSamples(int sampleCount) { List<T> samples = new ArrayList<>(sampleCount); for (int i = 0; i < sampleCount; ++i) { samples.add(createSample()); } return samples; } }