Package com.opengamma.analytics.financial.provider.sensitivity

Source Code of com.opengamma.analytics.financial.provider.sensitivity.MultipleCurrencyParameterSensitivityTest

/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.sensitivity;

import static com.opengamma.util.money.Currency.EUR;
import static com.opengamma.util.money.Currency.USD;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertTrue;

import java.util.LinkedHashMap;
import java.util.Map;

import org.testng.annotations.Test;

import com.google.common.collect.Maps;
import com.opengamma.analytics.financial.forex.method.FXMatrix;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity;
import com.opengamma.analytics.financial.util.AssertSensivityObjects;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.MatrixAlgebraFactory;
import com.opengamma.analytics.math.matrix.OGMatrixAlgebra;
import com.opengamma.util.money.Currency;
import com.opengamma.util.tuple.Pair;

/**
* Tests related to ParameterSensitivity manipulations.
*/
public class MultipleCurrencyParameterSensitivityTest {

  private static final OGMatrixAlgebra MATRIX = MatrixAlgebraFactory.OG_ALGEBRA;
  private static final DoubleMatrix1D SENSITIVITY_1_1 = new DoubleMatrix1D(4.0, 2.0, 5.0, 1.5);
  private static final DoubleMatrix1D SENSITIVITY_1_2 = new DoubleMatrix1D(4.0, 3.0, 5.0, 2.5);
  private static final DoubleMatrix1D SENSITIVITY_2_1 = new DoubleMatrix1D(5.0, 1.0, 2.0, 5.0, 1.5);
  private static final String NAME_1 = "Name1";
  private static final String NAME_2 = "Name2";
  private static final Pair<String, Currency> NAME_1_USD = Pair.of(NAME_1, USD);
  private static final Pair<String, Currency> NAME_1_EUR = Pair.of(NAME_1, EUR);
  private static final Pair<String, Currency> NAME_2_USD = Pair.of(NAME_2, USD);
  private static final Pair<String, Currency> NAME_2_EUR = Pair.of(NAME_2, EUR);

