/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.historicaltimeseries.impl; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertSame; import java.util.List; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import com.google.common.base.Supplier; import com.opengamma.DataNotFoundException; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalIdBundleWithDates; import com.opengamma.id.ObjectId; import com.opengamma.id.ObjectIdSupplier; import com.opengamma.id.UniqueId; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesGetFilter; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchRequest; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchResult; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeries; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.timeseries.date.localdate.ImmutableLocalDateDoubleTimeSeries; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.util.test.TestGroup; /** * Test {@link InMemoryHistoricalTimeSeriesMaster}. */ @Test(groups = TestGroup.UNIT) public class InMemoryHistoricalTimeSeriesMasterTest { // TODO Move the logical tests from here to the generic SecurityMasterTestCase then we can just extend from that private static final UniqueId OTHER_UID = UniqueId.of("U", "1"); private static final ExternalId ID1 = ExternalId.of("A", "B"); private static final ExternalId ID2 = ExternalId.of("A", "C"); private static final ExternalIdBundle BUNDLE1 = ExternalIdBundle.of(ID1); private static final ExternalIdBundle BUNDLE2 = ExternalIdBundle.of(ID2); private InMemoryHistoricalTimeSeriesMaster testEmpty; private InMemoryHistoricalTimeSeriesMaster testPopulated; private HistoricalTimeSeriesInfoDocument doc1; private HistoricalTimeSeriesInfoDocument doc2; private ManageableHistoricalTimeSeriesInfo info1; private ManageableHistoricalTimeSeriesInfo info2; @BeforeMethod public void setUp() { testEmpty = new InMemoryHistoricalTimeSeriesMaster(new ObjectIdSupplier("Test")); testPopulated = new InMemoryHistoricalTimeSeriesMaster(new ObjectIdSupplier("Test")); info1 = new ManageableHistoricalTimeSeriesInfo(); info1.setName("Name1"); info1.setDataField("DF1"); info1.setDataSource("DS1"); info1.setDataProvider("DP1"); info1.setObservationTime("OT1"); info1.setExternalIdBundle(ExternalIdBundleWithDates.of(BUNDLE1)); doc1 = new HistoricalTimeSeriesInfoDocument(); doc1.setInfo(info1); doc1 = testPopulated.add(doc1); info2 = new ManageableHistoricalTimeSeriesInfo(); info2.setName("Name2"); info2.setDataField("DF2"); info2.setDataSource("DS2"); info2.setDataProvider("DP2"); info2.setObservationTime("OT2"); info2.setExternalIdBundle(ExternalIdBundleWithDates.of(BUNDLE2)); doc2 = new HistoricalTimeSeriesInfoDocument(); doc2.setInfo(info2); doc2 = testPopulated.add(doc2); } //------------------------------------------------------------------------- @Test(expectedExceptions = IllegalArgumentException.class) public void test_constructor_nullSupplier() { new InMemoryHistoricalTimeSeriesMaster((Supplier<ObjectId>) null); } public void test_defaultSupplier() { InMemoryHistoricalTimeSeriesMaster master = new InMemoryHistoricalTimeSeriesMaster(); HistoricalTimeSeriesInfoDocument doc = new HistoricalTimeSeriesInfoDocument(); doc.setInfo(info1); HistoricalTimeSeriesInfoDocument added = master.add(doc); assertEquals("MemHts", added.getUniqueId().getScheme()); } public void test_alternateSupplier() { InMemoryHistoricalTimeSeriesMaster master = new InMemoryHistoricalTimeSeriesMaster(new ObjectIdSupplier("Hello")); HistoricalTimeSeriesInfoDocument doc = new HistoricalTimeSeriesInfoDocument(); doc.setInfo(info1); HistoricalTimeSeriesInfoDocument added = master.add(doc); assertEquals("Hello", added.getUniqueId().getScheme()); } //------------------------------------------------------------------------- public void test_search_emptyMaster() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); HistoricalTimeSeriesInfoSearchResult result = testEmpty.search(request); assertEquals(0, result.getPaging().getTotalItems()); assertEquals(0, result.getDocuments().size()); } public void test_search_populatedMaster_all() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(2, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(2, docs.size()); assertEquals(true, docs.contains(doc1)); assertEquals(true, docs.contains(doc2)); } public void test_search_populatedMaster_filterByBundle() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(BUNDLE1); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); assertEquals(1, result.getDocuments().size()); assertEquals(true, result.getDocuments().contains(doc1)); } public void test_search_populatedMaster_filterByBundle_both() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.addExternalIds(BUNDLE1); request.addExternalIds(BUNDLE2); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(2, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(2, docs.size()); assertEquals(true, docs.contains(doc1)); assertEquals(true, docs.contains(doc2)); } public void test_search_popluatedMaster_filterByExternalIdValue() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setExternalIdValue("B"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc1)); } public void test_search_popluatedMaster_filterByExternalIdValue_case() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setExternalIdValue("b"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc1)); } public void test_search_populatedMaster_filterByName() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setName("*ame2"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc2)); } public void test_search_populatedMaster_filterByDataField() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setDataField("DF2"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc2)); } public void test_search_populatedMaster_filterByDataSource() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setDataSource("DS2"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc2)); } public void test_search_populatedMaster_filterByDataProvider() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setDataProvider("DP2"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc2)); } public void test_search_populatedMaster_filterByObservationTime() { HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); request.setObservationTime("OT2"); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc2)); } //------------------------------------------------------------------------- @Test(expectedExceptions = DataNotFoundException.class) public void test_get_emptyMaster() { assertNull(testEmpty.get(OTHER_UID)); } public void test_get_populatedMaster() { assertSame(doc1, testPopulated.get(doc1.getUniqueId())); assertSame(doc2, testPopulated.get(doc2.getUniqueId())); } //------------------------------------------------------------------------- public void test_add_emptyMaster() { HistoricalTimeSeriesInfoDocument doc = new HistoricalTimeSeriesInfoDocument(); doc.setInfo(info1); HistoricalTimeSeriesInfoDocument added = testEmpty.add(doc); assertNotNull(added.getVersionFromInstant()); assertNotNull(added.getCorrectionFromInstant()); assertEquals(added.getVersionFromInstant(), added.getCorrectionFromInstant()); assertEquals("Test", added.getUniqueId().getScheme()); added.setUniqueId(null); added.getInfo().setTimeSeriesObjectId(null); assertEquals(info1, added.getInfo()); } //------------------------------------------------------------------------- @Test(expectedExceptions = DataNotFoundException.class) public void test_update_emptyMaster() { HistoricalTimeSeriesInfoDocument doc = new HistoricalTimeSeriesInfoDocument(); doc.setInfo(info1); doc.setUniqueId(OTHER_UID); testEmpty.update(doc); } public void test_update_populatedMaster() { HistoricalTimeSeriesInfoDocument doc = new HistoricalTimeSeriesInfoDocument(); doc.setInfo(info1); doc.setUniqueId(doc1.getUniqueId()); HistoricalTimeSeriesInfoDocument updated = testPopulated.update(doc); assertEquals(doc1.getUniqueId(), updated.getUniqueId()); assertNotNull(doc1.getVersionFromInstant()); assertNotNull(updated.getVersionFromInstant()); } //------------------------------------------------------------------------- @Test(expectedExceptions = DataNotFoundException.class) public void test_remove_emptyMaster() { testEmpty.remove(OTHER_UID); } public void test_remove_populatedMaster() { testPopulated.remove(doc1.getUniqueId()); HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest(); HistoricalTimeSeriesInfoSearchResult result = testPopulated.search(request); assertEquals(1, result.getPaging().getTotalItems()); List<HistoricalTimeSeriesInfoDocument> docs = result.getDocuments(); assertEquals(1, docs.size()); assertEquals(true, docs.contains(doc2)); } //------------------------------------------------------------------------- @Test(expectedExceptions = DataNotFoundException.class) public void test_getTS_UID_otherId() { testEmpty.getTimeSeries(OTHER_UID); } public void test_points_update_correct() { LocalDate[] dates = {LocalDate.of(2011, 1, 1), LocalDate.of(2011, 1, 2)}; double[] values = {1.1d, 2.2d}; LocalDateDoubleTimeSeries input = ImmutableLocalDateDoubleTimeSeries.of(dates, values); UniqueId uniqueId = testPopulated.updateTimeSeriesDataPoints(doc1.getUniqueId(), input); assertEquals(doc1.getUniqueId().getObjectId(), uniqueId.getObjectId()); ManageableHistoricalTimeSeries test = testPopulated.getTimeSeries(uniqueId); assertEquals(uniqueId, test.getUniqueId()); assertEquals(input, test.getTimeSeries()); LocalDate[] dates2 = {LocalDate.of(2011, 1, 1), LocalDate.of(2011, 1, 3)}; double[] values2 = {1.5d, 2.5d}; LocalDateDoubleTimeSeries input2 = ImmutableLocalDateDoubleTimeSeries.of(dates2, values2); UniqueId uniqueId2 = testPopulated.correctTimeSeriesDataPoints(doc1.getUniqueId(), input2); assertEquals(doc1.getUniqueId().getObjectId(), uniqueId2.getObjectId()); LocalDate[] expectedDates = {LocalDate.of(2011, 1, 1), LocalDate.of(2011, 1, 2), LocalDate.of(2011, 1, 3)}; double[] expectedValues = {1.5d, 2.2d, 2.5d}; LocalDateDoubleTimeSeries expected = ImmutableLocalDateDoubleTimeSeries.of(expectedDates, expectedValues); ManageableHistoricalTimeSeries test2 = testPopulated.getTimeSeries(uniqueId); assertEquals(uniqueId, test2.getUniqueId()); assertEquals(expected, test2.getTimeSeries()); } public void test_points_update_remove() { LocalDate[] dates = {LocalDate.of(2011, 1, 1), LocalDate.of(2011, 1, 2)}; double[] values = {1.1d, 2.2d}; LocalDateDoubleTimeSeries input = ImmutableLocalDateDoubleTimeSeries.of(dates, values); UniqueId uniqueId = testPopulated.updateTimeSeriesDataPoints(doc1.getUniqueId(), input); assertEquals(doc1.getUniqueId().getObjectId(), uniqueId.getObjectId()); ManageableHistoricalTimeSeries test = testPopulated.getTimeSeries(uniqueId); assertEquals(uniqueId, test.getUniqueId()); assertEquals(input, test.getTimeSeries()); UniqueId uniqueId2 = testPopulated.removeTimeSeriesDataPoints(doc1.getUniqueId(), LocalDate.of(2011, 1, 2), null); assertEquals(doc1.getUniqueId().getObjectId(), uniqueId2.getObjectId()); LocalDate[] expectedDates = {LocalDate.of(2011, 1, 1)}; double[] expectedValues = {1.1d}; LocalDateDoubleTimeSeries expected = ImmutableLocalDateDoubleTimeSeries.of(expectedDates, expectedValues); ManageableHistoricalTimeSeries test2 = testPopulated.getTimeSeries(uniqueId); assertEquals(uniqueId, test2.getUniqueId()); assertEquals(expected, test2.getTimeSeries()); } public void test_points_getFilter() { // Set up HTS for comparison purposes LocalDate[] dates = { LocalDate.of(2011, 1, 1), LocalDate.of(2011, 1, 2), LocalDate.of(2011, 1, 3), LocalDate.of(2011, 1, 5), LocalDate.of(2011, 1, 6), LocalDate.of(2011, 1, 8) }; double[] values = { 1.0d, 1.1d, 1.3d, 1.2d, 2.2d, 2.0d }; LocalDateDoubleTimeSeries input = ImmutableLocalDateDoubleTimeSeries.of(dates, values); testPopulated.updateTimeSeriesDataPoints(doc1.getUniqueId(), input); ManageableHistoricalTimeSeries reference = testPopulated.getTimeSeries(doc1.getUniqueId()); // Get entire series using blank filter HistoricalTimeSeriesGetFilter filter = HistoricalTimeSeriesGetFilter.ofAll(); ManageableHistoricalTimeSeries test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(reference.getTimeSeries(), test.getTimeSeries()); assertEquals(input, test.getTimeSeries()); // Get filtered by time, open-ended end filter.setEarliestDate(reference.getTimeSeries().getTimeAtIndex(1)); // exclude first point test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(reference.getTimeSeries().size() - 1, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getValueAtIndex(1), test.getTimeSeries().getEarliestValue()); assertEquals(reference.getTimeSeries().getTimeAtIndex(1), test.getTimeSeries().getEarliestTime()); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 1), test.getTimeSeries().getLatestValue()); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 1), test.getTimeSeries().getLatestTime()); // Get filtered by time, closed at both ends filter.setLatestDate(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 2)); // exclude last point test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(reference.getTimeSeries().size() - 2, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getValueAtIndex(1), test.getTimeSeries().getEarliestValue()); assertEquals(reference.getTimeSeries().getTimeAtIndex(1), test.getTimeSeries().getEarliestTime()); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getLatestValue()); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getLatestTime()); // Get filtered by time, open-ended start filter.setEarliestDate(null); test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(reference.getTimeSeries().size() - 1, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getValueAtIndex(0), test.getTimeSeries().getEarliestValue()); assertEquals(reference.getTimeSeries().getTimeAtIndex(0), test.getTimeSeries().getEarliestTime()); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getLatestValue()); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getLatestTime()); // Get filtered by +ve maxPoints, open-ended start filter.setMaxPoints(2); // get earliest two points test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(2, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getTimeAtIndex(0), test.getTimeSeries().getTimeAtIndex(0)); assertEquals(reference.getTimeSeries().getValueAtIndex(0), test.getTimeSeries().getValueAtIndex(0)); assertEquals(reference.getTimeSeries().getTimeAtIndex(1), test.getTimeSeries().getTimeAtIndex(1)); assertEquals(reference.getTimeSeries().getValueAtIndex(1), test.getTimeSeries().getValueAtIndex(1)); // Get filtered by +ve maxPoints, closed date range filter.setEarliestDate(reference.getTimeSeries().getTimeAtIndex(1)); // exclude first point test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(2, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getTimeAtIndex(1), test.getTimeSeries().getTimeAtIndex(0)); assertEquals(reference.getTimeSeries().getValueAtIndex(1), test.getTimeSeries().getValueAtIndex(0)); assertEquals(reference.getTimeSeries().getTimeAtIndex(2), test.getTimeSeries().getTimeAtIndex(1)); assertEquals(reference.getTimeSeries().getValueAtIndex(2), test.getTimeSeries().getValueAtIndex(1)); // Get filtered by -ve maxPoints, closed date range filter.setMaxPoints(-2); // get latest two points test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(2, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 3), test.getTimeSeries().getTimeAtIndex(0)); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 3), test.getTimeSeries().getValueAtIndex(0)); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getTimeAtIndex(1)); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getValueAtIndex(1)); // Get filtered by -ve maxPoints, open-ended end filter.setLatestDate(null); test = testPopulated.getTimeSeries(doc1.getUniqueId(), filter); assertEquals(2, test.getTimeSeries().size()); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getTimeAtIndex(0)); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 2), test.getTimeSeries().getValueAtIndex(0)); assertEquals(reference.getTimeSeries().getTimeAtIndex(reference.getTimeSeries().size() - 1), test.getTimeSeries().getTimeAtIndex(1)); assertEquals(reference.getTimeSeries().getValueAtIndex(reference.getTimeSeries().size() - 1), test.getTimeSeries().getValueAtIndex(1)); } }