/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.pricer.impl.credit.isda; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotSame; import static org.testng.AssertJUnit.assertTrue; import java.time.LocalDate; import java.util.Arrays; import java.util.Map; import org.joda.beans.BeanBuilder; import org.joda.beans.MetaProperty; import org.joda.beans.Property; import org.testng.annotations.Test; import com.opengamma.strata.basics.date.DayCount; import com.opengamma.strata.basics.date.DayCounts; import com.opengamma.strata.market.curve.DefaultCurveMetadata; import com.opengamma.strata.pricer.impl.credit.isda.IsdaCompliantDateCurve.Meta; /** * Test {@link IsdaCompliantDateCurve}. */ @Test public class IsdaCompliantDateCurveTest { @SuppressWarnings("unused") public void cloneAndMetaTest() { double tol = 1.e-12; LocalDate baseDate = LocalDate.of(2013, 2, 3); LocalDate[] dates = new LocalDate[] { LocalDate.of(2013, 5, 14), LocalDate.of(2013, 9, 13), LocalDate.of(2013, 9, 14), LocalDate.of(2014, 1, 23)}; double[] rates = new double[] {0.05, 0.06, 0.06, 0.04}; int num = dates.length; DayCount dcc = DayCounts.ACT_365F; IsdaCompliantDateCurve curve365 = new IsdaCompliantDateCurve(baseDate, dates, rates); LocalDate[] clonedDates = curve365.getCurveDates(); int modPosition = num - 2; IsdaCompliantDateCurve rateModCurve = curve365.withRate(rates[modPosition] * 2., modPosition); double[] tt = new double[num]; double[] rtt = new double[num]; for (int i = 0; i < num; ++i) { assertEquals(0, clonedDates[i].compareTo(dates[i])); assertEquals(0, curve365.getCurveDate(i).compareTo(dates[i])); if (i == modPosition) { assertEquals(rates[i] * 2., rateModCurve.getYValues().get(i)); } else { assertEquals(rates[i], rateModCurve.getYValues().get(i)); } tt[i] = dcc.yearFraction(baseDate, dates[i]); rtt[i] = tt[i] * rates[i]; } assertNotSame(clonedDates, dates); LocalDate[] sampleDates = new LocalDate[] {LocalDate.of(2013, 2, 13), LocalDate.of(2013, 11, 19), LocalDate.of(2014, 1, 23)}; assertEquals(rates[0], curve365.getZeroRate(sampleDates[0])); double t = dcc.yearFraction(baseDate, sampleDates[1]); double refT2 = dcc.yearFraction(baseDate, dates[2]); double refT3 = dcc.yearFraction(baseDate, dates[3]); assertEquals((rates[2] * refT2 * (refT3 - t) + rates[3] * refT3 * (t - refT2)) / (refT3 - refT2) / t, curve365.getZeroRate(sampleDates[1]), tol); assertEquals(rates[3], curve365.getZeroRate(sampleDates[2])); assertEquals(baseDate, curve365.getBaseDate()); Property<LocalDate> propBase = curve365.baseDate(); assertEquals(baseDate, propBase.get()); Property<LocalDate[]> propDates = curve365.dates(); for (int i = 0; i < num; ++i) { assertEquals(dates[i], propDates.get()[i]); } Property<DayCount> propDcc = curve365.dayCount(); assertEquals(dcc, propDcc.get()); IsdaCompliantDateCurve clonedCurve = curve365.clone(); assertNotSame(clonedCurve, curve365); assertTrue(clonedCurve.equals(curve365)); assertEquals(clonedCurve.hashCode(), curve365.hashCode()); assertEquals(clonedCurve.toString(), curve365.toString()); Meta meta = IsdaCompliantDateCurve.meta(); Meta metafb = curve365.metaBean(); assertEquals(meta, metafb); BeanBuilder<?> builder = meta.builder(); Map<String, MetaProperty<?>> map = meta.metaPropertyMap(); MetaProperty<LocalDate> propBaseDate = meta.baseDate(); MetaProperty<LocalDate[]> metaDates = meta.dates(); MetaProperty<DayCount> metaDcc = meta.dayCount(); builder.set(propBaseDate.name(), baseDate); builder.set(propDates.name(), dates); builder.set(propDcc.name(), dcc); builder.set(meta.metaPropertyGet("metadata"), DefaultCurveMetadata.of("IsdaCompliantCurve")); builder.set(meta.metaPropertyGet("t"), tt); builder.set(meta.metaPropertyGet("rt"), rtt); IsdaCompliantDateCurve builtCurve = (IsdaCompliantDateCurve) builder.build(); assertEquals(curve365, builtCurve); // errors expected try { double[] ratesShort = Arrays.copyOf(rates, num - 1); new IsdaCompliantDateCurve(baseDate, dates, ratesShort); throw new RuntimeException(); } catch (Exception e) { assertTrue(e instanceof IllegalArgumentException); } try { dates[1] = LocalDate.of(2015, 1, 22); new IsdaCompliantDateCurve(baseDate, dates, rates); throw new RuntimeException(); } catch (Exception e) { assertTrue(e instanceof IllegalArgumentException); } } //------------------------------------------------------------------------- public void hashEqualsTest() { LocalDate baseDate = LocalDate.of(2009, 2, 3); LocalDate[] dates = new LocalDate[] { LocalDate.of(2012, 5, 14), LocalDate.of(2013, 6, 13), LocalDate.of(2013, 9, 14)}; double[] rates = new double[] {0.05, 0.06, 0.04}; DayCount dcc = DayCounts.ACT_360; IsdaCompliantDateCurve curve360 = new IsdaCompliantDateCurve(baseDate, dates, rates, dcc); IsdaCompliantDateCurve curve365 = new IsdaCompliantDateCurve(baseDate, dates, rates); IsdaCompliantDateCurve curve360a = new IsdaCompliantDateCurve(baseDate, new LocalDate[] { LocalDate.of(2012, 5, 14), LocalDate.of(2013, 7, 13), LocalDate.of(2013, 9, 14)}, rates, dcc); IsdaCompliantDateCurve curve360b = new IsdaCompliantDateCurve(baseDate.minusDays(6), dates, rates, dcc); IsdaCompliantDateCurve curve360c = new IsdaCompliantDateCurve(baseDate, dates, new double[] {0.05, 0.05, 0.04}, dcc); assertTrue(curve360.equals(curve360)); assertTrue(curve360.hashCode() != curve365.hashCode()); assertTrue(!(curve360.equals(curve365))); assertTrue(curve360.hashCode() != curve360a.hashCode()); assertTrue(!(curve360.equals(curve360a))); assertTrue(curve360.hashCode() != curve360b.hashCode()); assertTrue(!(curve360.equals(curve360b))); assertTrue(curve360.hashCode() != curve360c.hashCode()); assertTrue(!(curve360.equals(curve360c))); assertTrue(!(curve360.equals(null))); assertTrue(!(curve360.equals(new IsdaCompliantDateYieldCurve(baseDate, dates, rates, dcc)))); } }