/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.examples.finance.credit.harness;
import static org.testng.Assert.assertTrue;
import java.time.LocalDate;
import org.testng.Assert;
import com.opengamma.strata.basics.currency.Currency;
import com.opengamma.strata.calc.Measure;
import com.opengamma.strata.collect.array.DoubleArray;
import com.opengamma.strata.examples.marketdata.credit.markit.MarkitRedCode;
import com.opengamma.strata.measure.Measures;
import com.opengamma.strata.measure.credit.CreditMeasures;
import com.opengamma.strata.product.Trade;
import com.opengamma.strata.product.common.BuySell;
import com.opengamma.strata.product.credit.IndexReferenceInformation;
import com.opengamma.strata.product.credit.RestructuringClause;
import com.opengamma.strata.product.credit.SeniorityLevel;
import com.opengamma.strata.product.credit.SingleNameReferenceInformation;
import com.opengamma.strata.product.credit.type.CdsConventions;
public class TestHarness {
private static final double epsilon = 10e-9;
private static final Calculator calculator = TestCalculator.of();
public static class TradeFactory {
private final TradeSource tradeSource;
private TradeFactory(TradeSource tradeSource) {
this.tradeSource = tradeSource;
}
public static TradeFactory withCompany01() {
final LocalDate cashSettleDate = LocalDate.of(2014, 10, 21);
final double feeAmount = 3_694_117.73D;
final BuySell buySell = BuySell.BUY;
return withCompany01(buySell, feeAmount, cashSettleDate);
}
public static TradeFactory withCompany01(BuySell buySell, double feeAmount, LocalDate cashSettleDate) {
TradeSource tradeSource = () -> CdsConventions.USD_NORTH_AMERICAN
.toTrade(
LocalDate.of(2014, 9, 22),
LocalDate.of(2019, 12, 20),
buySell,
100_000_000D,
0.0100,
SingleNameReferenceInformation.of(
MarkitRedCode.id("COMP01"),
SeniorityLevel.SENIOR_UNSECURED_FOREIGN,
Currency.USD,
RestructuringClause.NO_RESTRUCTURING_2014),
feeAmount,
cashSettleDate);
return new TradeFactory(tradeSource);
}
public static TradeFactory withCompany02() {
TradeSource tradeSource = () -> CdsConventions.USD_NORTH_AMERICAN
.toTrade(
LocalDate.of(2014, 9, 22),
LocalDate.of(2019, 12, 20),
BuySell.BUY,
100_000_000D,
0.0500,
SingleNameReferenceInformation.of(
MarkitRedCode.id("COMP02"),
SeniorityLevel.SENIOR_UNSECURED_FOREIGN,
Currency.USD,
RestructuringClause.NO_RESTRUCTURING_2014),
-1_370_582.00D,
LocalDate.of(2014, 10, 21));
return new TradeFactory(tradeSource);
}
public static TradeFactory withIndex0001() {
TradeSource tradeSource = () -> CdsConventions.USD_NORTH_AMERICAN
.toTrade(
LocalDate.of(2014, 3, 20),
LocalDate.of(2019, 6, 20),
BuySell.BUY,
100_000_000D,
0.0500,
IndexReferenceInformation.of(MarkitRedCode.id("INDEX0001"), 22, 4),
2_000_000D,
LocalDate.of(2014, 10, 21));
return new TradeFactory(tradeSource);
}
public Trade getTrade() {
return tradeSource.apply();
}
public ScalarMeasureOnADay pvShouldBe(double expected) {
return new ScalarMeasureOnADay(Measures.PRESENT_VALUE, expected, tradeSource);
}
public ScalarMeasureOnADay parRateShouldBe(double expected) {
return new ScalarMeasureOnADay(Measures.PAR_RATE, expected, tradeSource);
}
public ScalarMeasureOnADay jumpToDefaultShouldBe(double expected) {
return new ScalarMeasureOnADay(CreditMeasures.JUMP_TO_DEFAULT, expected, tradeSource);
}
public ScalarMeasureOnADay recovery01ShouldBe(double expected) {
return new ScalarMeasureOnADay(CreditMeasures.RECOVERY01, expected, tradeSource);
}
public ScalarMeasureOnADay ir01ParallelParShouldBe(double expected) {
return new ScalarMeasureOnADay(CreditMeasures.IR01_PARALLEL_PAR, expected, tradeSource);
}
public VectorMeasureOnADay ir01BucketedParShouldBe(double... expected) {
return new VectorMeasureOnADay(CreditMeasures.IR01_BUCKETED_PAR, expected, tradeSource);
}
public ScalarMeasureOnADay cs01ParallelParShouldBe(double expected) {
return new ScalarMeasureOnADay(CreditMeasures.CS01_PARALLEL_PAR, expected, tradeSource);
}
public VectorMeasureOnADay cs01BucketedParShouldBe(double... expected) {
return new VectorMeasureOnADay(CreditMeasures.CS01_BUCKETED_PAR, expected, tradeSource);
}
}
public static class ScalarMeasureOnADay {
private final Measure measure;
private final double expected;
private final TradeSource tradeSource;
private ScalarMeasureOnADay(Measure measure, double expected, TradeSource tradeSource) {
this.measure = measure;
this.expected = expected;
this.tradeSource = tradeSource;
}
public void on(LocalDate valuationDate) {
double value = calculator.calculateScalarValue(valuationDate, tradeSource, measure);
Assert.assertEquals(value, expected, epsilon);
}
}
public static class VectorMeasureOnADay {
private final Measure measure;
private final DoubleArray expected;
private final TradeSource tradeSource;
private VectorMeasureOnADay(Measure measure, double[] expected, TradeSource tradeSource) {
this.expected = DoubleArray.copyOf(expected);
this.measure = measure;
this.tradeSource = tradeSource;
}
public void on(LocalDate valuationDate) {
DoubleArray values = calculator.calculateVectorValue(valuationDate, tradeSource, measure);
assertTrue(values.equalWithTolerance(expected, epsilon));
}
}
}