/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.marketdata.manipulator.dsl; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.function.FunctionExecutionContext; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.value.ValueProperties; import com.opengamma.engine.value.ValuePropertyNames; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.financial.currency.CurrencyPair; import com.opengamma.util.money.Currency; import com.opengamma.util.test.TestGroup; @Test(groups = TestGroup.UNIT) public class SpotRateScalingTest { private static final double DELTA = 0.00000001; /* Scaling of 0.1 means +10%, i.e. multiply by 1.1 */ private static final SpotRateScaling UP_10 = new SpotRateScaling(1.1d, ImmutableSet.of(CurrencyPair.parse("EUR/USD"), CurrencyPair.parse("CHF/JPY"))); /* Scaling of -0.2 means -20%, i.e. multiply by 0.8 */ private static final SpotRateScaling DOWN_20 = new SpotRateScaling(0.8d, ImmutableSet.of(CurrencyPair.parse("EUR/USD"), CurrencyPair.parse("CHF/JPY"))); private static ValueSpecification valueSpec(String currencyPairStr) { ValueProperties properties = ValueProperties.with(ValuePropertyNames.FUNCTION, "foo").get(); CurrencyPair currencyPair = CurrencyPair.parse(currencyPairStr); ComputationTargetSpecification targetSpec = new ComputationTargetSpecification(CurrencyPair.TYPE, currencyPair.getUniqueId()); return new ValueSpecification("SpotRate", targetSpec, properties); } @Test public void normalPair() { assertEquals(4.4, UP_10.execute(4.0, valueSpec("EUR/USD"), new FunctionExecutionContext()), DELTA); assertEquals(5.5, UP_10.execute(5.0, valueSpec("CHF/JPY"), new FunctionExecutionContext()), DELTA); assertEquals(3.2, DOWN_20.execute(4.0, valueSpec("EUR/USD"), new FunctionExecutionContext()), DELTA); assertEquals(4.0, DOWN_20.execute(5.0, valueSpec("CHF/JPY"), new FunctionExecutionContext()), DELTA); } @Test public void inversePair() { assertEquals(0.22727272727272727, UP_10.execute(0.25, valueSpec("USD/EUR"), new FunctionExecutionContext()), DELTA); assertEquals(0.18181818181818182, UP_10.execute(0.2, valueSpec("JPY/CHF"), new FunctionExecutionContext()), DELTA); assertEquals(0.3125, DOWN_20.execute(0.25, valueSpec("USD/EUR"), new FunctionExecutionContext()), DELTA); assertEquals(0.25, DOWN_20.execute(0.2, valueSpec("JPY/CHF"), new FunctionExecutionContext()), DELTA); } @Test public void boundedRate() { SpotRateScaling up = new SpotRateScaling(2d, 0, 6d, CurrencyPair.parse("EUR/USD")); assertEquals(4d, up.execute(2d, valueSpec("EUR/USD"), new FunctionExecutionContext()), DELTA); assertEquals(6d, up.execute(5d, valueSpec("EUR/USD"), new FunctionExecutionContext()), DELTA); SpotRateScaling down = new SpotRateScaling(0.5, 0.3, 6d, CurrencyPair.parse("EUR/USD")); assertEquals(1d, down.execute(2d, valueSpec("EUR/USD"), new FunctionExecutionContext()), DELTA); assertEquals(0.3, down.execute(0.5, valueSpec("EUR/USD"), new FunctionExecutionContext()), DELTA); } @Test public void boundedInverseRate() { SpotRateScaling up = new SpotRateScaling(2d, 0, 6d, CurrencyPair.parse("EUR/USD")); assertEquals(1d, up.execute(2d, valueSpec("USD/EUR"), new FunctionExecutionContext()), DELTA); assertEquals(0.166666666, up.execute(0.2, valueSpec("USD/EUR"), new FunctionExecutionContext()), DELTA); SpotRateScaling down = new SpotRateScaling(0.5, 0.2, 6d, CurrencyPair.parse("EUR/USD")); assertEquals(0.5, down.execute(0.25, valueSpec("USD/EUR"), new FunctionExecutionContext()), DELTA); assertEquals(5, down.execute(4d, valueSpec("USD/EUR"), new FunctionExecutionContext()), DELTA); } @Test(expectedExceptions = IllegalArgumentException.class) public void unexpectedTargetType() { ValueProperties properties = ValueProperties.with(ValuePropertyNames.FUNCTION, "foo").get(); ComputationTargetSpecification targetSpec = new ComputationTargetSpecification(ComputationTargetType.CURRENCY, Currency.GBP.getUniqueId()); ValueSpecification valueSpec = new ValueSpecification("SpotRate", targetSpec, properties); UP_10.execute(2d, valueSpec, new FunctionExecutionContext()); } @Test(expectedExceptions = IllegalArgumentException.class) public void unexpectedCurrencyPair() { UP_10.execute(2d, valueSpec("GBP/USD"), new FunctionExecutionContext()); } }