/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.math.curve;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.analytics.math.function.Function;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.analytics.math.interpolation.LinearInterpolator1D;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class CurveSpreadFunctionTest {
private static final CurveSpreadFunction ADD = CurveSpreadFunctionFactory.of("+");
private static final CurveSpreadFunction DIVIDE = CurveSpreadFunctionFactory.of("/");
private static final CurveSpreadFunction MULTIPLY = CurveSpreadFunctionFactory.of("*");
private static final CurveSpreadFunction SUBTRACT = CurveSpreadFunctionFactory.of("-");
private static final double[] X = new double[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
private static final double[] Y1 = new double[] {2, 4, 6, 8, 10, 12, 14, 16, 18};
private static final double[] Y2 = new double[] {1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 1.1};
private static final InterpolatedDoublesCurve INTERPOLATED1 = InterpolatedDoublesCurve.fromSorted(X, Y1, new LinearInterpolator1D());
private static final InterpolatedDoublesCurve INTERPOLATED2 = InterpolatedDoublesCurve.fromSorted(X, Y2, new LinearInterpolator1D());
private static final ConstantDoublesCurve CONSTANT1 = ConstantDoublesCurve.from(2);
private static final ConstantDoublesCurve CONSTANT2 = ConstantDoublesCurve.from(1.1);
private static final Function1D<Double, Double> F1 = new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double x) {
return x * x;
}
};
private static final Function1D<Double, Double> F2 = new Function1D<Double, Double>() {
@Override
public Double evaluate(final Double x) {
return 3 * x;
}
};
private static final FunctionalDoublesCurve FUNCTIONAL1 = FunctionalDoublesCurve.from(F1);
private static final FunctionalDoublesCurve FUNCTIONAL2 = FunctionalDoublesCurve.from(F2);
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves1() {
ADD.evaluate((Curve<Double, Double>[]) null);
}
@SuppressWarnings("unchecked")
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyCurves1() {
ADD.evaluate(new Curve[0]);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves2() {
ADD.evaluate((Curve<Double, Double>[]) null);
}
@SuppressWarnings("unchecked")
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyCurves2() {
ADD.evaluate(new Curve[0]);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves3() {
ADD.evaluate((Curve<Double, Double>[]) null);
}
@SuppressWarnings("unchecked")
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyCurves3() {
ADD.evaluate(new Curve[0]);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullCurves4() {
ADD.evaluate((Curve<Double, Double>[]) null);
}
@SuppressWarnings("unchecked")
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyCurves4() {
ADD.evaluate(new Curve[0]);
}
@Test
public void testOperationName() {
assertEquals(ADD.getOperationName(), "+");
assertEquals(DIVIDE.getOperationName(), "/");
assertEquals(MULTIPLY.getOperationName(), "*");
assertEquals(SUBTRACT.getOperationName(), "-");
}
@SuppressWarnings("unchecked")
@Test
public void testConstant() {
final Curve<Double, Double>[] curves = new Curve[] {CONSTANT1, CONSTANT2};
final double y1 = 2;
final double y2 = 1.1;
Function<Double, Double> f = ADD.evaluate(curves);
assertEquals(f.evaluate(3.), y1 + y2, 0);
f = DIVIDE.evaluate(curves);
assertEquals(f.evaluate(3.), y1 / y2, 0);
f = MULTIPLY.evaluate(curves);
assertEquals(f.evaluate(3.), y1 * y2, 0);
f = SUBTRACT.evaluate(curves);
assertEquals(f.evaluate(3.), y1 - y2, 0);
}
@SuppressWarnings("unchecked")
@Test
public void testFunctional() {
final double x = 3.5;
final Curve<Double, Double>[] curves = new Curve[] {FUNCTIONAL1, FUNCTIONAL2};
Function<Double, Double> f = ADD.evaluate(curves);
assertEquals(f.evaluate(x), F1.evaluate(x) + F2.evaluate(x), 0);
f = DIVIDE.evaluate(curves);
assertEquals(f.evaluate(x), F1.evaluate(x) / F2.evaluate(x), 0);
f = MULTIPLY.evaluate(curves);
assertEquals(f.evaluate(x), F1.evaluate(x) * F2.evaluate(x), 0);
f = SUBTRACT.evaluate(curves);
assertEquals(f.evaluate(x), F1.evaluate(x) - F2.evaluate(x), 0);
}
@SuppressWarnings("unchecked")
@Test
public void testInterpolated() {
final double x = 3.5;
final Curve<Double, Double>[] curves = new Curve[] {INTERPOLATED1, INTERPOLATED2};
Function<Double, Double> f = ADD.evaluate(curves);
assertEquals(f.evaluate(x), INTERPOLATED1.getYValue(x) + INTERPOLATED2.getYValue(x), 0);
f = DIVIDE.evaluate(curves);
assertEquals(f.evaluate(x), INTERPOLATED1.getYValue(x) / INTERPOLATED2.getYValue(x), 0);
f = MULTIPLY.evaluate(curves);
assertEquals(f.evaluate(x), INTERPOLATED1.getYValue(x) * INTERPOLATED2.getYValue(x), 0);
f = SUBTRACT.evaluate(curves);
assertEquals(f.evaluate(x), INTERPOLATED1.getYValue(x) - INTERPOLATED2.getYValue(x), 0);
}
}