### Question:
ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities implements BlackIborCapletFloorletVolatilities, ImmutableBean, Serializable { public static ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities of( IborIndex index, ZonedDateTime valuationDateTime, Surface surface, Curve shiftCurve) { return new ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities(index, valuationDateTime, surface, shiftCurve); } @ImmutableConstructor private  ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities(
      IborIndex index,
      ZonedDateTime valuationDateTime,
      Surface surface,
      Curve shiftCurve); static ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities of(
      IborIndex index,
      ZonedDateTime valuationDateTime,
      Surface surface,
      Curve shiftCurve); @Override IborCapletFloorletVolatilitiesName getName(); @Override Optional<T> findData(MarketDataName<T> name); @Override int getParameterCount(); @Override double getParameter(int parameterIndex); @Override ParameterMetadata getParameterMetadata(int parameterIndex); @Override OptionalInt findParameterIndex(ParameterMetadata metadata); @Override ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities withParameter(int parameterIndex, double newValue); @Override ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities withPerturbation(ParameterPerturbation perturbation); @Override double volatility(double expiry, double strike, double forward); @Override CurrencyParameterSensitivities parameterSensitivity(PointSensitivities pointSensitivities); @Override double price(double expiry, PutCall putCall, double strike, double forward, double volatility); @Override double priceDelta(double expiry, PutCall putCall, double strike, double forward, double volatility); @Override double priceGamma(double expiry, PutCall putCall, double strike, double forward, double volatility); @Override double priceTheta(double expiry, PutCall putCall, double strike, double forward, double volatility); @Override double priceVega(double expiry, PutCall putCall, double strike, double forward, double volatility); @Override double relativeTime(ZonedDateTime dateTime); static ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities.Meta meta(); @Override ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities.Meta metaBean(); @Override IborIndex getIndex(); @Override ZonedDateTime getValuationDateTime(); Surface getSurface(); Curve getShiftCurve(); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void coverage() { coverImmutableBean(VOLS); ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities vols = ShiftedBlackIborCapletFloorletExpiryStrikeVolatilities.of( USD_LIBOR_3M, VAL_DATE_TIME.plusMonths(1), InterpolatedNodalSurface.of(METADATA, TIME, STRIKE, VOL, GridSurfaceInterpolator.of(TIME_SQUARE, LINEAR)), ConstantCurve.of("shift", 0.05)); coverBeanEquals(VOLS, vols); }