//-------------------------------------------------------------------------
        public virtual void test_presentValueSensitivityNormalVolatility()
        {
            SwaptionSensitivity computedRec = PRICER_SWAPTION.presentValueSensitivityModelParamsVolatility(SWAPTION_REC_LONG, RATE_PROVIDER, VOLS);
            CurrencyAmount      pvRecUp     = PRICER_SWAPTION.presentValue(SWAPTION_REC_LONG, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(FD_EPS));
            CurrencyAmount      pvRecDw     = PRICER_SWAPTION.presentValue(SWAPTION_REC_LONG, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(-FD_EPS));
            double expectedRec = 0.5 * (pvRecUp.Amount - pvRecDw.Amount) / FD_EPS;

            assertEquals(computedRec.Currency, USD);
            assertEquals(computedRec.Sensitivity, expectedRec, FD_EPS * NOTIONAL);
            assertEquals(computedRec.VolatilitiesName, VOLS.Name);
            assertEquals(computedRec.Expiry, VOLS.relativeTime(SWAPTION_REC_LONG.Expiry));
            assertEquals(computedRec.Tenor, SWAP_TENOR_YEAR, TOL);
            assertEquals(computedRec.Strike, STRIKE, TOL);
            assertEquals(computedRec.Forward, PRICER_SWAP.parRate(RSWAP_REC, RATE_PROVIDER), TOL);
            SwaptionSensitivity computedPay = PRICER_SWAPTION.presentValueSensitivityModelParamsVolatility(SWAPTION_PAY_SHORT, RATE_PROVIDER, VOLS);
            CurrencyAmount      pvUpPay     = PRICER_SWAPTION.presentValue(SWAPTION_PAY_SHORT, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(FD_EPS));
            CurrencyAmount      pvDwPay     = PRICER_SWAPTION.presentValue(SWAPTION_PAY_SHORT, RATE_PROVIDER, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(-FD_EPS));
            double expectedPay = 0.5 * (pvUpPay.Amount - pvDwPay.Amount) / FD_EPS;

            assertEquals(computedPay.Currency, USD);
            assertEquals(computedPay.Sensitivity, expectedPay, FD_EPS * NOTIONAL);
            assertEquals(computedPay.VolatilitiesName, VOLS.Name);
            assertEquals(computedPay.Expiry, VOLS.relativeTime(SWAPTION_PAY_SHORT.Expiry));
            assertEquals(computedPay.Tenor, SWAP_TENOR_YEAR, TOL);
            assertEquals(computedPay.Strike, STRIKE, TOL);
            assertEquals(computedPay.Forward, PRICER_SWAP.parRate(RSWAP_PAY, RATE_PROVIDER), TOL);
        }
        //-------------------------------------------------------------------------
        public virtual void present_value_sensitivityNormalVolatility_FD()
        {
            double              shiftVol = 1.0E-4;
            CurrencyAmount      pvP      = PRICER_SWAPTION_NORMAL.presentValue(SWAPTION_LONG_PAY, MULTI_USD, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(shiftVol));
            CurrencyAmount      pvM      = PRICER_SWAPTION_NORMAL.presentValue(SWAPTION_LONG_PAY, MULTI_USD, SwaptionNormalVolatilityDataSets.normalVolSwaptionProviderUsdStsShifted(-shiftVol));
            double              pvnvsFd  = (pvP.Amount - pvM.Amount) / (2 * shiftVol);
            SwaptionSensitivity pvnvsAd  = PRICER_SWAPTION_NORMAL.presentValueSensitivityModelParamsVolatility(SWAPTION_LONG_PAY, MULTI_USD, NORMAL_VOLS_USD_STD);

            assertEquals(pvnvsAd.Currency, USD);
            assertEquals(pvnvsAd.Sensitivity, pvnvsFd, TOLERANCE_PV_VEGA);
            assertEquals(pvnvsAd.VolatilitiesName, NORMAL_VOLS_USD_STD.Name);
            assertEquals(pvnvsAd.Expiry, NORMAL_VOLS_USD_STD.relativeTime(SWAPTION_LONG_PAY.Expiry));
            assertEquals(pvnvsAd.Tenor, SWAP_TENOR_YEAR, TOLERANCE_RATE);
            assertEquals(pvnvsAd.Strike, STRIKE, TOLERANCE_RATE);
            double forward = PRICER_SWAP.parRate(RSWAP_REC, MULTI_USD);

            assertEquals(pvnvsAd.Forward, forward, TOLERANCE_RATE);
        }