/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product.swap;
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 static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import java.time.LocalTime;
import java.time.ZoneId;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.opengamma.strata.basics.date.Tenor;
import com.opengamma.strata.product.swap.type.FixedIborSwapConvention;
import com.opengamma.strata.product.swap.type.FixedIborSwapConventions;
import com.opengamma.strata.product.swap.type.FixedIborSwapTemplate;
/**
* Test {@link SwapIndex}.
*/
@Test
public class SwapIndexTest {
private static ZoneId LONDON = ZoneId.of("Europe/London");
private static ZoneId NEY_YORK = ZoneId.of("America/New_York");
private static ZoneId FRANKFURT = ZoneId.of("Europe/Berlin"); // Frankfurt not defined in TZDB
public void test_notFound() {
assertThrowsIllegalArg(() -> SwapIndex.of("foo"));
}
public void test_swapIndicies() {
ImmutableMap<String, SwapIndex> mapAll = SwapIndices.ENUM_LOOKUP.lookupAll();
ImmutableList<SwapIndex> indexAll = mapAll.values().asList();
ImmutableList<String> nameAll = mapAll.keySet().asList();
int size = indexAll.size();
for (int i = 0; i < size; ++i) {
// check no duplication
for (int j = i + 1; j < size; ++j) {
assertFalse(nameAll.get(i).equals(nameAll.get(j)));
assertFalse(indexAll.get(i).equals(indexAll.get(j)));
}
}
for (String name : nameAll) {
SwapIndex index = mapAll.get(name);
assertEquals(SwapIndex.of(name), index);
assertEquals(index.isActive(), true);
FixedIborSwapTemplate temp = index.getTemplate();
FixedIborSwapConvention conv = temp.getConvention();
Tenor tenor = temp.getTenor();
LocalTime time = index.getFixingTime();
ZoneId zone = index.getFixingZone();
// test consistency between name and template
assertTrue(name.contains(tenor.toString()));
if (name.startsWith("USD")) {
assertTrue(name.contains("1100") || name.contains("1500"));
assertTrue(conv.equals(FixedIborSwapConventions.USD_FIXED_6M_LIBOR_3M));
assertTrue(zone.equals(NEY_YORK));
}
if (name.startsWith("GBP")) {
assertTrue(name.contains("1100"));
if (tenor.equals(Tenor.TENOR_1Y)) {
assertTrue(conv.equals(FixedIborSwapConventions.GBP_FIXED_1Y_LIBOR_3M));
} else {
assertTrue(conv.equals(FixedIborSwapConventions.GBP_FIXED_6M_LIBOR_6M));
}
assertTrue(zone.equals(LONDON));
}
if (name.startsWith("EUR")) {
assertTrue(name.contains("1100") || name.contains("1200"));
if (tenor.equals(Tenor.TENOR_1Y)) {
assertTrue(conv.equals(FixedIborSwapConventions.EUR_FIXED_1Y_EURIBOR_3M));
} else {
assertTrue(conv.equals(FixedIborSwapConventions.EUR_FIXED_1Y_EURIBOR_6M));
}
assertTrue(zone.equals(FRANKFURT));
}
if (name.contains("1100")) {
assertTrue(time.equals(LocalTime.of(11, 0)));
}
if (name.contains("1200")) {
assertTrue(time.equals(LocalTime.of(12, 0)));
}
if (name.contains("1500")) {
assertTrue(time.equals(LocalTime.of(15, 0)));
}
assertEquals(index.calculateFixingDateTime(date(2015, 6, 30)), date(2015, 6, 30).atTime(time).atZone(zone));
}
}
//-------------------------------------------------------------------------
public void coverage() {
ImmutableSwapIndex index = ImmutableSwapIndex.builder()
.name("FooIndex")
.fixingTime(LocalTime.of(12, 30))
.fixingZone(ZoneId.of("Africa/Abidjan"))
.template(FixedIborSwapTemplate.of(Tenor.TENOR_9M, FixedIborSwapConventions.CHF_FIXED_1Y_LIBOR_3M))
.build();
coverImmutableBean(index);
coverPrivateConstructor(SwapIndices.class);
}
public void test_serialization() {
SwapIndex index = ImmutableSwapIndex.builder()
.name("FooIndex")
.fixingTime(LocalTime.of(12, 30))
.fixingZone(ZoneId.of("Africa/Abidjan"))
.template(FixedIborSwapTemplate.of(Tenor.TENOR_9M, FixedIborSwapConventions.CHF_FIXED_1Y_LIBOR_3M))
.build();
assertSerialization(index);
}
}