public void test_applyTo() {
MarketDataBox<FxRate> marketData = MarketDataBox.ofSingleValue(FX_RATE);
FxRateShifts testScaled = FxRateShifts.of(ShiftType.SCALED, SHIFT_AMOUNT_2, EURUSD);
MarketDataBox<FxRate> computedScaled = testScaled.applyTo(marketData, REF_DATA);
MarketDataBox<FxRate> expectedScaled = MarketDataBox.ofScenarioValues(ImmutableList.of(
FxRate.of(EURUSD, BASE_RATE * SHIFT_AMOUNT_2.get(0)),
FxRate.of(EURUSD, BASE_RATE * SHIFT_AMOUNT_2.get(2))));
assertEquals(computedScaled, expectedScaled);
FxRateShifts testScaledInv = FxRateShifts.of(ShiftType.SCALED, SHIFT_AMOUNT_2, USDEUR);
MarketDataBox<FxRate> computedScaledInv = testScaledInv.applyTo(marketData, REF_DATA);
MarketDataBox<FxRate> expectedScaledInv = MarketDataBox.ofScenarioValues(ImmutableList.of(
FxRate.of(USDEUR, 1d / BASE_RATE * SHIFT_AMOUNT_2.get(0)),
FxRate.of(USDEUR, 1d / BASE_RATE * SHIFT_AMOUNT_2.get(2))));
assertEquals(computedScaledInv, expectedScaledInv);
FxRateShifts testAbsolute = FxRateShifts.of(ShiftType.ABSOLUTE, SHIFT_AMOUNT_1, EURUSD);
MarketDataBox<FxRate> computedAbsolute = testAbsolute.applyTo(marketData, REF_DATA);
MarketDataBox<FxRate> expectedAbsolute = MarketDataBox.ofScenarioValues(ImmutableList.of(
FxRate.of(EURUSD, BASE_RATE + SHIFT_AMOUNT_1.get(0)),
FxRate.of(EURUSD, BASE_RATE + SHIFT_AMOUNT_1.get(2))));
assertEquals(computedAbsolute, expectedAbsolute);
FxRateShifts testRelative = FxRateShifts.of(ShiftType.RELATIVE, SHIFT_AMOUNT_1, EURUSD);
MarketDataBox<FxRate> computedRelative = testRelative.applyTo(marketData, REF_DATA);
MarketDataBox<FxRate> expectedRelative = MarketDataBox.ofScenarioValues(ImmutableList.of(
FxRate.of(EURUSD, BASE_RATE * (1d + SHIFT_AMOUNT_1.get(0))),