/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.basics.index; import static com.opengamma.strata.basics.currency.Currency.EUR; import static com.opengamma.strata.basics.currency.Currency.GBP; import static com.opengamma.strata.basics.date.HolidayCalendarIds.GBLO; import static com.opengamma.strata.basics.date.HolidayCalendarIds.NO_HOLIDAYS; import static com.opengamma.strata.basics.index.FxIndices.EUR_CHF_ECB; import static com.opengamma.strata.collect.TestHelper.assertJodaConvert; import static com.opengamma.strata.collect.TestHelper.assertSerialization; import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg; import static com.opengamma.strata.collect.TestHelper.coverImmutableBean; import static com.opengamma.strata.collect.TestHelper.coverPrivateConstructor; import static com.opengamma.strata.collect.TestHelper.date; import static org.testng.Assert.assertEquals; import org.joda.beans.ImmutableBean; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import com.opengamma.strata.basics.ReferenceData; import com.opengamma.strata.basics.currency.CurrencyPair; import com.opengamma.strata.basics.date.DaysAdjustment; /** * Test {@link FxIndex}. */ @Test public class FxIndexTest { private static final ReferenceData REF_DATA = ReferenceData.standard(); //------------------------------------------------------------------------- @DataProvider(name = "name") static Object[][] data_name() { return new Object[][] { {FxIndices.EUR_CHF_ECB, "EUR/CHF-ECB"}, {FxIndices.EUR_GBP_ECB, "EUR/GBP-ECB"}, {FxIndices.EUR_JPY_ECB, "EUR/JPY-ECB"}, {FxIndices.EUR_USD_ECB, "EUR/USD-ECB"}, {FxIndices.USD_CHF_WM, "USD/CHF-WM"}, {FxIndices.EUR_USD_WM, "EUR/USD-WM"}, {FxIndices.GBP_USD_WM, "GBP/USD-WM"}, {FxIndices.USD_JPY_WM, "USD/JPY-WM"}, }; } @Test(dataProvider = "name") public void test_name(FxIndex convention, String name) { assertEquals(convention.getName(), name); } @Test(dataProvider = "name") public void test_toString(FxIndex convention, String name) { assertEquals(convention.toString(), name); } @Test(dataProvider = "name") public void test_of_lookup(FxIndex convention, String name) { assertEquals(FxIndex.of(name), convention); } @Test(dataProvider = "name") public void test_extendedEnum(FxIndex convention, String name) { ImmutableMap<String, FxIndex> map = FxIndex.extendedEnum().lookupAll(); assertEquals(map.get(name), convention); } public void test_of_lookup_notFound() { assertThrowsIllegalArg(() -> FxIndex.of("Rubbish")); } public void test_of_lookup_null() { assertThrowsIllegalArg(() -> FxIndex.of((String) null)); } //------------------------------------------------------------------------- public void test_ecb_eur_gbp_dates() { FxIndex test = FxIndices.EUR_GBP_ECB; assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 13), REF_DATA), date(2014, 10, 15)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 15), REF_DATA), date(2014, 10, 13)); // weekend assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 16), REF_DATA), date(2014, 10, 20)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 20), REF_DATA), date(2014, 10, 16)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 17), REF_DATA), date(2014, 10, 21)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 21), REF_DATA), date(2014, 10, 17)); // input date is Sunday assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 19), REF_DATA), date(2014, 10, 22)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 19), REF_DATA), date(2014, 10, 16)); // skip maturity over EUR (1st May) and GBP (5th May) holiday assertEquals(test.calculateMaturityFromFixing(date(2014, 4, 30), REF_DATA), date(2014, 5, 6)); assertEquals(test.calculateFixingFromMaturity(date(2014, 5, 6), REF_DATA), date(2014, 4, 30)); // resolve assertEquals(test.resolve(REF_DATA).apply(date(2014, 5, 6)), FxIndexObservation.of(test, date(2014, 5, 6), REF_DATA)); } public void test_dates() { FxIndex test = ImmutableFxIndex.builder() .name("Test") .currencyPair(CurrencyPair.of(EUR, GBP)) .fixingCalendar(NO_HOLIDAYS) .maturityDateOffset(DaysAdjustment.ofCalendarDays(2)) .build(); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 13), REF_DATA), date(2014, 10, 15)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 15), REF_DATA), date(2014, 10, 13)); // weekend assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 16), REF_DATA), date(2014, 10, 18)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 18), REF_DATA), date(2014, 10, 16)); assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 17), REF_DATA), date(2014, 10, 19)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 19), REF_DATA), date(2014, 10, 17)); // input date is Sunday assertEquals(test.calculateMaturityFromFixing(date(2014, 10, 19), REF_DATA), date(2014, 10, 21)); assertEquals(test.calculateFixingFromMaturity(date(2014, 10, 19), REF_DATA), date(2014, 10, 17)); } //------------------------------------------------------------------------- public void test_equals() { ImmutableFxIndex a = ImmutableFxIndex.builder() .name("GBP-EUR") .currencyPair(CurrencyPair.of(GBP, EUR)) .fixingCalendar(GBLO) .maturityDateOffset(DaysAdjustment.ofBusinessDays(2, GBLO)) .build(); ImmutableFxIndex b = a.toBuilder().name("EUR-GBP").build(); assertEquals(a.equals(b), false); } //------------------------------------------------------------------------- public void coverage() { coverPrivateConstructor(FxIndices.class); coverImmutableBean((ImmutableBean) EUR_CHF_ECB); } public void test_jodaConvert() { assertJodaConvert(FxIndex.class, EUR_CHF_ECB); } public void test_serialization() { assertSerialization(EUR_CHF_ECB); } }