/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.fudgemsg;
import static org.testng.AssertJUnit.assertEquals;
import org.testng.annotations.Test;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.math.function.Function;
import com.opengamma.analytics.math.interpolation.GridInterpolator2D;
import com.opengamma.analytics.math.interpolation.LinearInterpolator1D;
import com.opengamma.analytics.math.surface.ConstantDoublesSurface;
import com.opengamma.analytics.math.surface.FunctionalDoublesSurface;
import com.opengamma.analytics.math.surface.InterpolatedDoublesSurface;
import com.opengamma.analytics.math.surface.Surface;
import com.opengamma.util.test.TestGroup;
/**
*
*/
@Test(groups = TestGroup.UNIT)
public class MathSurfaceTest extends AnalyticsTestBase {
@Test
public void testConstantSurface() {
Surface<Double, Double, Double> s1 = ConstantDoublesSurface.from(4.);
Surface<Double, Double, Double> s2 = cycleObject(Surface.class, s1);
assertEquals(s1, s2);
s1 = ConstantDoublesSurface.from(4., "NAME");
s2 = cycleObject(Surface.class, s1);
assertEquals(s1, s2);
}
@Test
public void testInterpolatedSurface() {
final LinearInterpolator1D linear = new LinearInterpolator1D();
final GridInterpolator2D interpolator = new GridInterpolator2D(linear, linear);
Surface<Double, Double, Double> s1 = InterpolatedDoublesSurface.from(new double[] {1, 2, 3, 4 }, new double[] {4, 5, 6, 7 }, new double[] {8, 9, 10, 11 }, interpolator);
Surface<Double, Double, Double> s2 = cycleObject(Surface.class, s1);
assertEquals(s1, s2);
s1 = InterpolatedDoublesSurface.from(new double[] {1, 2, 3, 4 }, new double[] {4, 5, 6, 7 }, new double[] {8, 9, 10, 11 }, interpolator, "NAME");
s2 = cycleObject(Surface.class, s1);
assertEquals(s1, s2);
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testFunctionalSurfaceUnserialized() {
final Function<Double, Double> f = new Function<Double, Double>() {
@Override
public Double evaluate(final Double... x) {
return 9.;
}
};
final Surface<Double, Double, Double> s = FunctionalDoublesSurface.from(f);
cycleObject(Surface.class, s);
}
@Test
public void testFunctionalSurface1() {
final FunctionalDoublesSurface s1 = FunctionalDoublesSurface.from(new TestStatelessFunction().getSurface(3., 4.));
final Surface<Double, Double, Double> s2 = cycleObject(Surface.class, s1);
assertSurfaceEquals(s1, s2);
}
@Test
public void testFunctionalSurface2() {
final FunctionalDoublesSurface s1 = FunctionalDoublesSurface.from(new TestStatefulFunction(true, 3).getSurface(5., 6.));
final Surface<Double, Double, Double> s2 = cycleObject(Surface.class, s1);
assertSurfaceEquals(s1, s2);
}
private void assertSurfaceEquals(final Surface<Double, Double, Double> s1, final Surface<Double, Double, Double> s2) {
if (s1 != s2) {
for (double x = 0.1; x < 100.0; x += 5.00000001) {
for (double y = 0.11; y < 100; y += 5.00000001) {
assertEquals(s1.getZValue(x, y), s2.getZValue(x, y));
}
}
}
}
}