/** Tests the coupon present value SABR parameters sensitivity vs finite difference. */
 public void presentValueSABRSensitivityCoupon() {
   final double pv =
       METHOD_EXTRAPOLATION_CPN
           .presentValue(CMS_COUPON, SABR_MULTICURVES)
           .getAmount(EUR)
           .getAmount();
   final PresentValueSABRSensitivityDataBundle pvsCpn =
       METHOD_EXTRAPOLATION_CPN.presentValueSABRSensitivity(CMS_COUPON, SABR_MULTICURVES);
   // SABR sensitivity vs finite difference
   final double shift = 0.0001;
   final double shiftAlpha = 0.00001;
   final double maturity =
       CMS_COUPON
               .getUnderlyingSwap()
               .getFixedLeg()
               .getNthPayment(
                   CMS_COUPON.getUnderlyingSwap().getFixedLeg().getNumberOfPayments() - 1)
               .getPaymentTime()
           - CMS_COUPON.getSettlementTime();
   final DoublesPair expectedExpiryTenor = DoublesPair.of(CMS_COUPON.getFixingTime(), maturity);
   // Alpha sensitivity vs finite difference computation
   final SABRInterestRateParameters sabrParameterAlphaBumped =
       SABRDataSets.createSABR1AlphaBumped(shiftAlpha);
   final SABRSwaptionProviderDiscount sabrBundleAlphaBumped =
       new SABRSwaptionProviderDiscount(MULTICURVES, sabrParameterAlphaBumped, EUR1YEURIBOR6M);
   final double pvLongPayerAlphaBumped =
       METHOD_EXTRAPOLATION_CPN
           .presentValue(CMS_COUPON, sabrBundleAlphaBumped)
           .getAmount(EUR)
           .getAmount();
   final double expectedAlphaSensi = (pvLongPayerAlphaBumped - pv) / shiftAlpha;
   assertEquals("Number of alpha sensitivity", pvsCpn.getAlpha().getMap().keySet().size(), 1);
   assertEquals(
       "Alpha sensitivity expiry/tenor",
       pvsCpn.getAlpha().getMap().keySet().contains(expectedExpiryTenor),
       true);
   assertEquals(
       "Alpha sensitivity value",
       expectedAlphaSensi,
       pvsCpn.getAlpha().getMap().get(expectedExpiryTenor),
       TOLERANCE_PV_DELTA);
   // Rho sensitivity vs finite difference computation
   final SABRInterestRateParameters sabrParameterRhoBumped = SABRDataSets.createSABR1RhoBumped();
   final SABRSwaptionProviderDiscount sabrBundleRhoBumped =
       new SABRSwaptionProviderDiscount(MULTICURVES, sabrParameterRhoBumped, EUR1YEURIBOR6M);
   final double pvLongPayerRhoBumped =
       METHOD_EXTRAPOLATION_CPN
           .presentValue(CMS_COUPON, sabrBundleRhoBumped)
           .getAmount(EUR)
           .getAmount();
   final double expectedRhoSensi = (pvLongPayerRhoBumped - pv) / shift;
   assertEquals("Number of rho sensitivity", pvsCpn.getRho().getMap().keySet().size(), 1);
   assertEquals(
       "Rho sensitivity expiry/tenor",
       pvsCpn.getRho().getMap().keySet().contains(expectedExpiryTenor),
       true);
   assertEquals(
       "Rho sensitivity value",
       expectedRhoSensi,
       pvsCpn.getRho().getMap().get(expectedExpiryTenor),
       TOLERANCE_PV_DELTA);
   // Nu sensitivity vs finite difference computation
   final SABRInterestRateParameters sabrParameterNuBumped = SABRDataSets.createSABR1NuBumped();
   final SABRSwaptionProviderDiscount sabrBundleNuBumped =
       new SABRSwaptionProviderDiscount(MULTICURVES, sabrParameterNuBumped, EUR1YEURIBOR6M);
   final double pvLongPayerNuBumped =
       METHOD_EXTRAPOLATION_CPN
           .presentValue(CMS_COUPON, sabrBundleNuBumped)
           .getAmount(EUR)
           .getAmount();
   final double expectedNuSensi = (pvLongPayerNuBumped - pv) / shift;
   assertEquals("Number of nu sensitivity", pvsCpn.getNu().getMap().keySet().size(), 1);
   assertTrue(
       "Nu sensitivity expiry/tenor",
       pvsCpn.getNu().getMap().keySet().contains(expectedExpiryTenor));
   assertEquals(
       "Nu sensitivity value",
       expectedNuSensi,
       pvsCpn.getNu().getMap().get(expectedExpiryTenor),
       TOLERANCE_PV_DELTA);
 }