/**
  * Constructor of the future option transaction from details.
  *
  * @param underlyingOption The underlying option future security.
  * @param quantity The quantity of the transaction. Can be positive or negative.
  * @param premiumDate The transaction date.
  * @param tradePrice The transaction price.
  */
 public InterestRateFutureOptionPremiumTransactionDefinition(
     final InterestRateFutureOptionPremiumSecurityDefinition underlyingOption,
     final int quantity,
     final ZonedDateTime premiumDate,
     final double tradePrice) {
   ArgChecker.notNull(underlyingOption, "underlying option");
   ArgChecker.notNull(premiumDate, "premium date");
   _underlyingOption = underlyingOption;
   _quantity = quantity;
   _tradePrice = tradePrice;
   final double premiumAmount =
       _tradePrice
           * _underlyingOption.getUnderlyingFuture().getNotional()
           * _underlyingOption.getUnderlyingFuture().getPaymentAccrualFactor();
   _premium =
       new PaymentFixedDefinition(underlyingOption.getCurrency(), premiumDate, premiumAmount);
 }
 @Override
 public InterestRateFutureOptionPremiumTransaction toDerivative(final ZonedDateTime date) {
   final InterestRateFutureOptionPremiumSecurity option = _underlyingOption.toDerivative(date);
   final double premiumTime = TimeCalculator.getTimeBetween(date, _premium.getPaymentDate());
   if (premiumTime < 0) { // Premium payment in the past.
     // The premium payment is in the past and is represented by a 0 payment today.
     return new InterestRateFutureOptionPremiumTransaction(option, _quantity, 0.0, 0.0);
   }
   return new InterestRateFutureOptionPremiumTransaction(
       option, _quantity, premiumTime, _tradePrice);
 }
 @Override
 public int hashCode() {
   final int prime = 31;
   int result = 1;
   result = prime * result + _premium.hashCode();
   result = prime * result + _quantity;
   long temp;
   temp = Double.doubleToLongBits(_tradePrice);
   result = prime * result + (int) (temp ^ (temp >>> 32));
   result = prime * result + _underlyingOption.hashCode();
   return result;
 }
 @Test
 /** Tests the toDerivative method when the reference date is before the premium settlement. */
 public void toDerivativeBeforeSettlement() {
   final InterestRateFutureOptionPremiumTransaction transactionConverted =
       OPTION_TRANSACTION.toDerivative(REFERENCE_DATE);
   final InterestRateFutureOptionPremiumSecurity security =
       OPTION_EDU2.toDerivative(REFERENCE_DATE);
   final double premiumTime = TimeCalculator.getTimeBetween(REFERENCE_DATE, PREMIUM_DATE);
   final InterestRateFutureOptionPremiumTransaction transaction =
       new InterestRateFutureOptionPremiumTransaction(
           security, QUANTITY, premiumTime, TRADE_PRICE);
   assertEquals("Option on future: to derivative", transaction, transactionConverted);
 }
 @Test
 /** Tests the toDerivative method when the reference date is after the premium settlement. */
 public void toDerivativeAfterSettlement() {
   final ZonedDateTime referenceDate = PREMIUM_DATE.plusDays(1);
   final InterestRateFutureOptionPremiumTransaction transactionConverted =
       OPTION_TRANSACTION.toDerivative(referenceDate);
   final InterestRateFutureOptionPremiumSecurity security =
       OPTION_EDU2.toDerivative(referenceDate);
   final double premiumTime = 0.0;
   final double price = 0.0; // The payment is in the past and is represented by a 0 payment today.
   final InterestRateFutureOptionPremiumTransaction transaction =
       new InterestRateFutureOptionPremiumTransaction(security, QUANTITY, premiumTime, price);
   assertEquals("Option on future: to derivative", transaction, transactionConverted);
 }
 @Test
 /** Tests the toDerivative method when the reference date is on the premium settlement. */
 public void toDerivativeOnSettlement() {
   final ZonedDateTime referenceDate = PREMIUM_DATE;
   final InterestRateFutureOptionPremiumTransaction transactionConverted =
       OPTION_TRANSACTION.toDerivative(referenceDate);
   final InterestRateFutureOptionPremiumSecurity security =
       OPTION_EDU2.toDerivative(referenceDate);
   final double premiumTime = 0.0;
   final InterestRateFutureOptionPremiumTransaction transaction =
       new InterestRateFutureOptionPremiumTransaction(
           security, QUANTITY, premiumTime, TRADE_PRICE);
   assertEquals("Option on future: to derivative", transaction, transactionConverted);
 }