/**
* 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.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import org.testng.annotations.Test;
import org.threeten.bp.Clock;
import org.threeten.bp.Period;
import org.threeten.bp.ZoneOffset;
import org.threeten.bp.ZonedDateTime;
import com.google.common.collect.Lists;
import com.opengamma.analytics.financial.model.volatility.surface.VolatilitySurface;
import com.opengamma.analytics.util.time.TimeCalculator;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.function.FunctionExecutionContext;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.util.test.TestGroup;
@Test(groups = TestGroup.UNIT)
public class VolatilitySurfaceShiftManipulatorTest {
private static final ZonedDateTime VALUATION_TIME = ZonedDateTime.of(2011, 3, 8, 11, 0, 0, 0, ZoneOffset.UTC);
private static final Clock CLOCK = Clock.fixed(VALUATION_TIME.toInstant(), ZoneOffset.UTC);
private static final FunctionExecutionContext EXECUTION_CONTEXT = new FunctionExecutionContext();
private static final ValueSpecification VALUE_SPECIFICATION =
new ValueSpecification("valueName",
ComputationTargetSpecification.NULL,
ValueProperties.with(ValuePropertyNames.FUNCTION, "foo").get());
static {
EXECUTION_CONTEXT.setValuationClock(CLOCK);
}
@Test
public void relativeSingle() {
double x = 1.1;
double y = 1.5;
double shiftAmount = 0.1;
VolatilitySurfaceShift shift = new VolatilitySurfaceShift(x, y, shiftAmount);
VolatilitySurface surface = mock(VolatilitySurface.class);
VolatilitySurfaceShiftManipulator manipulator =
VolatilitySurfaceShiftManipulator.create(ScenarioShiftType.RELATIVE, Lists.newArrayList(shift));
manipulator.execute(surface, VALUE_SPECIFICATION, EXECUTION_CONTEXT);
verify(surface).withSingleMultiplicativeShift(x, y, 1 + shiftAmount);
}
@Test
public void relativeMultiple() {
Period xPeriod1 = Period.ofYears(1);
double x1 = TimeCalculator.getTimeBetween(VALUATION_TIME, VALUATION_TIME.plus(xPeriod1));
double y1 = 1.5;
double shiftAmount1 = 0.1;
Period xPeriod2 = Period.ofYears(2);
double x2 = TimeCalculator.getTimeBetween(VALUATION_TIME, VALUATION_TIME.plus(xPeriod2));
double y2 = 2.5;
double shiftAmount2 = 0.2;
VolatilitySurfaceShift shift1 = new VolatilitySurfaceShift(xPeriod1, y1, shiftAmount1);
VolatilitySurfaceShift shift2 = new VolatilitySurfaceShift(xPeriod2, y2, shiftAmount2);
VolatilitySurface surface = mock(VolatilitySurface.class);
VolatilitySurfaceShiftManipulator manipulator =
VolatilitySurfaceShiftManipulator.create(ScenarioShiftType.RELATIVE, Lists.newArrayList(shift1, shift2));
manipulator.execute(surface, VALUE_SPECIFICATION, EXECUTION_CONTEXT);
verify(surface).withMultipleMultiplicativeShifts(new double[]{x1, x2},
new double[]{y1, y2},
new double[]{1 + shiftAmount1, 1 + shiftAmount2});
}
@Test
public void absoluteSingle() {
double x = 1.5;
Period yPeriod = Period.ofYears(1);
double y = TimeCalculator.getTimeBetween(VALUATION_TIME, VALUATION_TIME.plus(yPeriod));
double shiftAmount = 0.1;
VolatilitySurfaceShift shift = new VolatilitySurfaceShift(x, yPeriod, shiftAmount);
VolatilitySurface surface = mock(VolatilitySurface.class);
VolatilitySurfaceShiftManipulator manipulator =
VolatilitySurfaceShiftManipulator.create(ScenarioShiftType.ABSOLUTE, Lists.newArrayList(shift));
manipulator.execute(surface, VALUE_SPECIFICATION, EXECUTION_CONTEXT);
verify(surface).withSingleAdditiveShift(x, y, shiftAmount);
}
@Test
public void absoluteMultiple() {
double x1 = 1.1;
double y1 = 1.5;
double shiftAmount1 = 0.1;
double x2 = 2.1;
double y2 = 2.5;
double shiftAmount2 = 0.2;
VolatilitySurfaceShift shift1 = new VolatilitySurfaceShift(x1, y1, shiftAmount1);
VolatilitySurfaceShift shift2 = new VolatilitySurfaceShift(x2, y2, shiftAmount2);
VolatilitySurface surface = mock(VolatilitySurface.class);
VolatilitySurfaceShiftManipulator manipulator =
VolatilitySurfaceShiftManipulator.create(ScenarioShiftType.ABSOLUTE, Lists.newArrayList(shift1, shift2));
manipulator.execute(surface, VALUE_SPECIFICATION, EXECUTION_CONTEXT);
verify(surface).withMultipleAdditiveShifts(new double[]{x1, x2},
new double[]{y1, y2},
new double[]{shiftAmount1, shiftAmount2});
}
}