/** * 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 org.testng.annotations.Test; import org.threeten.bp.LocalDate; import cern.colt.Arrays; 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 ZeroValueDoubleTimeSeriesFilterTest { private static final RandomEngine RANDOM = new MersenneTwister64(MersenneTwister.DEFAULT_SEED); private static final ZeroValueDoubleTimeSeriesFilter SMALL_ZERO_FILTER = new ZeroValueDoubleTimeSeriesFilter(); private static final ZeroValueDoubleTimeSeriesFilter LARGE_ZERO_FILTER = new ZeroValueDoubleTimeSeriesFilter(1e-3); private static final LocalDateDoubleTimeSeries EMPTY_SERIES = ImmutableLocalDateDoubleTimeSeries.EMPTY_SERIES; @Test(expectedExceptions = IllegalArgumentException.class) public void testNullTS() { SMALL_ZERO_FILTER.evaluate((LocalDateDoubleTimeSeries) null); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNegativeZero() { new ZeroValueDoubleTimeSeriesFilter(-1e-12); } @Test(expectedExceptions = IllegalArgumentException.class) public void testSetNegativeZero() { SMALL_ZERO_FILTER.setZero(-1e-12); } @Test public void testEmptyTS() { final FilteredTimeSeries filtered = SMALL_ZERO_FILTER.evaluate(EMPTY_SERIES); assertEquals(filtered.getFilteredTS(), EMPTY_SERIES); assertEquals(filtered.getRejectedTS(), EMPTY_SERIES); } @Test public void test() { final int n = 100; final LocalDate[] dates = new LocalDate[n]; final double[] data = new double[n]; LocalDate[] smallZeroFilteredDates = new LocalDate[n]; double[] smallZeroFilteredData = new double[n]; LocalDate[] smallZeroRejectedDates = new LocalDate[n]; double[] smallZeroRejectedData = new double[n]; LocalDate[] largeZeroFilteredDates = new LocalDate[n]; double[] largeZeroFilteredData = new double[n]; LocalDate[] largeZeroRejectedDates = new LocalDate[n]; double[] largeZeroRejectedData = new double[n]; double d; final Double smallValue = 1e-4; int h, j = 0, k = 0, l = 0, m = 0; for (int i = 0; i < 100; i++) { d = RANDOM.nextDouble(); h = i + 1; dates[i] = LocalDate.ofEpochDay(h); if (d < 0.3) { if (d > 0.25) { data[i] = smallValue; largeZeroRejectedDates[j] = LocalDate.ofEpochDay(h); largeZeroRejectedData[j++] = smallValue; smallZeroFilteredDates[k] = LocalDate.ofEpochDay(h); smallZeroFilteredData[k++] = smallValue; } else { data[i] = 0; largeZeroRejectedDates[j] = LocalDate.ofEpochDay(h); largeZeroRejectedData[j++] = 0; smallZeroRejectedDates[l] = LocalDate.ofEpochDay(h); smallZeroRejectedData[l++] = 0; } } else { data[i] = d; smallZeroFilteredDates[k] = LocalDate.ofEpochDay(h); smallZeroFilteredData[k++] = d; largeZeroFilteredDates[m] = LocalDate.ofEpochDay(h); largeZeroFilteredData[m++] = d; } } smallZeroFilteredDates = trimToCapacity(smallZeroFilteredDates, k); smallZeroFilteredData = Arrays.trimToCapacity(smallZeroFilteredData, k); smallZeroRejectedDates = trimToCapacity(smallZeroRejectedDates, l); smallZeroRejectedData = Arrays.trimToCapacity(smallZeroRejectedData, l); largeZeroFilteredDates = trimToCapacity(largeZeroFilteredDates, m); largeZeroFilteredData = Arrays.trimToCapacity(largeZeroFilteredData, m); largeZeroRejectedDates = trimToCapacity(largeZeroRejectedDates, j); largeZeroRejectedData = Arrays.trimToCapacity(largeZeroRejectedData, j); final LocalDateDoubleTimeSeries ts = ImmutableLocalDateDoubleTimeSeries.of(dates, data); FilteredTimeSeries result = SMALL_ZERO_FILTER.evaluate(ts); assertEquals(result, new FilteredTimeSeries(ImmutableLocalDateDoubleTimeSeries.of(smallZeroFilteredDates, smallZeroFilteredData), ImmutableLocalDateDoubleTimeSeries.of(smallZeroRejectedDates, smallZeroRejectedData))); result = LARGE_ZERO_FILTER.evaluate(ts); assertEquals(result, new FilteredTimeSeries(ImmutableLocalDateDoubleTimeSeries.of(largeZeroFilteredDates, largeZeroFilteredData), ImmutableLocalDateDoubleTimeSeries.of(largeZeroRejectedDates, largeZeroRejectedData))); } private LocalDate[] trimToCapacity(final LocalDate[] source, final int k) { final LocalDate[] result = new LocalDate[k]; System.arraycopy(source, 0, result, 0, k); return result; } }