/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.timeseries.filter;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Arrays;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import cern.jet.random.engine.MersenneTwister;
import cern.jet.random.engine.MersenneTwister64;
import cern.jet.random.engine.RandomEngine;
import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class SpikeDoubleTimeSeriesFilterTest {
private static final RandomEngine RANDOM = new MersenneTwister64(MersenneTwister.DEFAULT_SEED);
private static final TimeSeriesFilter FILTER = new SpikeDoubleTimeSeriesFilter(100);
private static final int N = 100;
private static final LocalDate[] DATES = new LocalDate[N];
private static final double[] DATA = new double[N];
private static final LocalDateDoubleTimeSeries EMPTY_SERIES = ImmutableLocalDateDoubleTimeSeries.EMPTY_SERIES;
static {
final double value = 0.5;
double random;
for (int i = 0; i < N; i++) {
random = RANDOM.nextDouble();
DATES[i] = LocalDate.ofEpochDay(i);
DATA[i] = value * (random < 0.5 ? 1 - random : 1 + random);
}
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullTS() {
FILTER.evaluate((LocalDateDoubleTimeSeries) null);
}
@Test
public void testEmptyTS() {
final FilteredTimeSeries filtered = FILTER.evaluate(EMPTY_SERIES);
assertEquals(filtered.getFilteredTS(), EMPTY_SERIES);
assertEquals(filtered.getRejectedTS(), EMPTY_SERIES);
}
@Test
public void testInitialSpike() {
final double[] data = Arrays.copyOf(DATA, N);
data[0] = 100.;
final LocalDateDoubleTimeSeries ts = ImmutableLocalDateDoubleTimeSeries.of(DATES, data);
final LocalDateDoubleTimeSeries rejected = FILTER.evaluate(ts).getRejectedTS();
assertEquals(rejected.size(), 1);
assertEquals(rejected.getTimeAtIndex(0), ts.getTimeAtIndex(0));
assertEquals(rejected.getValueAtIndex(0), ts.getValueAtIndex(0));
}
@Test
public void testSpike() {
final double[] data = Arrays.copyOf(DATA, N);
data[10] = 100.;
LocalDateDoubleTimeSeries ts = ImmutableLocalDateDoubleTimeSeries.of(DATES, data);
FilteredTimeSeries filtered = FILTER.evaluate(ts);
assertSeries(ts, filtered, 10);
data[10] = -100.;
ts = ImmutableLocalDateDoubleTimeSeries.of(DATES, data);
filtered = FILTER.evaluate(ts);
assertSeries(ts, filtered, 10);
}
private void assertSeries(final LocalDateDoubleTimeSeries ts, final FilteredTimeSeries filtered, final int index) {
final LocalDateDoubleTimeSeries rejected = filtered.getRejectedTS();
assertEquals(rejected.size(), 1);
assertEquals(rejected.getTimeAtIndex(0), ts.getTimeAtIndex(index));
assertEquals(rejected.getValueAtIndex(0), ts.getValueAtIndex(index));
assertEquals(filtered.getFilteredTS().size(), 99);
}
}