package org.jgroups.tests;
import org.jgroups.Global;
import org.jgroups.util.Average;
import org.jgroups.util.AverageMinMax;
import org.jgroups.util.Util;
import org.testng.annotations.Test;
import java.util.stream.IntStream;
/**
* @author Bela Ban
* @since 3.6.8
*/
@Test(groups=Global.FUNCTIONAL)
public class AverageTest {
public void testAverage() {
long[] numbers=new long[1000];
long total=0;
for(int i=0; i < numbers.length; i++) {
numbers[i]=Util.random(10000);
total+=numbers[i];
}
double expected_avg=total/1000.0;
Average a=new Average();
for(long num: numbers)
a.add(num);
double avg=a.getAverage();
expected_avg=Math.floor(expected_avg);
avg=Math.floor(avg);
assert avg == expected_avg;
}
public void testOverflow() {
long start=Long.MAX_VALUE/ 500;
Average avg=new Average();
for(int i=0; i < 1000; i++)
avg.add(start++);
long cnt=avg.getCount();
System.out.printf("cnt=%d, avg=%.2f\n", cnt, avg.getAverage());
assert cnt == 500; // was reset at i=500
}
public void testMinMax() {
AverageMinMax avg=new AverageMinMax();
IntStream.rangeClosed(1,10).forEach(avg::add);
double average=IntStream.rangeClosed(1,10).average().orElse(0.0);
assert avg.getAverage() == average;
assert avg.min() == 1;
assert avg.max() == 10;
}
public void testMerge() {
AverageMinMax avg1=new AverageMinMax(), avg2=new AverageMinMax();
IntStream.rangeClosed(1, 1000).forEach(i -> avg1.add(1));
IntStream.rangeClosed(1, 10000).forEach(i -> avg2.add(2));
System.out.printf("avg1: %s, avg2: %s\n", avg1, avg2);
avg1.merge(avg2);
System.out.printf("merged avg1: %s\n", avg1);
assert avg1.count() == 5500;
double diff=Math.abs(avg1.getAverage() - 1.90);
assert diff < 0.01;
assert avg1.min() == 1;
assert avg1.max() == 2;
}
public void testMerger2() {
AverageMinMax avg1=new AverageMinMax(), avg2=new AverageMinMax();
IntStream.rangeClosed(1, 10000).forEach(i -> avg2.add(2));
System.out.printf("avg1: %s, avg2: %s\n", avg1, avg2);
avg1.merge(avg2);
System.out.printf("merged avg1: %s\n", avg1);
assert avg1.count() == 5000;
assert avg1.average() == 2.0;
assert avg1.min() == 2;
assert avg1.max() == 2;
}
}