//-------------------------------------------------------------------------
        // 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);
        }
        //-------------------------------------------------------------------------
        public virtual void coverage()
        {
            BlackFxOptionFlatVolatilities test1 = BlackFxOptionFlatVolatilities.of(CURRENCY_PAIR, VAL_DATE_TIME, CURVE);

            coverImmutableBean(test1);
            BlackFxOptionFlatVolatilities test2 = BlackFxOptionFlatVolatilities.of(CURRENCY_PAIR.inverse(), ZonedDateTime.of(2015, 12, 21, 11, 15, 0, 0, ZoneId.of("Z")), CURVE);

            coverBeanEquals(test1, test2);
        }
        //-------------------------------------------------------------------------
        public virtual void test_builder()
        {
            BlackFxOptionFlatVolatilities test = BlackFxOptionFlatVolatilities.builder().currencyPair(CURRENCY_PAIR).curve(CURVE).valuationDateTime(VAL_DATE_TIME).build();

            assertEquals(test.ValuationDateTime, VAL_DATE_TIME);
            assertEquals(test.CurrencyPair, CURRENCY_PAIR);
            assertEquals(test.Name, FxOptionVolatilitiesName.of(CURVE.Name.Name));
            assertEquals(test.Curve, CURVE);
            assertEquals(VOLS, test);
        }
 public override bool Equals(object obj)
 {
     if (obj == this)
     {
         return(true);
     }
     if (obj != null && obj.GetType() == this.GetType())
     {
         BlackFxOptionFlatVolatilities other = (BlackFxOptionFlatVolatilities)obj;
         return(JodaBeanUtils.equal(currencyPair, other.currencyPair) && JodaBeanUtils.equal(valuationDateTime, other.valuationDateTime) && JodaBeanUtils.equal(curve, other.curve));
     }
     return(false);
 }