/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import org.threeten.bp.OffsetTime; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.opengamma.core.config.ConfigSource; import com.opengamma.core.config.impl.ConfigItem; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.core.position.Counterparty; import com.opengamma.core.position.Trade; import com.opengamma.core.position.impl.SimpleCounterparty; import com.opengamma.core.position.impl.SimpleTrade; import com.opengamma.core.security.SecuritySource; import com.opengamma.financial.analytics.curve.CurveConstructionConfiguration; import com.opengamma.financial.analytics.curve.CurveGroupConfiguration; import com.opengamma.financial.analytics.curve.exposure.CurrencyExposureFunction; import com.opengamma.financial.analytics.curve.exposure.ExposureFunction; import com.opengamma.financial.analytics.curve.exposure.ExposureFunctions; import com.opengamma.financial.analytics.curve.exposure.SecurityTypeExposureFunction; import com.opengamma.financial.security.fra.FRASecurity; import com.opengamma.id.ExternalId; import com.opengamma.id.UniqueId; import com.opengamma.master.config.ConfigMaster; import com.opengamma.master.config.ConfigMasterUtils; import com.opengamma.master.config.impl.InMemoryConfigMaster; import com.opengamma.master.config.impl.MasterConfigSource; import com.opengamma.master.security.impl.InMemorySecurityMaster; import com.opengamma.master.security.impl.MasterSecuritySource; import com.opengamma.service.ServiceContext; import com.opengamma.service.ThreadLocalServiceContext; import com.opengamma.service.VersionCorrectionProvider; import com.opengamma.sesame.engine.FixedInstantVersionCorrectionProvider; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; /** * Unit test for MarketExposureSelector. */ @Test(groups = TestGroup.UNIT) public class MarketExposureSelectorTest { @Test public void testEmptyCurveConfigs() { ConfigMaster configMaster = new InMemoryConfigMaster(); SecuritySource securitySource = new MasterSecuritySource(new InMemorySecurityMaster()); String name = "test"; List<String> exposureFunctions = Lists.newArrayList(CurrencyExposureFunction.NAME); Map<ExternalId, String> idsToNames = Maps.newHashMap(); ExposureFunctions exposures = new ExposureFunctions(name, exposureFunctions, idsToNames); ConfigMasterUtils.storeByName(configMaster, ConfigItem.of(exposures)); MarketExposureSelector selector = new MarketExposureSelector(exposures, securitySource); FRASecurity security = getFRASecurity(); Trade trade = new SimpleTrade(security, BigDecimal.ONE, new SimpleCounterparty(ExternalId.of(Counterparty.DEFAULT_SCHEME, "TEST")), LocalDate.now(), OffsetTime.now()); Set<CurveConstructionConfiguration> configs = selector.determineCurveConfigurations(trade); assertTrue("Expected curve configs to be empty", configs.isEmpty()); configs = selector.findCurveConfigurationsForSecurity(security); assertTrue("Expected curve configs to be empty", configs.isEmpty()); } @Test public void testMultipleCurveConfigs() { ConfigMaster configMaster = new InMemoryConfigMaster(); ConfigSource configSource = new MasterConfigSource(configMaster); SecuritySource securitySource = new MasterSecuritySource(new InMemorySecurityMaster()); FRASecurity security = getFRASecurity(); String name = "test"; List<String> exposureFunctions = Lists.newArrayList(SecurityTypeExposureFunction.NAME, CurrencyExposureFunction.NAME); Map<ExternalId, String> idsToNames = new HashMap<>(); String securityTypeCurveConfigName = "SecurityTypeConfig"; idsToNames.put(ExternalId.of(ExposureFunction.SECURITY_IDENTIFIER, security.getSecurityType()), securityTypeCurveConfigName); String currencyCurveConfigName = "CurrencyConfig"; idsToNames.put(ExternalId.of(Currency.OBJECT_SCHEME, security.getCurrency().getCode()), currencyCurveConfigName); ExposureFunctions exposures = new ExposureFunctions(name, exposureFunctions, idsToNames); ConfigMasterUtils.storeByName(configMaster, ConfigItem.of(exposures)); CurveConstructionConfiguration securityTypeCurveConfig = new CurveConstructionConfiguration(securityTypeCurveConfigName, new ArrayList<CurveGroupConfiguration>(), new ArrayList<String>()); ConfigMasterUtils.storeByName(configMaster, ConfigItem.of(securityTypeCurveConfig)); CurveConstructionConfiguration currencyCurveConfig = new CurveConstructionConfiguration(currencyCurveConfigName, new ArrayList<CurveGroupConfiguration>(), new ArrayList<String>()); ConfigMasterUtils.storeByName(configMaster, ConfigItem.of(currencyCurveConfig)); /* This must be called after saving config instances, otherwise the version correction provider won't find them */ ImmutableMap.Builder<Class<?>, Object> builder = ImmutableMap.builder(); builder.put(ConfigSource.class, configSource); builder.put(SecuritySource.class, securitySource); ServiceContext serviceContext = ServiceContext .of(builder.build()) .with(VersionCorrectionProvider.class, new FixedInstantVersionCorrectionProvider()); ThreadLocalServiceContext.init(serviceContext); MarketExposureSelector selector = new MarketExposureSelector(exposures, securitySource); Trade trade = new SimpleTrade(security, BigDecimal.ONE, new SimpleCounterparty(ExternalId.of(Counterparty.DEFAULT_SCHEME, "TEST")), LocalDate.now(), OffsetTime.now()); Set<CurveConstructionConfiguration> configs = selector.determineCurveConfigurations(trade); assertEquals("Expected single curve config", 1, configs.size()); assertTrue("Expected configs to contain security type config", configs.contains(securityTypeCurveConfig)); assertFalse("Expected configs to not contain currency config", configs.contains(currencyCurveConfig)); } private static FRASecurity getFRASecurity() { FRASecurity security = new FRASecurity(Currency.USD, ExternalId.of("Test", "US"), DateUtils.getUTCDate(2013, 3, 1), DateUtils.getUTCDate(2013, 6, 1), 0.02, 1000, ExternalSchemes.bloombergTickerSecurityId("US0003 Index"), DateUtils.getUTCDate(2013, 6, 1)); security.setUniqueId(UniqueId.of(UniqueId.EXTERNAL_SCHEME.getName(), "1234")); return security; } }