/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.surface; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import org.testng.annotations.Test; import com.opengamma.analytics.math.curve.Curve; import com.opengamma.analytics.math.curve.CurveShiftFunctionFactory; import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve; import com.opengamma.analytics.math.interpolation.LinearInterpolator1D; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class InterpolatedFromCurvesAdditiveSurfaceShiftFunctionTest { private static final LinearInterpolator1D INTERPOLATOR = new LinearInterpolator1D(); private static final InterpolatedDoublesCurve NODAL = InterpolatedDoublesCurve.fromSorted(new double[] {1, 2, 3, 4}, new double[] {2, 3, 4, 5}, INTERPOLATOR, "Q"); private static final InterpolatedDoublesCurve INTERPOLATED1 = InterpolatedDoublesCurve.fromSorted(new double[] {1, 2, 3, 4}, new double[] {3, 4, 5, 6}, INTERPOLATOR, "W"); private static final InterpolatedDoublesCurve INTERPOLATED2 = InterpolatedDoublesCurve.fromSorted(new double[] {1, 2, 3, 4}, new double[] {4, 5, 6, 7}, INTERPOLATOR, "E"); private static final double[] POINTS = new double[] {1, 2, 4}; @SuppressWarnings("unchecked") private static final Curve<Double, Double>[] CURVES = new Curve[] {NODAL, INTERPOLATED1, INTERPOLATED2}; private static final String NAME = "D"; private static final InterpolatedFromCurvesDoublesSurface SURFACE1 = InterpolatedFromCurvesDoublesSurface.fromSorted(true, POINTS, CURVES, INTERPOLATOR, NAME); private static final InterpolatedFromCurvesDoublesSurface SURFACE2 = InterpolatedFromCurvesDoublesSurface.fromSorted(false, POINTS, CURVES, INTERPOLATOR, NAME); private static final InterpolatedFromCurvesSurfaceAdditiveShiftFunction F = new InterpolatedFromCurvesSurfaceAdditiveShiftFunction(); @Test(expectedExceptions = IllegalArgumentException.class) public void testNull1() { F.evaluate(null, 3); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull2() { F.evaluate(null, 3, NAME); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull3() { F.evaluate(null, 3, 4, 5); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull4() { F.evaluate(null, 3, 4, 5, NAME); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull5() { F.evaluate(null, new double[] {3}, new double[] {4}, new double[] {5}); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNull6() { F.evaluate(null, new double[] {3}, new double[] {4}, new double[] {5}, NAME); } @Test(expectedExceptions = IllegalArgumentException.class) public void testWrongLengthY1() { F.evaluate(SURFACE1, new double[] {1}, new double[] {2, 3}, new double[] {4}); } @Test(expectedExceptions = IllegalArgumentException.class) public void testWrongLengthY2() { F.evaluate(SURFACE1, new double[] {1}, new double[] {2, 3}, new double[] {4}, "M"); } @Test(expectedExceptions = IllegalArgumentException.class) public void testWrongLengthZ1() { F.evaluate(SURFACE1, new double[] {1}, new double[] {2}, new double[] {3, 4}); } @Test(expectedExceptions = IllegalArgumentException.class) public void testWrongLengthZ2() { F.evaluate(SURFACE1, new double[] {1}, new double[] {2}, new double[] {3, 4}, "L"); } @Test public void testParallel() { final double shift = 0.54; InterpolatedFromCurvesDoublesSurface surface = F.evaluate(SURFACE1, shift); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); Curve<Double, Double>[] curves = surface.getCurves(); Curve<Double, Double> shifted = curves[0]; assertParallelShiftedCurves(shift, shifted, NODAL, InterpolatedDoublesCurve.class); shifted = curves[1]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED1, InterpolatedDoublesCurve.class); shifted = curves[2]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED2, InterpolatedDoublesCurve.class); assertEquals(surface.getName(), "PARALLEL_SHIFT_" + NAME); final String newName = "T"; surface = F.evaluate(SURFACE1, shift, newName); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertParallelShiftedCurves(shift, shifted, NODAL, InterpolatedDoublesCurve.class); shifted = curves[1]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED1, InterpolatedDoublesCurve.class); shifted = curves[2]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED2, InterpolatedDoublesCurve.class); assertEquals(surface.getName(), newName); surface = F.evaluate(SURFACE1, shift); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertParallelShiftedCurves(shift, shifted, NODAL, InterpolatedDoublesCurve.class); shifted = curves[1]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED1, InterpolatedDoublesCurve.class); shifted = curves[2]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED2, InterpolatedDoublesCurve.class); assertEquals(surface.getName(), "PARALLEL_SHIFT_" + NAME); surface = F.evaluate(SURFACE1, shift, newName); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertParallelShiftedCurves(shift, shifted, NODAL, InterpolatedDoublesCurve.class); shifted = curves[1]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED1, InterpolatedDoublesCurve.class); shifted = curves[2]; assertParallelShiftedCurves(shift, shifted, INTERPOLATED2, InterpolatedDoublesCurve.class); assertEquals(surface.getName(), newName); } private void assertParallelShiftedCurves(final double shift, final Curve<Double, Double> shifted, final Curve<Double, Double> original, final Class<?> clazz) { Double[] yData1; Double[] yData2; assertEquals(shifted.getClass(), clazz); assertArrayEquals(shifted.getXData(), original.getXData()); yData1 = shifted.getYData(); yData2 = original.getYData(); for (int i = 0; i < yData1.length; i++) { assertEquals(yData1[i], yData2[i] + shift, 0); } } @Test(expectedExceptions = UnsupportedOperationException.class) public void testSingleShiftNoX() { F.evaluate(SURFACE2, 1.2, 2, 0.3); } @Test(expectedExceptions = UnsupportedOperationException.class) public void testSingleShiftNoY() { F.evaluate(SURFACE1, 1, 1.2, 0.2); } @Test public void testSingleShiftXZ() { final double x = 1; final double y = 4; final double shift = 0.54; InterpolatedFromCurvesDoublesSurface surface = F.evaluate(SURFACE1, x, y, shift); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); Curve<Double, Double>[] curves = surface.getCurves(); Curve<Double, Double> shifted = curves[0]; assertCurveEquals(shifted, NODAL, false); shifted = curves[1]; assertCurveEquals(shifted, INTERPOLATED1, false); shifted = curves[2]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED2, x, shift), false); assertEquals(surface.getName(), "SINGLE_SHIFT_" + NAME); final String newName = "K"; surface = F.evaluate(SURFACE1, x, y, shift, newName); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertCurveEquals(shifted, NODAL, false); shifted = curves[1]; assertCurveEquals(shifted, INTERPOLATED1, false); shifted = curves[2]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED2, x, shift), false); assertEquals(surface.getName(), newName); } @Test public void testSingleShiftYZ() { final double x = 1; final double y = 4; final double shift = 0.54; InterpolatedFromCurvesDoublesSurface surface = F.evaluate(SURFACE2, x, y, shift); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertFalse(surface.isXZCurves()); Curve<Double, Double>[] curves = surface.getCurves(); Curve<Double, Double> shifted = curves[0]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(NODAL, y, shift), false); shifted = curves[1]; assertCurveEquals(shifted, INTERPOLATED1, false); shifted = curves[2]; assertCurveEquals(shifted, INTERPOLATED2, false); assertEquals(surface.getName(), "SINGLE_SHIFT_" + NAME); final String newName = "K"; surface = F.evaluate(SURFACE2, x, y, shift, newName); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertFalse(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(NODAL, y, shift), false); shifted = curves[1]; assertCurveEquals(shifted, INTERPOLATED1, false); shifted = curves[2]; assertCurveEquals(shifted, INTERPOLATED2, false); assertEquals(surface.getName(), newName); } @Test(expectedExceptions = UnsupportedOperationException.class) public void testMultipleShiftNoX() { F.evaluate(SURFACE2, new double[] {1, 1.2}, new double[] {1, 2}, new double[] {0.3, 0.3}); } @Test(expectedExceptions = UnsupportedOperationException.class) public void testMultipleShiftShiftNoY() { F.evaluate(SURFACE1, new double[] {1, 2}, new double[] {1, 1.2}, new double[] {0.3, 0.3}); } @Test public void testMultipleShiftNoData() { final double[] xShift = new double[0]; final double[] yShift = new double[0]; final double[] shift = new double[0]; InterpolatedFromCurvesDoublesSurface surface = F.evaluate(SURFACE1, xShift, yShift, shift); assertArrayEquals(surface.getCurves(), CURVES); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME); surface = F.evaluate(SURFACE1, xShift, yShift, shift, "A"); assertArrayEquals(surface.getCurves(), CURVES); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); assertEquals(surface.getName(), "A"); surface = F.evaluate(SURFACE2, xShift, yShift, shift); assertArrayEquals(surface.getCurves(), CURVES); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertFalse(surface.isXZCurves()); assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME); surface = F.evaluate(SURFACE2, xShift, yShift, shift, "A"); assertArrayEquals(surface.getCurves(), CURVES); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertFalse(surface.isXZCurves()); assertEquals(surface.getName(), "A"); } @Test public void testMultipleShiftXZ() { final double[] x = new double[] {1, 2}; final double[] y = new double[] {4, 2}; final double[] shift = new double[] {0.54, -0.9}; InterpolatedFromCurvesDoublesSurface surface = F.evaluate(SURFACE1, x, y, shift); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); Curve<Double, Double>[] curves = surface.getCurves(); Curve<Double, Double> shifted = curves[0]; assertCurveEquals(shifted, NODAL, false); shifted = curves[1]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED1, x[1], shift[1]), false); shifted = curves[2]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED2, x[0], shift[0]), false); assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME); final String newName = "K"; surface = F.evaluate(SURFACE1, x, y, shift, newName); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertTrue(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertCurveEquals(shifted, NODAL, false); shifted = curves[1]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED1, x[1], shift[1]), false); shifted = curves[2]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED2, x[0], shift[0]), false); assertEquals(surface.getName(), newName); } @Test public void testMultipleShiftYZ() { final double[] x = new double[] {1, 2}; final double[] y = new double[] {4, 2}; final double[] shift = new double[] {0.54, -0.9}; InterpolatedFromCurvesDoublesSurface surface = F.evaluate(SURFACE2, x, y, shift); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertFalse(surface.isXZCurves()); Curve<Double, Double>[] curves = surface.getCurves(); Curve<Double, Double> shifted = curves[0]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(NODAL, y[0], shift[0]), false); shifted = curves[1]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED1, y[1], shift[1]), false); shifted = curves[2]; assertCurveEquals(shifted, INTERPOLATED2, false); assertEquals(surface.getName(), "MULTIPLE_SHIFT_" + NAME); final String newName = "K"; surface = F.evaluate(SURFACE2, x, y, shift, newName); assertEquals(surface.getInterpolator(), INTERPOLATOR); assertArrayEquals(surface.getPoints(), POINTS, 0); assertFalse(surface.isXZCurves()); curves = surface.getCurves(); shifted = curves[0]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(NODAL, y[0], shift[0]), false); shifted = curves[1]; assertCurveEquals(shifted, CurveShiftFunctionFactory.getShiftedCurve(INTERPOLATED1, y[1], shift[1]), false); shifted = curves[2]; assertCurveEquals(shifted, INTERPOLATED2, false); assertEquals(surface.getName(), newName); } private void assertCurveEquals(final Curve<Double, Double> c1, final Curve<Double, Double> c2, final boolean testName) { assertEquals(c1.getClass(), c2.getClass()); assertArrayEquals(c1.getXData(), c2.getXData()); assertArrayEquals(c1.getYData(), c2.getYData()); if (c1 instanceof InterpolatedDoublesCurve) { assertEquals(((InterpolatedDoublesCurve) c1).getInterpolator(), ((InterpolatedDoublesCurve) c2).getInterpolator()); } if (testName) { assertEquals(c1.getName(), c2.getName()); } } }