/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.product.deposit.type;
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.BusinessDayConventions.MODIFIED_FOLLOWING;
import static com.opengamma.strata.basics.date.DayCounts.ACT_360;
import static com.opengamma.strata.basics.date.DayCounts.ACT_365F;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.EUTA;
import static com.opengamma.strata.basics.date.HolidayCalendarIds.GBLO;
import static com.opengamma.strata.collect.TestHelper.assertSerialization;
import static com.opengamma.strata.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.strata.collect.TestHelper.coverBeanEquals;
import static com.opengamma.strata.collect.TestHelper.coverImmutableBean;
import static org.testng.Assert.assertEquals;
import java.time.LocalDate;
import java.time.Period;
import org.testng.annotations.Test;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.date.BusinessDayAdjustment;
import com.opengamma.strata.basics.date.DaysAdjustment;
import com.opengamma.strata.product.TradeInfo;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.deposit.TermDeposit;
import com.opengamma.strata.product.deposit.TermDepositTrade;
/**
* Test {@link TermDepositTemplate}.
*/
@Test
public class TermDepositTemplateTest {
private static final ReferenceData REF_DATA = ReferenceData.standard();
private static final BusinessDayAdjustment BDA_MOD_FOLLOW = BusinessDayAdjustment.of(MODIFIED_FOLLOWING, EUTA);
private static final DaysAdjustment PLUS_TWO_DAYS = DaysAdjustment.ofBusinessDays(2, EUTA);
private static final TermDepositConvention CONVENTION = TermDepositConventions.EUR_DEPOSIT_T2;
private static final Period DEPOSIT_PERIOD = Period.ofMonths(3);
public void test_builder() {
TermDepositTemplate test = TermDepositTemplate.builder()
.convention(CONVENTION)
.depositPeriod(DEPOSIT_PERIOD)
.build();
assertEquals(test.getConvention(), CONVENTION);
assertEquals(test.getDepositPeriod(), DEPOSIT_PERIOD);
}
public void test_builder_negativePeriod() {
assertThrowsIllegalArg(() -> TermDepositTemplate.builder()
.convention(CONVENTION)
.depositPeriod(Period.ofMonths(-2))
.build());
}
public void test_of() {
TermDepositTemplate test = TermDepositTemplate.of(DEPOSIT_PERIOD, CONVENTION);
assertEquals(test.getConvention(), CONVENTION);
assertEquals(test.getDepositPeriod(), DEPOSIT_PERIOD);
}
public void test_createTrade() {
TermDepositTemplate template = TermDepositTemplate.of(DEPOSIT_PERIOD, CONVENTION);
LocalDate tradeDate = LocalDate.of(2015, 1, 23);
BuySell buy = BuySell.BUY;
double notional = 2_000_000d;
double rate = 0.0125;
TermDepositTrade trade = template.createTrade(tradeDate, buy, notional, rate, REF_DATA);
TradeInfo tradeInfoExpected = TradeInfo.of(tradeDate);
LocalDate startDateExpected = PLUS_TWO_DAYS.adjust(tradeDate, REF_DATA);
LocalDate endDateExpected = startDateExpected.plus(DEPOSIT_PERIOD);
TermDeposit productExpected = TermDeposit.builder()
.buySell(buy)
.currency(EUR)
.notional(notional)
.businessDayAdjustment(BDA_MOD_FOLLOW)
.startDate(startDateExpected)
.endDate(endDateExpected)
.rate(rate)
.dayCount(ACT_360)
.build();
assertEquals(trade.getInfo(), tradeInfoExpected);
assertEquals(trade.getProduct(), productExpected);
}
//-------------------------------------------------------------------------
public void coverage() {
TermDepositTemplate test1 = TermDepositTemplate.of(DEPOSIT_PERIOD, CONVENTION);
coverImmutableBean(test1);
TermDepositTemplate test2 = TermDepositTemplate.of(Period.ofMonths(6),
ImmutableTermDepositConvention.of(
"GBP-Dep", GBP, BDA_MOD_FOLLOW, ACT_365F, DaysAdjustment.ofBusinessDays(2, GBLO)));
coverBeanEquals(test1, test2);
}
public void test_serialization() {
TermDepositTemplate test = TermDepositTemplate.of(DEPOSIT_PERIOD, CONVENTION);
assertSerialization(test);
}
}