/**
* Copyright (C) 2009 - 2011 by OpenGamma Inc.
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.model.finitedifference;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.Test;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class HyperbolicMeshingTest extends MeshingTest {
private static final double A = 1.2;
private static final double B = 5.1;
private static final double K = 2.0;
private static final int N = 21;
private static final double BETA = 0.1;
private static final MeshingFunction HYP_MESH = new HyperbolicMeshing(A, B, K, N, BETA);
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEqualPoints() {
@SuppressWarnings("unused")
final MeshingFunction mesh = new HyperbolicMeshing(A, A, K, N, BETA);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNoPoints() {
@SuppressWarnings("unused")
final MeshingFunction mesh = new HyperbolicMeshing(A, B, K, 1, BETA);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testZeroBeta() {
@SuppressWarnings("unused")
final MeshingFunction mesh = new HyperbolicMeshing(A, B, K, N, 0.0);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testKLow() {
@SuppressWarnings("unused")
final MeshingFunction mesh = new HyperbolicMeshing(A, B, A - 0.1, N, 0.0);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testKHight() {
@SuppressWarnings("unused")
final MeshingFunction mesh = new HyperbolicMeshing(A, B, B + 0.1, N, 0.0);
}
@Test
public void testEndPoints() {
assertEquals(A, HYP_MESH.evaluate(0), 1e-10);
assertEquals(B, HYP_MESH.evaluate(N - 1), 1e-10);
}
@Test
public void testSpacing() {
double dx, oldDx;
double x = A;
oldDx = HYP_MESH.evaluate(1) - HYP_MESH.evaluate(0);
int i = 2;
while (x < K) {
dx = HYP_MESH.evaluate(i) - HYP_MESH.evaluate(i - 1);
assertTrue(dx < oldDx);
oldDx = dx;
i++;
x = HYP_MESH.evaluate(i);
}
x = B;
oldDx = HYP_MESH.evaluate(N - 1) - HYP_MESH.evaluate(N - 2);
i = N - 2;
while (x > K) {
dx = HYP_MESH.evaluate(i) - HYP_MESH.evaluate(i - 1);
assertTrue(dx < oldDx);
oldDx = dx;
i--;
x = HYP_MESH.evaluate(i);
}
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void outOfRangeTest() {
double xMin = -3.4;
double xMax = 10.0;
double xCent = 0.0;
double[] fp = new double[] {5.0, -3.5, -2.0, 7.0 };
double beta = 0.2;
int n = 12;
@SuppressWarnings("unused")
MeshingFunction mesh = new HyperbolicMeshing(xMin, xMax, xCent, n, beta, fp);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void outOfRangeTest2() {
double xMin = -3.4;
double xMax = 10.0;
double xCent = -2.0;
double[] fp = new double[] {5.0, -1.4, -2.0, 17.0 };
double beta = 0.2;
int n = 12;
@SuppressWarnings("unused")
MeshingFunction mesh = new HyperbolicMeshing(xMin, xMax, xCent, n, beta, fp);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void tooFewPointsTest() {
double xMin = -3.4;
double xMax = 10.0;
double xCent = 2.0;
double[] fp = new double[] {5.0, -1.4, 1.4, 2.0, -2.0, 9.0 };
double beta = 0.5;
int n = 7;
@SuppressWarnings("unused")
MeshingFunction mesh = new HyperbolicMeshing(xMin, xMax, xCent, n, beta, fp);
}
@Test
public void oneFixedPointTest() {
double xMin = 3.4;
double xMax = 10.0;
double xCent = 3.9;
double[] fp = new double[] {xCent };
double beta = 0.2;
int n = 10;
MeshingFunction mesh = new HyperbolicMeshing(xMin, xMax, xCent, n, beta, fp);
testMesh(mesh, fp, xMin, xMax);
}
@Test
public void multiFixedPointTest() {
double xMin = -3.4;
double xMax = 10.0;
double xCent = 5.0;
double[] fp = new double[] {5.0, -1.0, -2.0, 7.0 };
double beta = 0.7;
int n = 12;
MeshingFunction mesh = new HyperbolicMeshing(xMin, xMax, xCent, n, beta, fp);
testMesh(mesh, fp, xMin, xMax);
}
@Test
public void multiFixedPointTest2() {
double xMin = 3.4;
double xMax = 10.0;
double xCent = 4.0;
double[] fp = new double[] {3.5, 9.0, 9.9, 9.5, 9.9, 9.4 };
double beta = 0.1;
int n = 12;
MeshingFunction mesh = new HyperbolicMeshing(xMin, xMax, xCent, n, beta, fp);
testMesh(mesh, fp, xMin, xMax);
}
}