/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.collect.timeseries;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Collection;
import java.util.OptionalDouble;
import org.testng.annotations.Test;
import com.google.common.primitives.Doubles;
/**
* Test LocalDateDoubleTimeSeriesBuilder.
*/
@Test
public class LocalDateDoubleTimeSeriesBuilderTest {
@Test
public void test_buildEmptySeries() {
assertEquals(LocalDateDoubleTimeSeries.builder().build(), LocalDateDoubleTimeSeries.empty());
}
//-------------------------------------------------------------------------
public void test_get() {
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder()
.put(date(2014, 1, 1), 14)
.put(date(2012, 1, 1), 12)
.put(date(2013, 1, 1), 13);
assertEquals(test.get(date(2012, 1, 1)), OptionalDouble.of(12d));
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(13d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(14d));
assertEquals(test.get(date(2015, 1, 1)), OptionalDouble.empty());
}
//-------------------------------------------------------------------------
public void test_merge_dateValue() {
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.put(date(2013, 1, 1), 2d);
test.merge(date(2013, 1, 1), 3d, Double::sum);
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(5d));
}
public void test_merge_point() {
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.put(date(2013, 1, 1), 2d);
test.merge(LocalDateDoublePoint.of(date(2013, 1, 1), 3d), Double::sum);
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(5d));
}
//-------------------------------------------------------------------------
public void test_putAll_collections() {
Collection<LocalDate> dates = Arrays.asList(date(2013, 1, 1), date(2014, 1, 1));
Collection<Double> values = Doubles.asList(2d, 3d);
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.putAll(dates, values);
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(2d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(3d));
}
public void test_putAll_collection_array() {
Collection<LocalDate> dates = Arrays.asList(date(2013, 1, 1), date(2014, 1, 1));
double[] values = new double[] {2d, 3d};
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.putAll(dates, values);
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(2d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(3d));
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void test_putAll_collectionsMismatch() {
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.putAll(Arrays.asList(date(2014, 1, 1)), Doubles.asList(2d, 3d));
}
//-------------------------------------------------------------------------
public void test_putAll_stream() {
Collection<LocalDate> dates = Arrays.asList(date(2013, 1, 1), date(2014, 1, 1));
Collection<Double> values = Doubles.asList(2d, 3d);
LocalDateDoubleTimeSeries base = LocalDateDoubleTimeSeries.builder().putAll(dates, values).build();
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.put(date(2012, 1, 1), 0d);
test.put(date(2013, 1, 1), 1d);
test.putAll(base.stream());
assertEquals(test.get(date(2012, 1, 1)), OptionalDouble.of(0d));
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(2d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(3d));
}
public void test_putAll_toBuilder() {
Collection<LocalDate> dates = Arrays.asList(date(2013, 1, 1), date(2014, 1, 1));
Collection<Double> values = Doubles.asList(2d, 3d);
LocalDateDoubleTimeSeries base = LocalDateDoubleTimeSeries.builder().putAll(dates, values).build();
LocalDateDoubleTimeSeriesBuilder test = LocalDateDoubleTimeSeries.builder();
test.put(date(2012, 1, 1), 0d);
test.put(date(2013, 1, 1), 1d);
test.putAll(base.toBuilder());
assertEquals(test.get(date(2012, 1, 1)), OptionalDouble.of(0d));
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(2d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(3d));
}
//-------------------------------------------------------------------------
public void test_seriesGetsSorted() {
LocalDateDoubleTimeSeries test = LocalDateDoubleTimeSeries.builder()
.put(date(2014, 1, 1), 14)
.put(date(2012, 1, 1), 12)
.put(date(2013, 1, 1), 13)
.build();
assertEquals(test.size(), 3);
assertEquals(test.getEarliestDate(), date(2012, 1, 1));
assertEquals(test.getLatestDate(), date(2014, 1, 1));
assertEquals(test.get(date(2012, 1, 1)), OptionalDouble.of(12d));
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(13d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(14d));
}
public void test_duplicatesGetOverwritten() {
LocalDateDoubleTimeSeries test = LocalDateDoubleTimeSeries.builder()
.put(date(2014, 1, 1), 12)
.put(date(2014, 1, 1), 14)
.build();
assertEquals(test.size(), 1);
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(14d));
}
public void test_useBuilderToAlterSeries() {
LocalDateDoubleTimeSeries base = LocalDateDoubleTimeSeries.builder()
.put(date(2014, 1, 1), 14)
.put(date(2012, 1, 1), 12)
.put(date(2013, 1, 1), 13)
.build();
LocalDateDoubleTimeSeries test = base.toBuilder()
.put(date(2013, 1, 1), 23)
.put(date(2011, 1, 1), 21)
.build();
assertEquals(test.size(), 4);
assertEquals(test.getEarliestDate(), date(2011, 1, 1));
assertEquals(test.getLatestDate(), date(2014, 1, 1));
// new value
assertEquals(test.get(date(2011, 1, 1)), OptionalDouble.of(21d));
assertEquals(test.get(date(2012, 1, 1)), OptionalDouble.of(12d));
// updated value
assertEquals(test.get(date(2013, 1, 1)), OptionalDouble.of(23d));
assertEquals(test.get(date(2014, 1, 1)), OptionalDouble.of(14d));
}
public void densityChoosesImplementation() {
LocalDateDoubleTimeSeries series1 = LocalDateDoubleTimeSeries.builder()
.put(date(2015, 1, 5), 14) // Monday
.put(date(2015, 1, 12), 12)
.put(date(2015, 1, 19), 13)
.build();
assertEquals(series1.getClass(), SparseLocalDateDoubleTimeSeries.class);
// Now add in a week's worth of data
LocalDateDoubleTimeSeries series2 = series1.toBuilder()
.put(date(2015, 1, 6), 14)
.put(date(2015, 1, 7), 13)
.put(date(2015, 1, 8), 12)
.put(date(2015, 1, 9), 13)
.build();
// Not yet enough as we have 7/11 populated (i.e. below 70%)
assertEquals(series2.getClass(), SparseLocalDateDoubleTimeSeries.class);
// Add in 1 more days giving 8/11 populated
LocalDateDoubleTimeSeries series3 = series2.toBuilder()
.put(date(2015, 1, 13), 11)
.build();
assertEquals(series3.getClass(), DenseLocalDateDoubleTimeSeries.class);
// Now add in a weekend date, which means we have 9/15
LocalDateDoubleTimeSeries series4 = series3.toBuilder()
.put(date(2015, 1, 10), 12) // Saturday
.build();
assertEquals(series4.getClass(), SparseLocalDateDoubleTimeSeries.class);
// Add in 2 new dates giving 11/15
LocalDateDoubleTimeSeries series5 = series4.toBuilder()
.put(date(2015, 1, 14), 11)
.put(date(2015, 1, 15), 10)
.build();
assertEquals(series5.getClass(), DenseLocalDateDoubleTimeSeries.class);
}
//-------------------------------------------------------------------------
private static LocalDate date(int year, int month, int day) {
return LocalDate.of(year, month, day);
}
}