/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.market.curve;
import static com.opengamma.strata.basics.date.DayCounts.ACT_365F;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static org.assertj.core.api.Assertions.assertThat;
import org.testng.annotations.Test;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.market.ValueType;
import com.opengamma.strata.market.param.ParameterMetadata;
/**
* Test {@link ConstantNodalCurve}.
*/
@Test
public class ConstantNodalCurveTest {
private static final int SIZE = 1;
private static final String NAME = "TestCurve";
private static final CurveName CURVE_NAME = CurveName.of(NAME);
private static final CurveMetadata METADATA = Curves.zeroRates(CURVE_NAME, ACT_365F);
private static final CurveMetadata METADATA_ENTRIES =
Curves.zeroRates(CURVE_NAME, ACT_365F, ParameterMetadata.listOfEmpty(SIZE));
private static final CurveMetadata METADATA_ENTRIES2 =
Curves.zeroRates(CURVE_NAME, ACT_365F, ParameterMetadata.listOfEmpty(SIZE + 2));
private static final CurveMetadata METADATA_NOPARAM = Curves.zeroRates(CURVE_NAME, ACT_365F);
private static final double XVALUE = 2d;
private static final DoubleArray XVALUE_ARRAY = DoubleArray.of(XVALUE);
private static final double YVALUE = 7d;
private static final DoubleArray YVALUE_ARRAY = DoubleArray.of(YVALUE);
private static final DoubleArray XVALUE_ARRAY_NEW = DoubleArray.of(3d);
private static final double YVALUE_BUMPED = 5d;
private static final DoubleArray YVALUE_BUMPED_ARRAY = DoubleArray.of(YVALUE_BUMPED);
//-------------------------------------------------------------------------
public void test_of_CurveMetadata() {
ConstantNodalCurve test = ConstantNodalCurve.of(METADATA_ENTRIES, XVALUE, YVALUE);
ConstantNodalCurve testRe = ConstantNodalCurve.of(METADATA_ENTRIES, XVALUE, YVALUE);
assertThat(test).isEqualTo(testRe);
assertThat(test.getName()).isEqualTo(CURVE_NAME);
assertThat(test.getParameterCount()).isEqualTo(SIZE);
assertThat(test.getParameter(0)).isEqualTo(YVALUE);
assertThrowsIllegalArg(() -> test.getParameter(1));
assertThat(test.getParameterMetadata(0)).isSameAs(METADATA_ENTRIES.getParameterMetadata().get().get(0));
assertThat(test.withParameter(0, 2d)).isEqualTo(ConstantNodalCurve.of(METADATA_ENTRIES, XVALUE, 2d));
assertThrowsIllegalArg(() -> test.withParameter(1, 2d));
assertThat(test.withPerturbation((i, v, m) -> v - 2d)).isEqualTo(
ConstantNodalCurve.of(METADATA_ENTRIES, XVALUE, YVALUE_BUMPED));
assertThat(test.getMetadata()).isEqualTo(METADATA_ENTRIES);
assertThat(test.getXValues()).isEqualTo(XVALUE_ARRAY);
assertThat(test.getYValues()).isEqualTo(YVALUE_ARRAY);
}
public void test_of_noCurveMetadata() {
ConstantNodalCurve test = ConstantNodalCurve.of(METADATA_NOPARAM, XVALUE, YVALUE);
assertThat(test.getName()).isEqualTo(CURVE_NAME);
assertThat(test.getParameterCount()).isEqualTo(SIZE);
assertThat(test.getParameter(0)).isEqualTo(YVALUE);
assertThat(test.getParameterMetadata(0)).isEqualTo(SimpleCurveParameterMetadata.of(ValueType.YEAR_FRACTION, XVALUE));
}
//-------------------------------------------------------------------------
public void test_withNode() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA_ENTRIES, XVALUE, YVALUE);
SimpleCurveParameterMetadata param = SimpleCurveParameterMetadata.of(ValueType.YEAR_FRACTION, XVALUE);
ConstantNodalCurve test = base.withNode(XVALUE, 2d, param);
assertThat(test.getXValue()).isEqualTo(XVALUE);
assertThat(test.getYValue()).isEqualTo(2d);
assertThat(test.getParameterMetadata(0)).isEqualTo(param);
}
public void test_withNode_invalid() {
ConstantNodalCurve test = ConstantNodalCurve.of(METADATA_ENTRIES, XVALUE, YVALUE);
assertThrowsIllegalArg(() -> test.withNode(1, 2, ParameterMetadata.empty()));
}
//-------------------------------------------------------------------------
public void test_values() {
ConstantNodalCurve test = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
assertThat(test.yValue(10.2421)).isEqualTo(YVALUE);
assertThat(test.yValueParameterSensitivity(10.2421).getMarketDataName()).isEqualTo(CURVE_NAME);
assertThat(test.yValueParameterSensitivity(10.2421).getSensitivity()).isEqualTo(DoubleArray.of(1d));
assertThat(test.firstDerivative(10.2421)).isEqualTo(0d);
}
//-------------------------------------------------------------------------
public void test_withMetadata() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
ConstantNodalCurve test = base.withMetadata(METADATA_ENTRIES);
assertThat(test.getName()).isEqualTo(CURVE_NAME);
assertThat(test.getParameterCount()).isEqualTo(SIZE);
assertThat(test.getMetadata()).isEqualTo(METADATA_ENTRIES);
assertThat(test.getXValues()).isEqualTo(XVALUE_ARRAY);
assertThat(test.getYValues()).isEqualTo(YVALUE_ARRAY);
}
public void test_withMetadata_badSize() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
assertThrowsIllegalArg(() -> base.withMetadata(METADATA_ENTRIES2));
}
//-------------------------------------------------------------------------
public void test_withValues() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
ConstantNodalCurve test = base.withYValues(YVALUE_BUMPED_ARRAY);
assertThat(test.getName()).isEqualTo(CURVE_NAME);
assertThat(test.getParameterCount()).isEqualTo(SIZE);
assertThat(test.getMetadata()).isEqualTo(METADATA);
assertThat(test.getXValues()).isEqualTo(XVALUE_ARRAY);
assertThat(test.getYValues()).isEqualTo(YVALUE_BUMPED_ARRAY);
}
public void test_withValues_badSize() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
assertThrowsIllegalArg(() -> base.withYValues(DoubleArray.EMPTY));
assertThrowsIllegalArg(() -> base.withYValues(DoubleArray.of(4d, 6d)));
}
//-------------------------------------------------------------------------
public void test_withValuesXy() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
ConstantNodalCurve test = base.withValues(XVALUE_ARRAY_NEW, YVALUE_BUMPED_ARRAY);
assertThat(test.getName()).isEqualTo(CURVE_NAME);
assertThat(test.getParameterCount()).isEqualTo(SIZE);
assertThat(test.getMetadata()).isEqualTo(METADATA);
assertThat(test.getXValues()).isEqualTo(XVALUE_ARRAY_NEW);
assertThat(test.getYValues()).isEqualTo(YVALUE_BUMPED_ARRAY);
}
public void test_withValuesXy_badSize() {
ConstantNodalCurve base = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
assertThrowsIllegalArg(() -> base.withValues(DoubleArray.EMPTY, DoubleArray.EMPTY));
assertThrowsIllegalArg(() -> base.withValues(DoubleArray.of(4d), DoubleArray.of(6d, 0d)));
}
//-------------------------------------------------------------------------
public void coverage() {
ConstantNodalCurve test = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
coverImmutableBean(test);
ConstantNodalCurve test2 = ConstantNodalCurve.of(METADATA_ENTRIES, 55d, 23d);
coverBeanEquals(test, test2);
}
public void test_serialization() {
ConstantNodalCurve test = ConstantNodalCurve.of(METADATA, XVALUE, YVALUE);
assertSerialization(test);
}
}