  private static final double TOLERANCE = 1.0E-5;

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testNullMap1() {
    new MultipleCurrencyParameterSensitivity(null);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testNullMap2() {
    MultipleCurrencyParameterSensitivity.of(null);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testPlusNullPair() {
    new MultipleCurrencyParameterSensitivity().plus(null, SENSITIVITY_1_1);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testPlusNullMatrix() {
    new MultipleCurrencyParameterSensitivity().plus(NAME_1_EUR, null);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testPlusNullSensitivities() {
    new MultipleCurrencyParameterSensitivity().plus(null);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testGetSensitivityNullNameCurrencyPair() {
    new MultipleCurrencyParameterSensitivity().getSensitivity(null);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testGetSensitivityNullName() {
    new MultipleCurrencyParameterSensitivity().getSensitivity(null, Currency.EUR);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testGetSensitivityNullCurrency() {
    new MultipleCurrencyParameterSensitivity().getSensitivity(NAME_1, null);
  }

  @Test(expectedExceptions = UnsupportedOperationException.class)
  public void testAddToUnmodifiableMap() {
    final LinkedHashMap<Pair<String, Currency>, DoubleMatrix1D> map = new LinkedHashMap<>();
    map.put(NAME_1_EUR, SENSITIVITY_1_1);
    final MultipleCurrencyParameterSensitivity sensitivities = MultipleCurrencyParameterSensitivity.of(map);
    final Map<Pair<String, Currency>, DoubleMatrix1D> unmodifiable = sensitivities.getSensitivities();
    unmodifiable.put(NAME_1_USD, SENSITIVITY_1_2);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testConvertNullFXMatrix() {
    new MultipleCurrencyParameterSensitivity().converted(null, EUR);
  }

  @Test(expectedExceptions = IllegalArgumentException.class)
  public void testConvertNullCurrency() {
    new MultipleCurrencyParameterSensitivity().converted(new FXMatrix(), null);
  }

  @Test
  public void testObject() {
    LinkedHashMap<Pair<String, Currency>, DoubleMatrix1D> map = new LinkedHashMap<>();
    map.put(NAME_1_EUR, SENSITIVITY_1_1);
    final MultipleCurrencyParameterSensitivity sensitivity = new MultipleCurrencyParameterSensitivity(map);
    assertFalse(sensitivity.getSensitivities() == map);
    assertEquals(map, sensitivity.getSensitivities());
    assertEquals(map.keySet(), sensitivity.getAllNamesCurrency());
    assertEquals(SENSITIVITY_1_1, sensitivity.getSensitivity(NAME_1_EUR));
    assertEquals(SENSITIVITY_1_1, sensitivity.getSensitivity(NAME_1, EUR));
    MultipleCurrencyParameterSensitivity other = new MultipleCurrencyParameterSensitivity(map);
    assertEquals(sensitivity, other);
    assertEquals(sensitivity.hashCode(), other.hashCode());
    map = new LinkedHashMap<>();
    assertFalse(sensitivity.getSensitivities().equals(map));
    map.put(NAME_1_EUR, SENSITIVITY_1_1);
    other = new MultipleCurrencyParameterSensitivity(map);
    assertEquals(sensitivity, other);
    map.put(NAME_1_USD, SENSITIVITY_1_2);
    map.put(NAME_2_USD, SENSITIVITY_2_1);
    other = MultipleCurrencyParameterSensitivity.of(map);
    assertFalse(sensitivity.equals(other));
    other = new MultipleCurrencyParameterSensitivity();
    assertTrue(other.getSensitivities().isEmpty());
  }

  @Test
  public void add() {
    MultipleCurrencyParameterSensitivity sensitivity1 = new MultipleCurrencyParameterSensitivity();
    sensitivity1 = sensitivity1.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity1 = sensitivity1.plus(NAME_1_USD, SENSITIVITY_1_2);
    assertEquals("Add same currency, different sensitivities: ", MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2), sensitivity1.getSensitivity(NAME_1_USD));
    MultipleCurrencyParameterSensitivity sensitivity2 = new MultipleCurrencyParameterSensitivity();
    sensitivity2 = sensitivity2.plus(NAME_1_EUR, SENSITIVITY_1_1);
    sensitivity2 = sensitivity2.plus(sensitivity1);
    assertEquals("Add different currency, test size: ", 2, sensitivity2.getSensitivities().size());
    final LinkedHashMap<Pair<String, Currency>, DoubleMatrix1D> expected = Maps.newLinkedHashMap();
    expected.put(NAME_1_EUR, SENSITIVITY_1_1);
    expected.put(NAME_1_USD, (DoubleMatrix1D) MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2));
    assertEquals("Add different currency, test map: ", expected, sensitivity2.getSensitivities());
    sensitivity2 = new MultipleCurrencyParameterSensitivity();
    sensitivity2 = sensitivity2.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity2 = sensitivity2.plus(sensitivity1);
    assertEquals("Add same currency, test sensitivities: ", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1_USD));
    sensitivity2 = sensitivity2.plus(NAME_2_EUR, SENSITIVITY_2_1);
    assertEquals("Add different currency, test sensitivities of first currency: ", SENSITIVITY_2_1, sensitivity2.getSensitivity(NAME_2_EUR));
    assertEquals("Add different currency, test sensitivities of second currency: ", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1_USD));
    sensitivity2 = sensitivity2.plus(NAME_2_EUR, SENSITIVITY_2_1);
    assertEquals("Test add same sensitivities: ", MATRIX.scale(SENSITIVITY_2_1, 2.0), sensitivity2.getSensitivity(NAME_2_EUR));
    assertEquals("Test other currency: ", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1_USD));
    sensitivity2 = sensitivity2.plus(NAME_1_EUR, SENSITIVITY_1_1);
    assertEquals("ParameterSensitivity: add", MATRIX.scale(SENSITIVITY_2_1, 2.0), sensitivity2.getSensitivity(NAME_2_EUR));
    assertEquals("ParameterSensitivity: add", MATRIX.add(SENSITIVITY_1_1, MATRIX.add(SENSITIVITY_1_1, SENSITIVITY_1_2)), sensitivity2.getSensitivity(NAME_1_USD));
    assertEquals("ParameterSensitivity: add", SENSITIVITY_1_1, sensitivity2.getSensitivity(NAME_1_EUR));
  }

  @Test
  public void multiplyBy() {
    final double factor = 5.8;
    MultipleCurrencyParameterSensitivity sensitivity = new MultipleCurrencyParameterSensitivity();
    sensitivity = sensitivity.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity = sensitivity.multipliedBy(factor);
    assertEquals("Test multiplyBy, single name / currency pair: ", MATRIX.scale(SENSITIVITY_1_1, factor), sensitivity.getSensitivity(NAME_1_USD));
    MultipleCurrencyParameterSensitivity sensi2 = new MultipleCurrencyParameterSensitivity();
    sensi2 = sensi2.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensi2 = sensi2.plus(NAME_2_EUR, SENSITIVITY_2_1);
    sensi2 = sensi2.multipliedBy(factor);
    assertEquals("Test multiplyBy, first name / currency pair: ", MATRIX.scale(SENSITIVITY_1_1, factor), sensi2.getSensitivity(NAME_1_USD));
    assertEquals("Test multiplyBy, second name / currency pair: ", MATRIX.scale(SENSITIVITY_2_1, factor), sensi2.getSensitivity(NAME_2_EUR));
  }

  @Test
  public void converted() {
    final FXMatrix fxMatrix = new FXMatrix(EUR, USD, 1.25);
    MultipleCurrencyParameterSensitivity sensitivity = new MultipleCurrencyParameterSensitivity();
    sensitivity = sensitivity.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity = sensitivity.plus(NAME_1_EUR, SENSITIVITY_1_2);
    sensitivity = sensitivity.plus(NAME_2_EUR, SENSITIVITY_2_1);
    final MultipleCurrencyParameterSensitivity sensitivityUSDConverted = sensitivity.converted(fxMatrix, USD);
    MultipleCurrencyParameterSensitivity sensitivityUSDExpected = new MultipleCurrencyParameterSensitivity();
    sensitivityUSDExpected = sensitivityUSDExpected.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivityUSDExpected = sensitivityUSDExpected.plus(NAME_1_USD, (DoubleMatrix1D) MATRIX.scale(SENSITIVITY_1_2, fxMatrix.getFxRate(EUR, USD)));
    sensitivityUSDExpected = sensitivityUSDExpected.plus(NAME_2_USD, (DoubleMatrix1D) MATRIX.scale(SENSITIVITY_2_1, fxMatrix.getFxRate(EUR, USD)));
    assertTrue("Test convert: ", AssertSensivityObjects.assertEquals("ParameterSensitivity: convert", sensitivityUSDExpected, sensitivityUSDConverted, TOLERANCE));
  }

  @Test
  public void compare() {
    MultipleCurrencyParameterSensitivity sensitivity1 = new MultipleCurrencyParameterSensitivity();
    sensitivity1 = sensitivity1.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity1 = sensitivity1.plus(NAME_2_EUR, SENSITIVITY_2_1);
    MultipleCurrencyParameterSensitivity sensitivity2 = new MultipleCurrencyParameterSensitivity();
    sensitivity2 = sensitivity2.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity2 = sensitivity2.plus(NAME_2_EUR, SENSITIVITY_2_1);
    AssertSensivityObjects.assertEquals("ParameterSensitivity: compare same data", sensitivity1, sensitivity2, TOLERANCE);
    AssertSensivityObjects.assertDoesNotEqual("ParameterSensitivity: compare different data outside tolerance", sensitivity1.multipliedBy(2.0), sensitivity2, TOLERANCE);
    AssertSensivityObjects.assertEquals("ParameterSensitivity: compare different data inside tolerance", sensitivity1.multipliedBy(1 + TOLERANCE / 10), sensitivity2, TOLERANCE);
    MultipleCurrencyParameterSensitivity sensitivity3 = new MultipleCurrencyParameterSensitivity();
    sensitivity3 = sensitivity3.plus(NAME_1_USD, SENSITIVITY_1_1);
    AssertSensivityObjects.assertDoesNotEqual("ParameterSensitivity: compare data with different name / currency pairs", sensitivity1, sensitivity3, TOLERANCE);
  }

  @Test
  public void getAllNamesCurrency() {
    final LinkedHashMap<Pair<String, Currency>, DoubleMatrix1D> map1 = Maps.newLinkedHashMap();
    map1.put(NAME_1_EUR, SENSITIVITY_1_1);
    map1.put(NAME_2_EUR, SENSITIVITY_1_2);
    map1.put(NAME_1_USD, SENSITIVITY_2_1);
    final MultipleCurrencyParameterSensitivity sensitivity1 = MultipleCurrencyParameterSensitivity.of(map1);
    assertEquals("ParameterSensitivity: getAllNamesCurrency", sensitivity1.getAllNamesCurrency(), sensitivity1.getSensitivities().keySet());
    assertEquals("ParameterSensitivity: getAllNamesCurrency", sensitivity1.getSensitivity(NAME_1, EUR), sensitivity1.getSensitivity(NAME_1_EUR));
    assertEquals("ParameterSensitivity: getAllNamesCurrency", sensitivity1.getSensitivity(NAME_2, EUR), sensitivity1.getSensitivity(NAME_2_EUR));
  }

  @Test
  public void equalHash() {
    MultipleCurrencyParameterSensitivity sensitivity = new MultipleCurrencyParameterSensitivity();
    sensitivity = sensitivity.plus(NAME_1_USD, SENSITIVITY_1_1);
    sensitivity = sensitivity.plus(NAME_2_EUR, SENSITIVITY_2_1);
    MultipleCurrencyParameterSensitivity modified = new MultipleCurrencyParameterSensitivity();
    modified = modified.plus(NAME_2_USD, SENSITIVITY_2_1);
    modified = modified.plus(NAME_2_EUR, SENSITIVITY_2_1);
    assertEquals("ParameterSensitivity: equalHash", sensitivity, sensitivity);
    assertEquals("ParameterSensitivity: equalHash", sensitivity.hashCode(), sensitivity.hashCode());
    assertFalse("ParameterSensitivity: equalHash", sensitivity.equals(SENSITIVITY_1_1));
    assertFalse("ParameterSensitivity: equalHash", sensitivity.equals(modified));
  }

}
TOP

Related Classes of com.opengamma.analytics.financial.provider.sensitivity.MultipleCurrencyParameterSensitivityTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.