AgricultureForwardDefinition extends CommodityForwardDefinition<AgricultureForward> { @Override public AgricultureForward toDerivative(final ZonedDateTime date) { ArgumentChecker.inOrderOrEqual(date, this.getExpiryDate(), "date", "expiry date"); final double timeToFixing = TimeCalculator.getTimeBetween(date, this.getExpiryDate()); final double timeToSettlement = TimeCalculator.getTimeBetween(date, this.getSettlementDate()); return new AgricultureForward(timeToFixing, getUnderlying(), getUnitAmount(), getFirstDeliveryDate(), getLastDeliveryDate(), getAmount(), getUnitName(), getSettlementType(), timeToSettlement, getReferencePrice(), getCurrency()); } AgricultureForwardDefinition(final ZonedDateTime expiryDate, final ExternalId underlying, final double unitAmount, final ZonedDateTime firstDeliveryDate, final ZonedDateTime lastDeliveryDate,
      final double amount, final String unitName, final SettlementType settlementType, final double referencePrice, final Currency currency, final ZonedDateTime settlementDate);  AgricultureForwardDefinition(final ZonedDateTime expiryDate, final ExternalId underlying, final double unitAmount, final double amount, final String unitName,
      final SettlementType settlementType, final double referencePrice, final Currency currency, final ZonedDateTime settlementDate); static AgricultureForwardDefinition withCashSettlement(final ZonedDateTime expiryDate, final ExternalId underlying, final double unitAmount, final double amount, final String unitName,
      final double referencePrice, final Currency currency, final ZonedDateTime settlementDate); static AgricultureForwardDefinition withPhysicalSettlement(final ZonedDateTime expiryDate, final ExternalId underlying, final double unitAmount, final ZonedDateTime firstDeliveryDate,
      final ZonedDateTime lastDeliveryDate, final double amount, final String unitName, final double referencePrice, final Currency currency, final ZonedDateTime settlementDate); @Override AgricultureForward toDerivative(final ZonedDateTime date); @Override AgricultureForward toDerivative(final ZonedDateTime date, final Double referencePrice); @Override V accept(final InstrumentDefinitionVisitor<U, V> visitor, final U data); @Override V accept(final InstrumentDefinitionVisitor<?, V> visitor); @Override int hashCode(); @Override boolean equals(final Object obj);  }
@Test public void testToDerivative() { AgricultureForwardDefinition first = new AgricultureForwardDefinition(EXPIRY_DATE, AN_UNDERLYING, 100., null, null, 1000., "tonnes", SettlementType.CASH, 0, Currency.GBP, SETTLEMENT_DATE); AgricultureForwardDefinition second = new AgricultureForwardDefinition(EXPIRY_DATE, AN_UNDERLYING, 100., FIRST_DELIVERY_DATE, LAST_DELIVERY_DATE, 1000., "tonnes", SettlementType.PHYSICAL, 0, Currency.GBP, SETTLEMENT_DATE); AgricultureForward firstDerivative = first.toDerivative(A_DATE); AgricultureForward secondDerivative = second.toDerivative(A_DATE); assertEquals(firstDerivative.getAmount(), 1000.); assertEquals(firstDerivative.getUnitAmount(), 100.); assertEquals(firstDerivative.getUnitName(), "tonnes"); assertEquals(firstDerivative.getExpiry(), 0.0027397260273972603); assertNull(firstDerivative.getFirstDeliveryDate()); assertNull(firstDerivative.getLastDeliveryDate()); assertEquals(firstDerivative.getSettlementType(), SettlementType.CASH); assertEquals(firstDerivative.getUnderlying(), AN_UNDERLYING); assertEquals(secondDerivative.getFirstDeliveryDate(), FIRST_DELIVERY_DATE); assertEquals(secondDerivative.getLastDeliveryDate(), LAST_DELIVERY_DATE); assertEquals(secondDerivative.getSettlementType(), SettlementType.PHYSICAL); AgricultureForward firstDerivative2 = new AgricultureForward(0.0027397260273972603, AN_UNDERLYING, 100, null, null, 1000, "tonnes", SettlementType.CASH, 1.0035032562317538, 0, Currency.GBP); assertEquals(firstDerivative.hashCode(), firstDerivative2.hashCode()); assertEquals(firstDerivative, firstDerivative2); }