public virtual void test_parSpread()
        {
            double computed   = PRICER.parSpread(TRADE, RATES_PROVIDER, REF_DATA);
            double expected   = PRICER_PRODUCT.parSpread(PRODUCT, RATES_PROVIDER, SETTLEMENT_DATE, REF_DATA);
            double computedMf = PRICER_MF.parSpread(TRADE_NO_SETTLE_DATE, RATES_PROVIDER, REF_DATA);
            double expectedMf = PRICER_PRODUCT_MF.parSpread(PRODUCT, RATES_PROVIDER, SETTLEMENT_DATE, REF_DATA);

            assertEquals(computed, expected, TOL);
            assertEquals(computedMf, expectedMf, TOL);
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the par spread of the CDS index product.
        /// <para>
        /// The par spread is a coupon rate such that the clean PV is 0.
        /// The result is represented in decimal form.
        ///
        /// </para>
        /// </summary>
        /// <param name="cdsIndex">  the product </param>
        /// <param name="ratesProvider">  the rates provider </param>
        /// <param name="referenceDate">  the reference date </param>
        /// <param name="refData">  the reference data </param>
        /// <returns> the par spread </returns>
        public virtual double parSpread(ResolvedCdsIndex cdsIndex, CreditRatesProvider ratesProvider, LocalDate referenceDate, ReferenceData refData)
        {
            ResolvedCds cds = cdsIndex.toSingleNameCds();

            return(underlyingPricer.parSpread(cds, ratesProvider, referenceDate, refData));
        }
        //-------------------------------------------------------------------------
        /// <summary>
        /// Calculates the par spread of the underlying product.
        /// <para>
        /// The par spread is a coupon rate such that the clean price is 0.
        /// The result is represented in decimal form.
        /// </para>
        /// <para>
        /// This is coherent to <seealso cref="#price(ResolvedCdsTrade, CreditRatesProvider, PriceType, ReferenceData)"/>.
        ///
        /// </para>
        /// </summary>
        /// <param name="trade">  the trade </param>
        /// <param name="ratesProvider">  the rates provider </param>
        /// <param name="refData">  the reference data </param>
        /// <returns> the par spread </returns>
        public virtual double parSpread(ResolvedCdsTrade trade, CreditRatesProvider ratesProvider, ReferenceData refData)
        {
            LocalDate settlementDate = calculateSettlementDate(trade, ratesProvider, refData);

            return(productPricer.parSpread(trade.Product, ratesProvider, settlementDate, refData));
        }