package com.opengamma.sesame.web.curves; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.threeten.bp.Period; import org.threeten.bp.ZonedDateTime; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.analytics.financial.instrument.index.IborIndex; import com.opengamma.analytics.financial.instrument.index.IndexON; import com.opengamma.analytics.financial.model.interestrate.curve.DiscountCurve; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve; import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle; import com.opengamma.analytics.financial.provider.description.interestrate.MulticurveProviderDiscount; import com.opengamma.analytics.math.curve.ConstantDoublesCurve; import com.opengamma.analytics.math.curve.NodalDoublesCurve; import com.opengamma.engine.marketdata.spec.MarketDataSpecification; import com.opengamma.financial.convention.businessday.BusinessDayConventions; import com.opengamma.financial.convention.daycount.DayCounts; import com.opengamma.sesame.MulticurveBundle; import com.opengamma.sesame.marketdata.MarketDataEnvironment; import com.opengamma.sesame.marketdata.MulticurveId; import com.opengamma.sesame.marketdata.SingleValueRequirement; import com.opengamma.sesame.marketdata.builders.MarketDataEnvironmentFactory; import com.opengamma.sesame.marketdata.scenarios.SingleScenarioDefinition; import com.opengamma.util.money.Currency; public class CurveBundleResourceTest { private CurveBundleResource _resource; @BeforeClass public void setup() { MarketDataEnvironmentFactory factory = mock(MarketDataEnvironmentFactory.class); _resource = new CurveBundleResource(factory); MulticurveId multicurveId = MulticurveId.of("bundle-name"); SingleValueRequirement requirement = SingleValueRequirement.of(multicurveId); MulticurveId badMulticurveId = MulticurveId.of("bad-bundle-name"); SingleValueRequirement badRequirement = SingleValueRequirement.of(badMulticurveId); MarketDataEnvironment env = mock(MarketDataEnvironment.class); when(factory.build(any(MarketDataEnvironment.class), any(Set.class), any(SingleScenarioDefinition.class), any(MarketDataSpecification.class), any(ZonedDateTime.class))).thenReturn(env); FXMatrix matrix = new FXMatrix(); Map<Currency, YieldAndDiscountCurve> discounting = new LinkedHashMap<>(); NodalDoublesCurve doublesCurve = NodalDoublesCurve.from(new double[]{0.1, 0.2, 0.3}, new double[]{0.4, 0.5, 0.6}); ConstantDoublesCurve constantDoublesCurve = ConstantDoublesCurve.from(0.1); discounting.put(Currency.USD, new YieldCurve("A", doublesCurve)); discounting.put(Currency.EUR, new DiscountCurve("B", doublesCurve)); Map<IborIndex, YieldAndDiscountCurve> ibor = new LinkedHashMap<>(); ibor.put(new IborIndex(Currency.USD, Period.ofMonths(3), 0, DayCounts.ACT_360, BusinessDayConventions.FOLLOWING, false, "C-Index"), new YieldCurve("C", doublesCurve)); ibor.put(new IborIndex(Currency.EUR, Period.ofMonths(6), 1, DayCounts.ACT_360, BusinessDayConventions.FOLLOWING, false, "D-Index"), new YieldCurve("D", doublesCurve)); Map<IndexON, YieldAndDiscountCurve> overnight = new LinkedHashMap<>(); overnight.put(new IndexON("NAME1", Currency.USD, DayCounts.ACT_360, 1), new YieldCurve("E", doublesCurve)); overnight.put(new IndexON("NAME2", Currency.EUR, DayCounts.ACT_360, 0), new YieldCurve("F", doublesCurve)); MulticurveProviderDiscount provider = new MulticurveProviderDiscount(discounting, ibor, overnight, matrix); Map<Currency, YieldAndDiscountCurve> badDiscounting = new LinkedHashMap<>(); badDiscounting.put(Currency.USD, new YieldCurve("G", constantDoublesCurve)); MulticurveProviderDiscount badProvider = new MulticurveProviderDiscount(badDiscounting, ibor, overnight, matrix); MulticurveBundle bundle = new MulticurveBundle(provider, new CurveBuildingBlockBundle()); MulticurveBundle badBundle = new MulticurveBundle(badProvider, new CurveBuildingBlockBundle()); ImmutableMap<SingleValueRequirement, MulticurveBundle> data = ImmutableMap.of(requirement, bundle, badRequirement, badBundle); when(env.getData()).thenReturn(ImmutableMap.<SingleValueRequirement, Object>copyOf(data)); } @Test(expectedExceptions = IllegalArgumentException.class) public void testError() { _resource.buildCurveBundle("bad-bundle-name", "live:bloomberg"); } @Test public void test() { String calculate = _resource.buildCurveBundle("bundle-name", "live:bloomberg"); JsonParser parser = new JsonParser(); JsonObject o = (JsonObject)parser.parse(calculate); JsonElement discounting = o.get("discounting"); JsonElement usd = discounting.getAsJsonObject().get("USD"); assertThat(usd.getAsJsonObject().get("name").getAsString(), is("A")); testCurveX(usd.getAsJsonObject().get("x").getAsJsonArray()); testCurveY(usd.getAsJsonObject().get("y").getAsJsonArray()); JsonElement eur = discounting.getAsJsonObject().get("EUR"); assertThat(eur.getAsJsonObject().get("name").getAsString(), is("B")); testCurveX(eur.getAsJsonObject().get("x").getAsJsonArray()); testCurveY(eur.getAsJsonObject().get("y").getAsJsonArray()); JsonElement forwardIbor = o.get("forwardIbor"); JsonElement c = forwardIbor.getAsJsonObject().get("C-Index"); assertThat(c.getAsJsonObject().get("name").getAsString(), is("C")); testCurveX(c.getAsJsonObject().get("x").getAsJsonArray()); testCurveY(c.getAsJsonObject().get("y").getAsJsonArray()); JsonElement d = forwardIbor.getAsJsonObject().get("D-Index"); assertThat(d.getAsJsonObject().get("name").getAsString(), is("D")); testCurveX(d.getAsJsonObject().get("x").getAsJsonArray()); testCurveY(d.getAsJsonObject().get("y").getAsJsonArray()); JsonElement forwardOn = o.get("forwardOn"); JsonElement name1 = forwardOn.getAsJsonObject().get("NAME1-USD-Actual/360"); assertThat(name1.getAsJsonObject().get("name").getAsString(), is("E")); testCurveX(name1.getAsJsonObject().get("x").getAsJsonArray()); testCurveY(name1.getAsJsonObject().get("y").getAsJsonArray()); JsonElement name2 = forwardOn.getAsJsonObject().get("NAME2-EUR-Actual/360"); assertThat(name2.getAsJsonObject().get("name").getAsString(), is("F")); testCurveX(name2.getAsJsonObject().get("x").getAsJsonArray()); testCurveY(name2.getAsJsonObject().get("y").getAsJsonArray()); } private void testCurveX(JsonArray array) { assertThat(array.get(0).getAsDouble(), is(0.1)); assertThat(array.get(1).getAsDouble(), is(0.2)); assertThat(array.get(2).getAsDouble(), is(0.3)); } private void testCurveY(JsonArray array) { assertThat(array.get(0).getAsDouble(), is(0.4)); assertThat(array.get(1).getAsDouble(), is(0.5)); assertThat(array.get(2).getAsDouble(), is(0.6)); } }