/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.marketdatasnapshot; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.testng.annotations.Test; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.ObjectsPair; import com.opengamma.util.tuple.Pairs; import com.opengamma.util.tuple.Triple; /** * Tests the volatility cube data object. */ @Test(groups = TestGroup.UNIT) public class VolatilityCubeDataTest { //TODO why is type information lost? /** * Tests a rectangular cube. */ @Test public void testRectangular() { final Double[] uniqueXValues = new Double[] {1., 2., 3., 4., 5., 6., 7. }; final Double[] uniqueYValues = new Double[] {100., 110., 120., 130., 140., 150., 160., 170., 180., 190. }; final Double[] uniqueZValues = new Double[] {1100., 1110., 1120., 1130., 1140., 1150., 1160., 1170., 1180., 1190. }; final int xLength = uniqueXValues.length; final int yLength = uniqueYValues.length; final int zLength = uniqueZValues.length; final double[][][] vols = new double[xLength][yLength][zLength]; final Double[] xs = new Double[xLength * yLength * zLength]; final Double[] ys = new Double[xLength * yLength * zLength]; final Double[] zs = new Double[xLength * yLength * zLength]; final Map<Triple<Object, Object, Object>, Double> values = new HashMap<>(); int count = 0; for (int i = 0, v = 0; i < xLength; i++) { for (int j = 0; j < yLength; j++) { for (int k = 0; k < zLength; k++, v++) { vols[i][j][k] = v; xs[count] = uniqueXValues[i]; ys[count] = uniqueYValues[j]; zs[count++] = uniqueZValues[k]; values.put(Triple.<Object, Object, Object>of(uniqueXValues[i], uniqueYValues[j], uniqueZValues[k]), vols[i][j][k]); } } } final String name = "test"; final VolatilityCubeData<Object, Object, Object> data = new VolatilityCubeData<>(name, name, values); final String xLabel = "time"; final String yLabel = "strike"; final String zLabel = "maturity"; final VolatilityCubeData<Object, Object, Object> dataWithLabels = new VolatilityCubeData<>(name, name, xLabel, yLabel, zLabel, values); assertEquals(xs.length, data.getXs().length); assertTrue(Arrays.asList(xs).containsAll(Arrays.asList(data.getXs()))); assertEquals(ys.length, data.getYs().length); assertTrue(Arrays.asList(ys).containsAll(Arrays.asList(data.getYs()))); assertEquals(zs.length, data.getZs().length); assertTrue(Arrays.asList(zs).containsAll(Arrays.asList(data.getZs()))); assertArrayEquals(uniqueXValues, data.getUniqueXValues().toArray(new Double[xLength])); assertArrayEquals(uniqueYValues, data.getUniqueYValues().toArray(new Double[yLength])); assertEquals(xs.length, dataWithLabels.getXs().length); assertTrue(Arrays.asList(xs).containsAll(Arrays.asList(dataWithLabels.getXs()))); assertEquals(ys.length, dataWithLabels.getYs().length); assertTrue(Arrays.asList(ys).containsAll(Arrays.asList(dataWithLabels.getYs()))); assertEquals(zs.length, dataWithLabels.getZs().length); assertTrue(Arrays.asList(zs).containsAll(Arrays.asList(dataWithLabels.getZs()))); assertArrayEquals(uniqueXValues, dataWithLabels.getUniqueXValues().toArray(new Double[xLength])); assertArrayEquals(uniqueYValues, dataWithLabels.getUniqueYValues().toArray(new Double[yLength])); assertEquals("x", data.getXLabel()); assertEquals("y", data.getYLabel()); assertEquals("z", data.getZLabel()); assertEquals(xLabel, dataWithLabels.getXLabel()); assertEquals(yLabel, dataWithLabels.getYLabel()); assertEquals(zLabel, dataWithLabels.getZLabel()); int i = 0; for (final Object x : data.getUniqueXValues()) { int j = 0; for (final Object y : data.getUniqueYValues()) { final List<ObjectsPair<Object, Double>> strips = data.getZValuesForXandY(x, y); final List<ObjectsPair<Object, Double>> stripsWithLabels = dataWithLabels.getZValuesForXandY(x, y); int k = 0; for (final ObjectsPair<Object, Double> strip : strips) { assertEquals(uniqueZValues[k], (Double) strip.getFirst(), 0); assertEquals(vols[i][j][k++], strip.getSecond(), 0); } j++; assertEquals(strips, stripsWithLabels); } i++; } } /** * Tests a sparsely-populated cube. */ @Test public void testSparse() { final Double[] xs = new Double[] {1., 1., 1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3., 3., 3., 4., 4. }; final Double[] ys = new Double[] {4., 5., 6., 4., 5., 6., 4., 5., 4., 5., 5., 6., 7., 5., 6., 7., 8., 9. }; final Double[] zs = new Double[] {14., 15., 16., 24., 25., 26., 14., 15., 24., 25., 15., 16., 17., 25., 26., 27., 18., 28. }; final double[] vols = new double[] {10., 11., 12., 13., 14., 15., 16., 17., 18., 210., 211., 212., 213., 214., 215., 216., 217., 218. }; final Map<Triple<Object, Object, Object>, Double> values = new HashMap<>(); for (int i = 0; i < xs.length; i++) { values.put(Triple.<Object, Object, Object>of(xs[i], ys[i], zs[i]), vols[i]); } final String name = "test"; final VolatilityCubeData<Object, Object, Object> data = new VolatilityCubeData<>(name, name, values); assertEquals(xs.length, data.getXs().length); assertTrue(Arrays.asList(xs).containsAll(Arrays.asList(data.getXs()))); assertEquals(ys.length, data.getYs().length); assertTrue(Arrays.asList(ys).containsAll(Arrays.asList(data.getYs()))); assertEquals(zs.length, data.getZs().length); assertTrue(Arrays.asList(zs).containsAll(Arrays.asList(data.getZs()))); assertArrayEquals(new Double[] {1., 2., 3., 4. }, data.getUniqueXValues().toArray(new Double[3])); assertArrayEquals(new Double[] {4., 5., 6., 7., 8., 9. }, data.getUniqueYValues().toArray(new Double[6])); assertEquals(Arrays.asList(Pairs.of(14., 10.), Pairs.of(24., 13.)), data.getZValuesForXandY(1., 4.)); assertEquals(Arrays.asList(Pairs.of(14., 16.), Pairs.of(24., 18.)), data.getZValuesForXandY(2., 4.)); assertEquals(Arrays.asList(Pairs.of(15., 211.), Pairs.of(25., 214.)), data.getZValuesForXandY(3., 5.)); assertEquals(Arrays.asList(Pairs.of(18., 217.)), data.getZValuesForXandY(4., 8.)); } }