/** Tests applying a relative index shift to SmileSurfaceDataBundle. */
 @Test
 public void indexShiftRelativeSurfaceData() {
   StandardSmileSurfaceDataBundle surfaceData =
       new StandardSmileSurfaceDataBundle(
           0d,
           new double[] {0, 0, 0}, // not relevant to this test
           new double[] {1.1, 1.2, 1.3},
           new double[][] {{10}, {10, 20}, {10, 20, 30}},
           new double[][] {{1}, {2, 3}, {4, 5, 6}},
           new LinearInterpolator1D()); // not relevant to this test
   List<Double> shiftList = Lists.newArrayList(0d, 0.1, 0.2);
   VolatilitySurfaceIndexShifts shifts =
       new VolatilitySurfaceIndexShifts(ScenarioShiftType.RELATIVE, shiftList);
   SmileSurfaceDataBundle shiftedData = shifts.shiftSurfaceData(surfaceData);
   double[][] expectedVols = new double[][] {{1}, {2.2, 3.3}, {4.8, 6.0, 7.2}};
   double[][] shiftedVols = shiftedData.getVolatilities();
   assertTrue(Arrays.deepEquals(expectedVols, shiftedVols));
 }
 /**
  * Tests applying an index shift to a surface where there are fewer shifts specified than expiries
  * in the surface.
  */
 @Test
 public void indexSurfaceFewerShiftsThanExpiries() {
   NodalDoublesSurface surface =
       new NodalDoublesSurface(
           new double[] {1.1, 1.2, 1.2, 1.3, 1.3, 1.3},
           new double[] {0.1, 0.1, 0.2, 0.1, 0.2, 0.3},
           new double[] {1, 2, 3, 4, 5, 6});
   List<Double> shiftList = Lists.newArrayList(0d, 0.1);
   VolatilitySurfaceIndexShifts shifts =
       new VolatilitySurfaceIndexShifts(ScenarioShiftType.ABSOLUTE, shiftList);
   ValueProperties properties = ValueProperties.with(ValuePropertyNames.FUNCTION, "bar").get();
   ValueSpecification spec =
       new ValueSpecification("foo", ComputationTargetSpecification.NULL, properties);
   VolatilitySurface shiftedSurface =
       shifts.execute(new VolatilitySurface(surface), spec, new FunctionExecutionContext());
   assertEquals(1.0, shiftedSurface.getVolatility(1.1, 0.1), DELTA);
   assertEquals(2.1, shiftedSurface.getVolatility(1.2, 0.1), DELTA);
   assertEquals(3.1, shiftedSurface.getVolatility(1.2, 0.2), DELTA);
   assertEquals(4.0, shiftedSurface.getVolatility(1.3, 0.1), DELTA);
   assertEquals(5.0, shiftedSurface.getVolatility(1.3, 0.2), DELTA);
   assertEquals(6.0, shiftedSurface.getVolatility(1.3, 0.3), DELTA);
 }
 /** Tests applying a relative index shift to a surface. */
 @Test
 public void indexSurfaceRelative() {
   NodalDoublesSurface surface =
       new NodalDoublesSurface(
           new double[] {1.1, 1.2, 1.2, 1.3, 1.3, 1.3},
           new double[] {10, 10, 20, 10, 20, 30},
           new double[] {1, 2, 3, 4, 5, 6});
   List<Double> shiftList = Lists.newArrayList(0d, 0.1, 0.2);
   VolatilitySurfaceIndexShifts shifts =
       new VolatilitySurfaceIndexShifts(ScenarioShiftType.RELATIVE, shiftList);
   ValueProperties properties = ValueProperties.with(ValuePropertyNames.FUNCTION, "bar").get();
   ValueSpecification spec =
       new ValueSpecification("foo", ComputationTargetSpecification.NULL, properties);
   VolatilitySurface shiftedSurface =
       shifts.execute(new VolatilitySurface(surface), spec, new FunctionExecutionContext());
   assertEquals(1.0, shiftedSurface.getVolatility(1.1, 10), DELTA);
   assertEquals(2.2, shiftedSurface.getVolatility(1.2, 10), DELTA);
   assertEquals(3.3, shiftedSurface.getVolatility(1.2, 20), DELTA);
   assertEquals(4.8, shiftedSurface.getVolatility(1.3, 10), DELTA);
   assertEquals(6.0, shiftedSurface.getVolatility(1.3, 20), DELTA);
   assertEquals(7.2, shiftedSurface.getVolatility(1.3, 30), DELTA);
 }