/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.pnl;
import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import com.opengamma.analytics.math.function.Function1D;
import com.opengamma.timeseries.date.DateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateToIntConverter;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class DrawdownCalculatorTest {
private static final int N = 100;
private static final int[] T = new int[N];
private static final double[] FLAT = new double[N];
private static final double[] FLAT_DRAWDOWN = new double[N];
private static final double[] HIGH_FIRST = new double[N];
private static final double[] HIGH_FIRST_DRAWDOWN = new double[N];
private static final double[] X = new double[N];
private static final double[] X_DRAWDOWN = new double[N];
private static final Function1D<DateDoubleTimeSeries<?>, DateDoubleTimeSeries<?>> CALCULATOR = new DrawdownCalculator();
static {
for (int i = 0; i < N; i++) {
T[i] = LocalDateToIntConverter.convertToInt(LocalDate.ofEpochDay(i));
FLAT[i] = 100;
FLAT_DRAWDOWN[i] = 0;
HIGH_FIRST[i] = 100;
HIGH_FIRST_DRAWDOWN[i] = 2. / 3;
if (i % 10 == 0) {
X[i] = (i + 10) * 10;
X_DRAWDOWN[i] = 0;
} else {
X[i] = 100;
X_DRAWDOWN[i] = (i / 10) * 100 / X[10 * (i / 10)];
}
}
HIGH_FIRST[0] = 300;
HIGH_FIRST_DRAWDOWN[0] = 0;
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullTS() {
CALCULATOR.evaluate((DateDoubleTimeSeries<?>) null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyTS() {
CALCULATOR.evaluate(ImmutableLocalDateDoubleTimeSeries.EMPTY_SERIES);
}
@Test
public void test() {
assertTimeSeriesEquals(CALCULATOR.evaluate(ImmutableLocalDateDoubleTimeSeries.of(T, FLAT)), ImmutableLocalDateDoubleTimeSeries.of(T, FLAT_DRAWDOWN));
assertTimeSeriesEquals(CALCULATOR.evaluate(ImmutableLocalDateDoubleTimeSeries.of(T, HIGH_FIRST)), ImmutableLocalDateDoubleTimeSeries.of(T, HIGH_FIRST_DRAWDOWN));
assertTimeSeriesEquals(CALCULATOR.evaluate(ImmutableLocalDateDoubleTimeSeries.of(T, X)), ImmutableLocalDateDoubleTimeSeries.of(T, X_DRAWDOWN));
}
private void assertTimeSeriesEquals(final DateDoubleTimeSeries<?> ts1, final DateDoubleTimeSeries<?> ts2) {
assertArrayEquals(ts1.timesArrayFast(), ts2.timesArrayFast());
assertArrayEquals(ts1.valuesArrayFast(), ts2.valuesArrayFast(), 1e-15);
}
}