/*
 * Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.strata.pricer.impl.tree;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

import com.opengamma.strata.collect.DoubleArrayMath;
import com.opengamma.strata.collect.array.DoubleArray;

/**
 * Test {@link TrigeorgisLatticeSpecification}.
 */
public class TrigeorgisLatticeSpecificationTest {

  private static final int NUM = 35;
  private static final double VOL = 0.13;
  private static final double RATE = 0.03;
  private static final double DT = 2d / NUM;

  @Test
  public void test_formula() {
    TrigeorgisLatticeSpecification test = new TrigeorgisLatticeSpecification();
    DoubleArray computed = test.getParametersTrinomial(VOL, RATE, DT);
    double dx = VOL * Math.sqrt(3d * DT);
    double nu = RATE - 0.5 * VOL * VOL;
    double u = Math.exp(dx);
    double d = Math.exp(-dx);
    double up = 0.5 * ((VOL * VOL * DT + nu * nu * DT * DT) / (dx * dx) + nu * DT / dx);
    double dm = 1d - (VOL * VOL * DT + nu * nu * DT * DT) / (dx * dx);
    double dp = 0.5 * ((VOL * VOL * DT + nu * nu * DT * DT) / (dx * dx) - nu * DT / dx);
    DoubleArray expected = DoubleArray.of(u, 1d, d, up, dm, dp);
    assertThat(DoubleArrayMath.fuzzyEquals(computed.toArray(), expected.toArray(), 1.0e-14)).isTrue();
  }

}
