public virtual void test_builder_validEmpty()
        {
            ValueSchedule test = ValueSchedule.builder().build();

            assertEquals(test.InitialValue, 0d, TOLERANCE);
            assertEquals(test.Steps, ImmutableList.of());
        }
        public virtual void test_resolveValues_dateBased_invalidChangeValue()
        {
            ValueStep     step = ValueStep.of(date(2014, 4, 1), ValueAdjustment.ofReplace(300d));
            ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));

            assertThrowsIllegalArg(() => test.resolveValues(SCHEDULE), "ValueStep date does not match a period boundary.*");
        }
        public virtual void test_of_intStepsList_empty()
        {
            ValueSchedule test = ValueSchedule.of(10000d, Lists.newArrayList());

            assertEquals(test.InitialValue, 10000d, TOLERANCE);
            assertEquals(test.Steps, ImmutableList.of());
        }
        public virtual void test_constant_ALWAYS_1()
        {
            ValueSchedule test = ValueSchedule.ALWAYS_1;

            assertEquals(test.InitialValue, 1d, TOLERANCE);
            assertEquals(test.Steps, ImmutableList.of());
        }
        public virtual void test_resolveValues_dateBased_indexZeroValid()
        {
            ValueStep     step = ValueStep.of(date(2014, 1, 1), ValueAdjustment.ofReplace(300d));
            ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));

            assertEquals(test.resolveValues(SCHEDULE), DoubleArray.of(300d, 300d, 300d));
        }
        public virtual void test_resolveValues_dateBased_invalidDateAfter()
        {
            ValueStep     step = ValueStep.of(date(2014, 4, 3), ValueAdjustment.ofReplace(300d));
            ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));

            assertThrowsIllegalArg(() => test.resolveValues(SCHEDULE), "ValueStep date is after the end of the schedule.*");
        }
        public virtual void test_resolveValues_indexBased_indexTooBig()
        {
            ValueStep     step = ValueStep.of(3, ValueAdjustment.ofReplace(300d));
            ValueSchedule test = ValueSchedule.of(200d, ImmutableList.of(step));

            assertThrowsIllegalArg(() => test.resolveValues(SCHEDULE));
        }
        public virtual void test_of_intStepsArray()
        {
            ValueSchedule test = ValueSchedule.of(10000d, STEP1, STEP2);

            assertEquals(test.InitialValue, 10000d, TOLERANCE);
            assertEquals(test.Steps, ImmutableList.of(STEP1, STEP2));
        }
        //-------------------------------------------------------------------------
        public virtual void test_resolveValues_sequence()
        {
            ValueStepSequence seq  = ValueStepSequence.of(date(2014, 2, 1), date(2014, 3, 1), Frequency.P1M, ValueAdjustment.ofDeltaAmount(100));
            ValueSchedule     test = ValueSchedule.of(200d, seq);

            assertEquals(test.resolveValues(SCHEDULE), DoubleArray.of(200d, 300d, 400d));
        }
        public virtual void test_resolveValues_sequenceAndSteps()
        {
            ValueStepSequence seq   = ValueStepSequence.of(date(2014, 2, 1), date(2014, 3, 1), Frequency.P1M, ValueAdjustment.ofDeltaAmount(100));
            ValueStep         step1 = ValueStep.of(date(2014, 1, 1), ValueAdjustment.ofReplace(350d));
            ValueSchedule     test  = ValueSchedule.builder().initialValue(200d).steps(step1).stepSequence(seq).build();

            assertEquals(test.resolveValues(SCHEDULE), DoubleArray.of(350d, 450d, 550d));
        }
        public virtual void test_resolveValues_indexBased_duplicateDefinitionInvalid()
        {
            ValueStep     step1 = ValueStep.of(1, ValueAdjustment.ofReplace(300d));
            ValueStep     step2 = ValueStep.of(1, ValueAdjustment.ofReplace(400d));
            ValueSchedule test  = ValueSchedule.of(200d, ImmutableList.of(step1, step2));

            assertThrowsIllegalArg(() => test.resolveValues(SCHEDULE));
        }
        public virtual void test_resolveValues_indexBased_duplicateDefinitionValid()
        {
            ValueStep     step1 = ValueStep.of(1, ValueAdjustment.ofReplace(300d));
            ValueStep     step2 = ValueStep.of(1, ValueAdjustment.ofReplace(300d));
            ValueSchedule test  = ValueSchedule.of(200d, ImmutableList.of(step1, step2));

            assertEquals(test.resolveValues(SCHEDULE), DoubleArray.of(200d, 300d, 300d));
        }
        public virtual void test_resolveValues_sequenceAndStepClash()
        {
            ValueStepSequence seq   = ValueStepSequence.of(date(2014, 2, 1), date(2014, 3, 1), Frequency.P1M, ValueAdjustment.ofDeltaAmount(100));
            ValueStep         step1 = ValueStep.of(date(2014, 2, 1), ValueAdjustment.ofReplace(350d));
            ValueSchedule     test  = ValueSchedule.builder().initialValue(200d).steps(step1).stepSequence(seq).build();

            assertThrowsIllegalArg(() => test.resolveValues(SCHEDULE));
        }
        public virtual void test_of_sequence()
        {
            ValueStepSequence seq  = ValueStepSequence.of(date(2016, 4, 20), date(2016, 10, 20), Frequency.P3M, ValueAdjustment.ofDeltaAmount(-100));
            ValueSchedule     test = ValueSchedule.of(10000d, seq);

            assertEquals(test.InitialValue, 10000d, TOLERANCE);
            assertEquals(test.Steps, ImmutableList.of());
            assertEquals(test.StepSequence, seq);
        }
        public virtual void test_builder_validFull()
        {
            ValueStepSequence seq  = ValueStepSequence.of(date(2016, 4, 20), date(2016, 10, 20), Frequency.P3M, ValueAdjustment.ofDeltaAmount(-100));
            ValueSchedule     test = ValueSchedule.builder().initialValue(2000d).steps(STEP1, STEP2).stepSequence(seq).build();

            assertEquals(test.InitialValue, 2000d, TOLERANCE);
            assertEquals(test.Steps, ImmutableList.of(STEP1, STEP2));
            assertEquals(test.StepSequence, seq);
        }
        //-------------------------------------------------------------------------
        public virtual void coverage()
        {
            ValueStepSequence seq = ValueStepSequence.of(date(2014, 2, 1), date(2014, 3, 1), Frequency.P1M, ValueAdjustment.ofDeltaAmount(100));

            ValueSchedule test = ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2));

            coverImmutableBean(test);
            coverBeanEquals(test, ValueSchedule.of(20000d, seq));
        }
        public virtual void test_resolveValues_dateBased_ignoreExcess()
        {
            ValueStep     step1 = ValueStep.of(date(2014, 2, 1), ValueAdjustment.ofReplace(300d));
            ValueStep     step2 = ValueStep.of(date(2014, 2, 15), ValueAdjustment.ofReplace(300d));   // no change to value
            ValueStep     step3 = ValueStep.of(date(2014, 3, 1), ValueAdjustment.ofReplace(400d));
            ValueStep     step4 = ValueStep.of(date(2014, 3, 15), ValueAdjustment.ofDeltaAmount(0d)); // no change to value
            ValueStep     step5 = ValueStep.of(date(2014, 4, 1), ValueAdjustment.ofMultiplier(1d));
            ValueSchedule test  = ValueSchedule.of(200d, ImmutableList.of(step1, step2, step3, step4, step5));

            assertEquals(test.resolveValues(SCHEDULE), DoubleArray.of(200d, 300d, 400d));
        }
        //-------------------------------------------------------------------------
        public virtual 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 override bool Equals(object obj)
 {
     if (obj == this)
     {
         return(true);
     }
     if (obj != null && obj.GetType() == this.GetType())
     {
         ValueSchedule other = (ValueSchedule)obj;
         return(JodaBeanUtils.equal(initialValue, other.initialValue) && JodaBeanUtils.equal(steps, other.steps) && JodaBeanUtils.equal(stepSequence, other.stepSequence));
     }
     return(false);
 }
        public virtual void test_resolveValues_indexBased()
        {
            ValueStep step1 = ValueStep.of(1, ValueAdjustment.ofReplace(300d));
            ValueStep step2 = ValueStep.of(2, ValueAdjustment.ofReplace(400d));
            // no steps
            ValueSchedule test0 = ValueSchedule.of(200d, ImmutableList.of());

            assertEquals(test0.resolveValues(SCHEDULE), DoubleArray.of(200d, 200d, 200d));
            // step1
            ValueSchedule test1a = ValueSchedule.of(200d, ImmutableList.of(step1));

            assertEquals(test1a.resolveValues(SCHEDULE), DoubleArray.of(200d, 300d, 300d));
            // step2
            ValueSchedule test1b = ValueSchedule.of(200d, ImmutableList.of(step2));

            assertEquals(test1b.resolveValues(SCHEDULE), DoubleArray.of(200d, 200d, 400d));
            // step1 and step2
            ValueSchedule test2 = ValueSchedule.of(200d, ImmutableList.of(step1, step2));

            assertEquals(test2.resolveValues(SCHEDULE), DoubleArray.of(200d, 300d, 400d));
        }
 public virtual void test_serialization()
 {
     assertSerialization(ValueSchedule.of(10000d, Lists.newArrayList(STEP1, STEP2)));
 }