package com.ldbc.driver.util; import com.google.common.collect.Range; import com.ldbc.driver.util.Bucket.NumberRangeBucket; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; public class HistogramTest { @Test public void makeEqualBucketRangesTest() { // Given double min = 0; double max = 10; int bucketCount = 5; // When List<Bucket<Integer>> buckets = Histogram.makeBucketsOfEqualRange(min, max, bucketCount, Integer.class); // Then assertEquals(bucketCount, buckets.size()); } @Test public void createEmpty() { // Given // When Histogram<Integer, Integer> h = new Histogram<Integer, Integer>(0); // Then assertEquals(0, h.getBucketCount()); } @Test public void importSequenceTest() { // Given Bucket<Integer> bucket1 = new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d)); Bucket<Integer> bucket2 = new NumberRangeBucket<Integer>(Range.closedOpen(2d, 4d)); Bucket<Integer> bucket3 = new NumberRangeBucket<Integer>(Range.closedOpen(4d, 6d)); Bucket<Integer> bucket4 = new NumberRangeBucket<Integer>(Range.closed(6d, 8d)); Histogram<Integer, Integer> histogram = new Histogram<Integer, Integer>(0); histogram.addBucket(bucket1); // 3 histogram.addBucket(bucket2); // 2 histogram.addBucket(bucket3); // 0 histogram.addBucket(bucket4); // 1 Integer[] sequenceArray = new Integer[]{0, 1, 1, 2, 2, 3, 8}; List<Integer> sequence = Arrays.asList(sequenceArray); assertEquals(0, (int) histogram.getBucketValue(bucket1)); assertEquals(0, (int) histogram.getBucketValue(bucket2)); assertEquals(0, (int) histogram.getBucketValue(bucket3)); assertEquals(0, (int) histogram.getBucketValue(bucket4)); // When histogram.importValueSequence(sequence); // Then assertEquals(3, (int) histogram.getBucketValue(bucket1)); assertEquals(3, (int) histogram.getBucketValue(bucket2)); assertEquals(0, (int) histogram.getBucketValue(bucket3)); assertEquals(1, (int) histogram.getBucketValue(bucket4)); assertEquals(4, histogram.getBucketCount()); } @Test public void addBucketsTest() { // Given Histogram<Integer, Integer> histogram = new Histogram<Integer, Integer>(2); List<Bucket<Integer>> buckets = new ArrayList<Bucket<Integer>>(); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d))); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(2d, 4d))); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(4d, 6d))); buckets.add(new NumberRangeBucket<Integer>(Range.closed(6d, 8d))); assertEquals(0, histogram.getBucketCount()); // When histogram.addBuckets(buckets); // Then assertEquals(4, histogram.getBucketCount()); for (Bucket<Integer> bucket : buckets) { assertEquals(2, (int) histogram.getBucketValue(bucket)); } } @Test public void addThenGetBucketTest() { // Given Histogram<Integer, Integer> histogram = new Histogram<Integer, Integer>(5); assertEquals(0, histogram.getBucketCount()); // When histogram.addBucket(new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d))); // Then assertEquals(1, histogram.getBucketCount()); assertEquals(5, (int) histogram.getBucketValue(new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d)))); } @Test public void setAllBucketValuesTest() { // Given Histogram<Integer, Integer> histogram = new Histogram<Integer, Integer>(2); List<Bucket<Integer>> buckets = new ArrayList<Bucket<Integer>>(); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d))); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(2d, 4d))); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(4d, 6d))); buckets.add(new NumberRangeBucket<Integer>(Range.closed(6d, 8d))); histogram.addBuckets(buckets); for (Bucket<Integer> bucket : buckets) { assertEquals(2, (int) histogram.getBucketValue(bucket)); } // When histogram.setAllBucketValues(9); // Then assertEquals(4, histogram.getBucketCount()); for (Bucket<Integer> bucket : buckets) { assertEquals(9, (int) histogram.getBucketValue(bucket)); } } @Test public void setBucketValuesTest() { // Given Histogram<Integer, Integer> histogram = new Histogram<Integer, Integer>(2); List<Bucket<Integer>> buckets = new ArrayList<Bucket<Integer>>(); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d))); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(2d, 4d))); buckets.add(new NumberRangeBucket<Integer>(Range.closedOpen(4d, 6d))); buckets.add(new NumberRangeBucket<Integer>(Range.closed(6d, 8d))); histogram.addBuckets(buckets, 2); for (Bucket<Integer> bucket : buckets) { assertEquals(2, (int) histogram.getBucketValue(bucket)); } // When histogram.setBucketValues(buckets, 9); // Then assertEquals(4, histogram.getBucketCount()); for (Bucket<Integer> bucket : buckets) { assertEquals(9, (int) histogram.getBucketValue(bucket)); } } @Test public void incBucketValueTest() { // Given Histogram<Integer, Integer> histogram = new Histogram<Integer, Integer>(5); assertEquals(0, histogram.getBucketCount()); Bucket<Integer> bucket = new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d)); histogram.addBucket(bucket); assertEquals(1, histogram.getBucketCount()); assertEquals(5, (int) histogram.getBucketValue(bucket)); // When histogram.incBucketValue(bucket, 1); // Then assertEquals(1, histogram.getBucketCount()); assertEquals(6, (int) histogram.getBucketValue(bucket)); } @Test public void toPercentageValuesTest() { // Given Bucket<Integer> bucket1 = new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d)); Bucket<Integer> bucket2 = new NumberRangeBucket<Integer>(Range.closedOpen(2d, 4d)); Bucket<Integer> bucket3 = new NumberRangeBucket<Integer>(Range.closed(4d, 6d)); Histogram<Integer, Integer> histogramAbsolute = new Histogram<Integer, Integer>(0); histogramAbsolute.addBucket(bucket1, 1); histogramAbsolute.addBucket(bucket2, 1); histogramAbsolute.addBucket(bucket3, 2); assertEquals(1, (int) histogramAbsolute.getBucketValue(bucket1)); assertEquals(1, (int) histogramAbsolute.getBucketValue(bucket2)); assertEquals(2, (int) histogramAbsolute.getBucketValue(bucket3)); // When Histogram<Integer, Double> histogramPercentage = histogramAbsolute.toPercentageValues(); // Then assertEquals(1, (int) histogramAbsolute.getBucketValue(bucket1)); assertEquals(1, (int) histogramAbsolute.getBucketValue(bucket2)); assertEquals(2, (int) histogramAbsolute.getBucketValue(bucket3)); assertEquals((Double) 0.25, histogramPercentage.getBucketValue(bucket1)); assertEquals((Double) 0.25, histogramPercentage.getBucketValue(bucket2)); assertEquals((Double) 0.5, histogramPercentage.getBucketValue(bucket3)); } @Test public void equalsWithinToleranceTest() { // Given Bucket<Integer> bucket1 = new NumberRangeBucket<Integer>(Range.closedOpen(0d, 2d)); Bucket<Integer> bucket2 = new NumberRangeBucket<Integer>(Range.closedOpen(2d, 4d)); Histogram<Integer, Double> histogram1 = new Histogram<Integer, Double>(0d); histogram1.addBucket(bucket1, 0.5); histogram1.addBucket(bucket2, 0.2); Histogram<Integer, Double> histogram2 = new Histogram<Integer, Double>(0d); histogram2.addBucket(bucket1, 0.6); histogram2.addBucket(bucket2, 0.2); // When assertThat(Histogram.equalsWithinTolerance(histogram1, histogram2, 0.1), is(true)); assertThat(Histogram.equalsWithinTolerance(histogram1, histogram2, 0.05), is(false)); assertThat(Histogram.equalsWithinTolerance(histogram2, histogram1, 0.1), is(true)); assertThat(Histogram.equalsWithinTolerance(histogram2, histogram1, 0.05), is(false)); } }