/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics.ircurve;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.DataNotFoundException;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class InMemoryInterpolatedYieldCurveDefinitionMasterTest {
private InMemoryInterpolatedYieldCurveDefinitionMaster _master;
@BeforeMethod
public void init() {
_master = new InMemoryInterpolatedYieldCurveDefinitionMaster();
_master.add(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.USD, null, "1", "A", "L1", "R1", true)));
_master.add(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.GBP, null, "1", "B", "L2", "R2", false)));
_master.add(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.USD, null, "2", "C", "L3", "R3", false)));
_master.add(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.GBP, null, "2", "D", "L4", "R4", true)));
}
@Test
public void testGetDefinition() {
YieldCurveDefinition yc = _master.getDefinition(Currency.USD, "1");
assertNotNull(yc);
assertEquals("A", yc.getInterpolatorName());
assertEquals("L1", yc.getLeftExtrapolatorName());
assertEquals("R1", yc.getRightExtrapolatorName());
assertTrue(yc.isInterpolateYields());
yc = _master.getDefinition(Currency.GBP, "1");
assertNotNull(yc);
assertEquals("B", yc.getInterpolatorName());
assertEquals("L2", yc.getLeftExtrapolatorName());
assertEquals("R2", yc.getRightExtrapolatorName());
assertFalse(yc.isInterpolateYields());
yc = _master.getDefinition(Currency.USD, "2");
assertNotNull(yc);
assertEquals("C", yc.getInterpolatorName());
assertEquals("L3", yc.getLeftExtrapolatorName());
assertEquals("R3", yc.getRightExtrapolatorName());
assertFalse(yc.isInterpolateYields());
yc = _master.getDefinition(Currency.GBP, "2");
assertNotNull(yc);
assertEquals("D", yc.getInterpolatorName());
assertEquals("L4", yc.getLeftExtrapolatorName());
assertEquals("R4", yc.getRightExtrapolatorName());
assertTrue(yc.isInterpolateYields());
}
@Test
public void testGetDefinition_missing() {
assertNull(_master.getDefinition(Currency.USD, "3"));
assertNull(_master.getDefinition(Currency.CHF, "1"));
}
@Test
public void testGetDefinition_instant() {
assertNotNull(_master.getDefinition(Currency.USD, "1", VersionCorrection.ofVersionAsOf(Instant.now())));
}
/**
* Force the system clock to advance by at least 1ms.
*/
private void sleep() {
try {
Thread.sleep(10);
} catch (final InterruptedException e) {
}
}
@Test
public void testGetDefinition_versioned() {
VersionCorrection vc = VersionCorrection.ofVersionAsOf(Instant.now());
sleep();
_master.add(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.GBP, null, "3", "E", "L", "R", true)));
_master.update(new YieldCurveDefinitionDocument(UniqueId.of(_master.getUniqueIdScheme(), "1_GBP"), new YieldCurveDefinition(Currency.GBP, null, "1", "E", "L", "R", false)));
// Expect original data
YieldCurveDefinition yc = _master.getDefinition(Currency.GBP, "3", vc);
assertNull(yc);
yc = _master.getDefinition(Currency.GBP, "1", vc);
assertNotNull(yc);
assertEquals("B", yc.getInterpolatorName());
final Instant nextInstant = Instant.now();
sleep();
_master.remove(UniqueId.of(_master.getUniqueIdScheme(), "3_GBP"));
// Still at original instant - expect original data
yc = _master.getDefinition(Currency.GBP, "3", vc);
assertNull(yc);
yc = _master.getDefinition(Currency.GBP, "1", vc);
assertNotNull(yc);
assertEquals("B", yc.getInterpolatorName());
vc = VersionCorrection.ofVersionAsOf(nextInstant);
// Expect first set of new data
yc = _master.getDefinition(Currency.GBP, "3", vc);
assertNotNull(yc);
assertEquals("E", yc.getInterpolatorName());
yc = _master.getDefinition(Currency.GBP, "1", vc);
assertNotNull(yc);
assertEquals("E", yc.getInterpolatorName());
vc = VersionCorrection.ofVersionAsOf(Instant.now());
// Expect to see the delete
yc = _master.getDefinition(Currency.GBP, "3", vc);
assertNull(yc);
yc = _master.getDefinition(Currency.GBP, "1", vc);
assertNotNull(yc);
assertEquals("E", yc.getInterpolatorName());
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testAdd_duplicate() {
_master.add(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.USD, null, "1", "E", "L1", "R1", true)));
}
@Test
public void testAddOrUpdate_add() {
assertNull(_master.getDefinition(Currency.USD, "3"));
_master.addOrUpdate(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.USD, null, "3", "E", "L1", "R1", true)));
assertNotNull(_master.getDefinition(Currency.USD, "3"));
}
@Test
public void testAddOrUpdate_update() {
YieldCurveDefinition yc = _master.getDefinition(Currency.USD, "1");
assertNotNull(yc);
assertEquals("A", yc.getInterpolatorName());
_master.addOrUpdate(new YieldCurveDefinitionDocument(new YieldCurveDefinition(Currency.USD, null, "1", "E", "L1", "R1", true)));
yc = _master.getDefinition(Currency.USD, "1");
assertNotNull(yc);
assertEquals("E", yc.getInterpolatorName());
}
@Test(expectedExceptions = UnsupportedOperationException.class)
public void testCorrect() {
_master.correct(null);
}
@Test
public void testGet() {
final YieldCurveDefinitionDocument ycdoc = _master.get(UniqueId.of(_master.getUniqueIdScheme(), "1_USD"));
assertNotNull(ycdoc);
final YieldCurveDefinition yc = ycdoc.getYieldCurveDefinition();
assertNotNull(yc);
assertEquals("A", yc.getInterpolatorName());
}
@Test(expectedExceptions = DataNotFoundException.class)
public void testGet_missing() {
_master.get(UniqueId.of(_master.getUniqueIdScheme(), "GBP_3"));
}
@Test(expectedExceptions = DataNotFoundException.class)
public void testGet_deleted() {
_master.remove(UniqueId.of(_master.getUniqueIdScheme(), "USD_1"));
_master.get(UniqueId.of(_master.getUniqueIdScheme(), "USD_1"));
}
@Test
public void testRemove() {
assertNotNull(_master.getDefinition(Currency.USD, "1"));
_master.remove(UniqueId.of(_master.getUniqueIdScheme(), "1_USD"));
assertNull(_master.getDefinition(Currency.USD, "1"));
}
@Test(expectedExceptions = DataNotFoundException.class)
public void testRemove_missing() {
_master.remove(UniqueId.of(_master.getUniqueIdScheme(), "3_USD"));
}
@Test(expectedExceptions = DataNotFoundException.class)
public void testUpdate_missing() {
_master.update(new YieldCurveDefinitionDocument(UniqueId.of(_master.getUniqueIdScheme(), "3_USD"), new YieldCurveDefinition(Currency.USD, null, "3", "E", "L1", "R1", true)));
}
}