//-------------------------------------------------------------------------
 public virtual void test_volatility()
 {
     for (int i = 0; i < NB_EXPIRY; i++)
     {
         double expiryTime = VOLS.relativeTime(TEST_EXPIRY[i]);
         for (int j = 0; j < NB_STRIKE; ++j)
         {
             double volExpected = CURVE.yValue(expiryTime);
             double volComputed = VOLS.volatility(CURRENCY_PAIR, TEST_EXPIRY[i], TEST_STRIKE[j], FORWARD[i]);
             assertEquals(volComputed, volExpected, TOLERANCE);
         }
     }
 }
        //-------------------------------------------------------------------------
        // bumping a node point at nodeExpiry
        private double nodeSensitivity(BlackFxOptionFlatVolatilities provider, CurrencyPair pair, ZonedDateTime expiry, double strike, double forward, double nodeExpiry)
        {
            NodalCurve  curve   = (NodalCurve)provider.Curve;
            DoubleArray xValues = curve.XValues;
            DoubleArray yValues = curve.YValues;

            int nData = xValues.size();
            int index = -1;

            for (int i = 0; i < nData; ++i)
            {
                if (Math.Abs(xValues.get(i) - nodeExpiry) < TOLERANCE)
                {
                    index = i;
                }
            }
            NodalCurve curveUp = curve.withYValues(yValues.with(index, yValues.get(index) + EPS));
            NodalCurve curveDw = curve.withYValues(yValues.with(index, yValues.get(index) - EPS));
            BlackFxOptionFlatVolatilities provUp = BlackFxOptionFlatVolatilities.of(CURRENCY_PAIR, VAL_DATE_TIME, curveUp);
            BlackFxOptionFlatVolatilities provDw = BlackFxOptionFlatVolatilities.of(CURRENCY_PAIR, VAL_DATE_TIME, curveDw);
            double volUp = provUp.volatility(pair, expiry, strike, forward);
            double volDw = provDw.volatility(pair, expiry, strike, forward);

            return(0.5 * (volUp - volDw) / EPS);
        }