package picard.util;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static picard.util.MathUtil.divide;
/**
* @author mccowan
*/
public class MathUtilTest {
@Test
public void logMathTest() {
Assert.assertEquals(MathUtil.LOG_10_MATH.getLogValue(10), 1d, 0.00001d);
Assert.assertEquals(MathUtil.LOG_10_MATH.getNonLogValue(1), 10d, 0.00001d);
Assert.assertEquals(MathUtil.LOG_10_MATH.mean(5, 5, 5), 5d, 0.00001d);
// http://www.wolframalpha.com/input/?i=log10%2810%5E1.23%2B10%5E4.56%2B10%5E99999%29
Assert.assertEquals(MathUtil.LOG_10_MATH.sum(1.23, 4.56, 2), 4.5613970317323586660874152202433434022756298235604568d, 0.00001d);
// http://www.wolframalpha.com/input/?i=log10%2810%5E1.23+*+10%5E4.56+*+10%5E2%29
Assert.assertEquals(MathUtil.LOG_10_MATH.product(1.23, 4.56, 2), 7.7899999999999999999999999999999999999999999999999999d, 0.00001d);
}
@DataProvider
public Object[][] seqMethodTestCases() {
return new Object[][] {
new Object[] {0d, 5d, 1d, new double[] {0,1,2,3,4,5}},
new Object[] {0d, 0.5d, 0.1d, new double[] {0, 0.1, 0.2, 0.3, 0.4, 0.5}},
new Object[] {0d, 0.5d, 0.11d,new double[] {0, 0.11, 0.22, 0.33, 0.44}},
new Object[] {50d, 55d, 1.25d,new double[] {50, 51.25, 52.5, 53.75, 55}},
new Object[] {10d, 0d, 02d, new double[] {}},
new Object[] {10d, 0d, -2d, new double[] {10, 8, 6, 4, 2, 0}},
};
}
@Test(dataProvider="seqMethodTestCases")
public void testSeqGeneration(final double from, final double to, final double by, final double[] expected) {
final double[] actual = MathUtil.seq(from, to, by);
Assert.assertEquals(actual.length, expected.length);
for (int i=0; i<expected.length; ++i) {
Assert.assertTrue(Math.abs(actual[i] - expected[i]) < 0.0000001);
}
}
@DataProvider
public Object[][] divideMethodTestCases() {
return new Object[][] {
new Object[] {new double [] {1, 2, 3, 4}, new double [] {2, 3, 4, -5}, new double[] {.5, 2.0/3, 3.0/4, -4.0/5}},
new Object[] {new double [] {100}, new double [] {200}, new double[] {.5}},
new Object[] {new double [] {0, 4, -3, 2}, new double [] {200, 30, 32, 12}, new double[] {0, 4.0/30, -3.0/32, 2.0/12}},
new Object[] {new double [] {}, new double [] {}, new double[] {}},
};
}
@Test(dataProvider = "divideMethodTestCases")
public void testDivide(final double [] numerators, final double [] denominators, final double [] expected) {
assertEquals(divide(numerators, denominators), expected);
}
@DataProvider
public Object[][] divideMethodFailTestCases() {
return new Object[][] {
new Object[] {new double [] { 1, 2, 3, 4}, new double [] {2, 3, 4}},
new Object[] {new double [] {100}, new double [] {}},
};
}
@Test(dataProvider = "divideMethodFailTestCases",expectedExceptions = RuntimeException.class)
public void testDivideFail(final double [] lhs, final double [] rhs){
divide(lhs, rhs);
}
//TestNG doesn't have a utility function with this signature....
private void assertEquals(final double [] actual, final double [] expected) {
Assert.assertEquals(actual.length,expected.length,"Arrays do not have equal lengths");
for(int i=0;i<actual.length;++i){
Assert.assertEquals(actual[i], expected[i],"Array differ at position " +i);
}
}
}