/*
 * Copyright 2017 Kuelap, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.mifos.portfolio.api.v1.domain;

import io.mifos.core.test.domain.ValidationTest;
import io.mifos.core.test.domain.ValidationTestCase;
import org.junit.runners.Parameterized;

import java.math.BigDecimal;
import java.util.*;

/**
 * @author Myrle Krantz
 */
public class BalanceSegmentSetTest extends ValidationTest<BalanceSegmentSet> {
  public BalanceSegmentSetTest(ValidationTestCase<BalanceSegmentSet> testCase) {
    super(testCase);
  }

  @Override
  protected BalanceSegmentSet createValidTestSubject() {
    final BalanceSegmentSet ret = new BalanceSegmentSet();
    ret.setIdentifier("valid");
    ret.setSegments(new TreeSet<>(Arrays.asList(BigDecimal.valueOf(100), BigDecimal.valueOf(10_000))));
    ret.setSegmentIdentifiers(Arrays.asList("small", "medium", "large"));
    return ret;
  }

  @Parameterized.Parameters
  public static Collection testCases() {
    final Collection<ValidationTestCase> ret = new ArrayList<>();
    ret.add(new ValidationTestCase<BalanceSegmentSet>("basicCase")
        .adjustment(x -> {})
        .valid(true));
    ret.add(new ValidationTestCase<BalanceSegmentSet>("null segments")
        .adjustment(x -> x.setSegments(null))
        .valid(false));
    ret.add(new ValidationTestCase<BalanceSegmentSet>("null identifiers")
        .adjustment(x -> x.setSegmentIdentifiers(null))
        .valid(false));
    ret.add(new ValidationTestCase<BalanceSegmentSet>("too short identifier list")
        .adjustment(x -> x.setSegmentIdentifiers(Arrays.asList("small", "large")))
        .valid(false));
    ret.add(new ValidationTestCase<BalanceSegmentSet>("negative segmentation")
        .adjustment(x -> x.setSegments(new TreeSet<>(Arrays.asList(BigDecimal.ONE.negate(), BigDecimal.valueOf(100)))))
        .valid(false));
    ret.add(new ValidationTestCase<BalanceSegmentSet>("invalid identifier")
        .adjustment(x -> x.setIdentifier("//"))
        .valid(false));
    ret.add(new ValidationTestCase<BalanceSegmentSet>("invalid segment identifier")
        .adjustment(x -> x.setSegmentIdentifiers(Arrays.asList("small", "large", "//")))
        .valid(false));
    return ret;
  }
}