/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.math.interpolation.data; 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 java.util.Arrays; import org.testng.annotations.Test; import com.opengamma.analytics.math.function.RealPolynomialFunction1D; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = TestGroup.UNIT) public class Interpolator1DDoubleQuadraticDataBundleTest { private static final RealPolynomialFunction1D QUADRATIC = new RealPolynomialFunction1D(new double[] {2, 3, 4}); private static final Interpolator1DDoubleQuadraticDataBundle DATA; private static final double[] X; private static final double[] Y; private static final double EPS = 1e-12; static { final int n = 10; X = new double[n]; Y = new double[n]; for (int i = 0; i < n; i++) { X[i] = 3 * i; Y[i] = QUADRATIC.evaluate(X[i]); } DATA = new Interpolator1DDoubleQuadraticDataBundle(new ArrayInterpolator1DDataBundle(X, Y)); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullData() { new Interpolator1DDoubleQuadraticDataBundle(null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testSetNegativeIndex() { DATA.setYValueAtIndex(-2, 3); } @Test(expectedExceptions = IllegalArgumentException.class) public void testSetHighIndex() { DATA.setYValueAtIndex(100, 4); } @Test public void testGetters() { assertTrue(DATA.containsKey(3.)); assertFalse(DATA.containsKey(2.)); assertEquals(DATA.firstKey(), 0., EPS); assertEquals(DATA.firstValue(), QUADRATIC.evaluate(0.), EPS); assertEquals(DATA.get(6.), QUADRATIC.evaluate(6.), EPS); assertArrayEquals(DATA.getKeys(), X, 0); assertEquals(DATA.getLowerBoundIndex(11.), 3); assertEquals(DATA.getLowerBoundKey(7.), 6, EPS); assertArrayEquals(DATA.getValues(), Y, EPS); assertEquals(DATA.higherKey(7.), 9, 0); assertEquals(DATA.higherValue(7.), QUADRATIC.evaluate(9.), EPS); assertEquals(DATA.lastKey(), 27., EPS); assertEquals(DATA.lastValue(), QUADRATIC.evaluate(27.), EPS); assertEquals(DATA.size(), 10); final InterpolationBoundedValues boundedValues = DATA.getBoundedValues(4.); assertEquals(boundedValues.getLowerBoundIndex(), 1); assertEquals(boundedValues.getLowerBoundKey(), 3., EPS); assertEquals(boundedValues.getLowerBoundValue(), QUADRATIC.evaluate(3.), EPS); assertEquals(boundedValues.getHigherBoundKey(), 6., EPS); assertEquals(boundedValues.getHigherBoundValue(), QUADRATIC.evaluate(6.), EPS); } @Test public void testEqualsAndHashCode() { Interpolator1DDoubleQuadraticDataBundle other = new Interpolator1DDoubleQuadraticDataBundle( new ArrayInterpolator1DDataBundle(X, Y)); assertEquals(other, DATA); assertEquals(other.hashCode(), DATA.hashCode()); other = new Interpolator1DDoubleQuadraticDataBundle(new ArrayInterpolator1DDataBundle(Y, Y)); assertFalse(other.equals(DATA)); other = new Interpolator1DDoubleQuadraticDataBundle(new ArrayInterpolator1DDataBundle(X, X)); assertFalse(other.equals(DATA)); } @Test public void testQuadratics() { for (int i = 0; i < (X.length - 2); i++) { RealPolynomialFunction1D quad = DATA.getQuadratic(i); double[] coeff = quad.getCoefficients(); assertTrue(coeff.length == 3); double x = X[i + 1]; assertEquals(2 + 3 * x + 4 * x * x, coeff[0], 0); assertEquals(3 + 2 * 4 * x, coeff[1], 0); assertEquals(4, coeff[2], 0); } } @Test public void testSetYValue() { final int n = X.length; final double[] x = Arrays.copyOf(X, n); final double[] y = Arrays.copyOf(Y, n); Arrays.sort(x); Arrays.sort(y); Interpolator1DDoubleQuadraticDataBundle data1 = new Interpolator1DDoubleQuadraticDataBundle( new ArrayInterpolator1DDataBundle(x, y)); Interpolator1DDoubleQuadraticDataBundle data2; final double newY = 120; final double[] yData = Arrays.copyOf(y, n); for (int i = 0; i < n; i++) { yData[i] = newY; data1.setYValueAtIndex(i, newY); data2 = new Interpolator1DDoubleQuadraticDataBundle(new ArrayInterpolator1DDataBundle(x, yData)); assertArrayEquals(data1.getKeys(), data2.getKeys(), 0); assertArrayEquals(data1.getValues(), data2.getValues(), 0); for (int j = 0; j < n - 2; j++) { assertEquals(data1.getQuadratic(j), data2.getQuadratic(j)); } assertEquals(data1, data2); yData[i] = y[i]; data1 = new Interpolator1DDoubleQuadraticDataBundle(new ArrayInterpolator1DDataBundle(x, y)); } } }