/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.volatilityswap; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.util.ArrayList; import java.util.List; import org.testng.annotations.Test; import com.opengamma.util.test.TestGroup; /** * */ @Test(groups = TestGroup.UNIT) public class VolatilitySwapCalculatorResultTest { private static final double[] putWeights = new double[] {0., -1., 1.5, }; private static final double straddleWeight = 1.e2; private static final double[] callWeights = new double[] {11. / 7. }; private static final double[] putPrices = new double[] {3.1, 4., 5.214 }; private static final double straddlePrice = 2.2; private static final double[] callPrices = new double[] {33. }; private static final double cash = 11.3; private static final double[] putStrikes = new double[] {1.1, 1.3, 1.4 }; private static final double[] callStrikes = new double[] {1.6 }; /** * */ @Test public void accessTest() { final VolatilitySwapCalculatorResult res = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, putPrices, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResultWithStrikes resStrikes = new VolatilitySwapCalculatorResultWithStrikes(putStrikes, callStrikes, putWeights, straddleWeight, callWeights, putPrices, straddlePrice, callPrices, cash); final int nPuts = putWeights.length; final int nCalls = callWeights.length; double optionTotal = straddleWeight * straddlePrice; for (int i = 0; i < nPuts; ++i) { assertEquals(putWeights[i], res.getPutWeights()[i]); assertEquals(putPrices[i], res.getPutPrices()[i]); assertEquals(putStrikes[i], resStrikes.getPutStrikes()[i]); optionTotal += putWeights[i] * putPrices[i]; } assertEquals(straddleWeight, res.getStraddleWeight()); assertEquals(straddlePrice, res.getStraddlePrice()); for (int i = 0; i < nCalls; ++i) { assertEquals(callWeights[i], res.getCallWeights()[i]); assertEquals(callPrices[i], res.getCallPrices()[i]); assertEquals(callStrikes[i], resStrikes.getCallStrikes()[i]); optionTotal += callWeights[i] * callPrices[i]; } assertEquals(cash, res.getCash()); assertEquals(optionTotal, res.getOptionTotal()); assertEquals(optionTotal + cash, res.getFairValue()); final VolatilitySwapCalculatorResultWithStrikes resStrikesFrom = res.withStrikes(putStrikes, callStrikes); assertEquals(resStrikes.hashCode(), resStrikesFrom.hashCode()); assertEquals(resStrikes, resStrikesFrom); } /** * Equals and hashcode are tested */ @Test public void hashEqualsTest() { final VolatilitySwapCalculatorResult res1 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, putPrices, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResult res2 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, putPrices, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResult res3 = new VolatilitySwapCalculatorResult(new double[] {0., 1., 1.5, }, straddleWeight, callWeights, putPrices, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResult res4 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight + 2., callWeights, putPrices, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResult res5 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, new double[] {1.5, }, putPrices, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResult res6 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, new double[] {1., 1., 1.5, }, straddlePrice, callPrices, cash); final VolatilitySwapCalculatorResult res7 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, putPrices, straddlePrice + 1., callPrices, cash); final VolatilitySwapCalculatorResult res8 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, putPrices, straddlePrice, new double[] {2. }, cash); final VolatilitySwapCalculatorResult res9 = new VolatilitySwapCalculatorResult(putWeights, straddleWeight, callWeights, putPrices, straddlePrice, callPrices, cash + 1.); assertTrue(res1.equals(res1)); assertTrue(res1.equals(res2)); assertTrue(res2.equals(res1)); assertEquals(res1.hashCode(), res2.hashCode()); assertTrue(!(res1.equals(res3))); assertTrue(!(res3.equals(res1))); assertTrue(!(res1.equals(res3))); assertTrue(!(res3.equals(res1))); assertTrue(!(res1.equals(res4))); assertTrue(!(res4.equals(res1))); assertTrue(!(res1.equals(res5))); assertTrue(!(res5.equals(res1))); assertTrue(!(res1.equals(res6))); assertTrue(!(res6.equals(res1))); assertTrue(!(res1.equals(res7))); assertTrue(!(res7.equals(res1))); assertTrue(!(res1.equals(res8))); assertTrue(!(res8.equals(res1))); assertTrue(!(res1.equals(res9))); assertTrue(!(res9.equals(res1))); assertTrue(!(res1.equals(null))); assertTrue(!(res1.equals(new CarrLeeSeasonedSyntheticVolatilitySwapCalculator()))); final int size = 8; List<VolatilitySwapCalculatorResult> list = new ArrayList<>(size); list.add(res2); list.add(res3); list.add(res4); list.add(res5); list.add(res6); list.add(res7); list.add(res8); list.add(res9); for (int i = 0; i < size; ++i) { if (res1.hashCode() != list.get(i).hashCode()) { assertTrue(!(res1.equals(list.get(i)))); } } final VolatilitySwapCalculatorResultWithStrikes resStrikesFrom1 = res1.withStrikes(putStrikes, callStrikes); final VolatilitySwapCalculatorResultWithStrikes resStrikesFrom3 = res3.withStrikes(putStrikes, callStrikes); final VolatilitySwapCalculatorResultWithStrikes resStrikesFrom11 = res1.withStrikes(putStrikes, callWeights); final VolatilitySwapCalculatorResultWithStrikes resStrikesFrom12 = res1.withStrikes(putWeights, callStrikes); assertTrue(resStrikesFrom1.equals(resStrikesFrom1)); assertTrue(!(resStrikesFrom1.equals(null))); assertTrue(!(resStrikesFrom1.equals(res1))); assertTrue(!(resStrikesFrom1.equals(resStrikesFrom3))); assertTrue(!(resStrikesFrom1.equals(resStrikesFrom11))); assertTrue(!(resStrikesFrom1.equals(resStrikesFrom12))); } }