MulticurveOutputParallelShift implements Perturbation, ImmutableBean { public static MulticurveOutputParallelShift absolute(double shiftAmount) { return new MulticurveOutputParallelShift(ShiftType.ABSOLUTE, shiftAmount); } private  MulticurveOutputParallelShift(
      ShiftType shiftType,
      double shiftAmount); static MulticurveOutputParallelShift absolute(double shiftAmount); static MulticurveOutputParallelShift relative(double shiftAmount); @Override MulticurveBundle apply(Object marketData, MatchDetails matchDetails); @Override Class<MulticurveBundle> getMarketDataType(); @Override Class<? extends MatchDetails> getMatchDetailsType(); @Override PerturbationTarget getTargetType(); static MulticurveOutputParallelShift.Meta meta(); static MulticurveOutputParallelShift.Builder builder(); @Override MulticurveOutputParallelShift.Meta metaBean(); @Override Property<R> property(String propertyName); @Override Set<String> propertyNames(); Builder toBuilder(); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString();  }
@Test public void absolute() { double shiftAmount = 0.01; MulticurveOutputParallelShift shift = MulticurveOutputParallelShift.absolute(shiftAmount); MulticurveBundle shiftedBundle = shift.apply(bundle(), StandardMatchDetails.multicurve(CURVE_NAME)); YieldAndDiscountCurve shiftedCurve = shiftedBundle.getMulticurveProvider().getDiscountingCurves().get(Currency.USD); assertEquals(RATE + shiftAmount, shiftedCurve.getInterestRate(0d)); assertEquals(RATE + shiftAmount, shiftedCurve.getInterestRate(1d)); }