/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.basics.value;
import static com.opengamma.collect.TestHelper.assertSerialization;
import static com.opengamma.collect.TestHelper.assertThrowsIllegalArg;
import static com.opengamma.collect.TestHelper.coverImmutableBean;
import static com.opengamma.collect.TestHelper.date;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.opengamma.basics.schedule.SchedulePeriod;
/**
* Test {@link ValueSchedule}.
*/
@Test
public class ValueScheduleTest {
private static double TOLERANCE = 1.0E-10;
private static ValueStep STEP1 = ValueStep.ofAbsoluteAmount(date(2014, 6, 30), 2000d);
private static ValueStep STEP2 = ValueStep.ofAbsoluteAmount(date(2014, 7, 30), 3000d);
private static SchedulePeriod PERIOD1 = SchedulePeriod.of(date(2014, 1, 1), date(2014, 2, 1));
private static SchedulePeriod PERIOD2 = SchedulePeriod.of(date(2014, 2, 1), date(2014, 3, 1));
private static SchedulePeriod PERIOD3 = SchedulePeriod.of(
date(2014, 3, 1), date(2014, 4, 1), date(2014, 3, 2), date(2014, 4, 1));
private static ImmutableList<SchedulePeriod> PERIODS = ImmutableList.of(PERIOD1, PERIOD2, PERIOD3);
//-------------------------------------------------------------------------
public void test_constant_ALWAYS_0() {
ValueSchedule test = ValueSchedule.ALWAYS_0;
assertEquals(test.getInitialValue(), 0d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of());
}
public void test_constant_ALWAYS_1() {
ValueSchedule test = ValueSchedule.ALWAYS_1;
assertEquals(test.getInitialValue(), 1d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of());
}
//-------------------------------------------------------------------------
public void test_of_int() {
ValueSchedule test = ValueSchedule.of(10000d);
assertEquals(test.getInitialValue(), 10000d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of());
}
public void test_of_intStepsArray() {
ValueSchedule test = ValueSchedule.of(10000d, STEP1, STEP2);
assertEquals(test.getInitialValue(), 10000d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of(STEP1, STEP2));
}
public void test_of_intStepsArray_empty() {
ValueSchedule test = ValueSchedule.of(10000d, new ValueStep[0]);
assertEquals(test.getInitialValue(), 10000d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of());
}
public void test_of_intStepsList() {
ValueSchedule test = ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2));
assertEquals(test.getInitialValue(), 10000d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of(STEP1, STEP2));
}
public void test_of_intStepsList_empty() {
ValueSchedule test = ValueSchedule.of(10000d, Lists.newArrayList());
assertEquals(test.getInitialValue(), 10000d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of());
}
public void test_builder_validEmpty() {
ValueSchedule test = ValueSchedule.builder().build();
assertEquals(test.getInitialValue(), 0d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of());
}
public void test_builder_validFull() {
ValueSchedule test = ValueSchedule.builder().initialValue(2000d).steps(ImmutableList.of(STEP1, STEP2)).build();
assertEquals(test.getInitialValue(), 2000d, TOLERANCE);
assertEquals(test.getSteps(), ImmutableList.of(STEP1, STEP2));
}
//-------------------------------------------------------------------------
public void test_resolveValues_dateBased() {
ValueStep step1 = ValueStep.ofAbsoluteAmount(date(2014, 2, 1), 300d);
ValueStep step2 = ValueStep.ofAbsoluteAmount(date(2014, 3, 1), 400d);
// no steps
ValueSchedule test0 = ValueSchedule.of(200d, ImmutableList.of());
assertEquals(test0.resolveValues(PERIODS), ImmutableList.of(200d, 200d, 200d));
// step1
ValueSchedule test1a = ValueSchedule.of(200d, ImmutableList.of(step1));
assertEquals(test1a.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 300d));
// step2
ValueSchedule test1b = ValueSchedule.of(200d, ImmutableList.of(step2));
assertEquals(test1b.resolveValues(PERIODS), ImmutableList.of(200d, 200d, 400d));
// step1 and step2
ValueSchedule test2 = ValueSchedule.of(200d, ImmutableList.of(step1, step2));
assertEquals(test2.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 400d));
}
public void test_resolveValues_dateBased_matchAdjusted() {
ValueStep step1 = ValueStep.ofAbsoluteAmount(date(2014, 2, 1), 300d);
ValueStep step2 = ValueStep.ofAbsoluteAmount(date(2014, 3, 2), 400d);
// no steps
ValueSchedule test0 = ValueSchedule.of(200d, ImmutableList.of());
assertEquals(test0.resolveValues(PERIODS), ImmutableList.of(200d, 200d, 200d));
// step1
ValueSchedule test1a = ValueSchedule.of(200d, ImmutableList.of(step1));
assertEquals(test1a.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 300d));
// step2
ValueSchedule test1b = ValueSchedule.of(200d, ImmutableList.of(step2));
assertEquals(test1b.resolveValues(PERIODS), ImmutableList.of(200d, 200d, 400d));
// step1 and step2
ValueSchedule test2 = ValueSchedule.of(200d, ImmutableList.of(step1, step2));
assertEquals(test2.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 400d));
}
public void test_resolveValues_indexBased() {
ValueStep step1 = ValueStep.of(1, ValueAdjustment.ofAbsoluteAmount(300d));
ValueStep step2 = ValueStep.of(2, ValueAdjustment.ofAbsoluteAmount(400d));
// no steps
ValueSchedule test0 = ValueSchedule.of(200d, ImmutableList.of());
assertEquals(test0.resolveValues(PERIODS), ImmutableList.of(200d, 200d, 200d));
// step1
ValueSchedule test1a = ValueSchedule.of(200d, ImmutableList.of(step1));
assertEquals(test1a.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 300d));
// step2
ValueSchedule test1b = ValueSchedule.of(200d, ImmutableList.of(step2));
assertEquals(test1b.resolveValues(PERIODS), ImmutableList.of(200d, 200d, 400d));
// step1 and step2
ValueSchedule test2 = ValueSchedule.of(200d, ImmutableList.of(step1, step2));
assertEquals(test2.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 400d));
}
public void test_resolveValues_indexBased_duplicateDefinitionValid() {
ValueStep step1 = ValueStep.of(1, ValueAdjustment.ofAbsoluteAmount(300d));
ValueStep step2 = ValueStep.of(1, ValueAdjustment.ofAbsoluteAmount(300d));
ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step1, step2));
assertEquals(test.resolveValues(PERIODS), ImmutableList.of(200d, 300d, 300d));
}
public void test_resolveValues_indexBased_duplicateDefinitionInvalid() {
ValueStep step1 = ValueStep.of(1, ValueAdjustment.ofAbsoluteAmount(300d));
ValueStep step2 = ValueStep.of(1, ValueAdjustment.ofAbsoluteAmount(400d));
ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step1, step2));
assertThrowsIllegalArg(() -> test.resolveValues(PERIODS));
}
public void test_resolveValues_indexBased_indexTooBig() {
ValueStep step = ValueStep.of(3, ValueAdjustment.ofAbsoluteAmount(300d));
ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));
assertThrowsIllegalArg(() -> test.resolveValues(PERIODS));
}
public void test_resolveValues_dateBased_indexZeroInvalid() {
ValueStep step = ValueStep.ofAbsoluteAmount(date(2014, 1, 1), 300d);
ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));
assertThrowsIllegalArg(() -> test.resolveValues(PERIODS));
}
public void test_resolveValues_dateBased_dateInvalid() {
ValueStep step = ValueStep.ofAbsoluteAmount(date(2014, 4, 1), 300d);
ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));
assertThrowsIllegalArg(() -> test.resolveValues(PERIODS));
}
//-------------------------------------------------------------------------
public void equals() {
ValueSchedule a1 = ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2));
ValueSchedule a2 = ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2));
ValueSchedule b = ValueSchedule.of(5000d, Lists.newArrayList(STEP1, STEP2));
ValueSchedule c = ValueSchedule.of(10000d, Lists.newArrayList(STEP1));
assertEquals(a1.equals(a2), true);
assertEquals(a1.equals(b), false);
assertEquals(a1.equals(c), false);
}
//-------------------------------------------------------------------------
public void coverage() {
coverImmutableBean(ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2)));
}
public void test_serialization() {
assertSerialization(ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2)));
}
}