package io.konik.validation;
import com.neovisionaries.i18n.CurrencyCode;
import io.konik.util.Amounts;
import io.konik.zugferd.entity.AllowanceCharge;
import io.konik.zugferd.entity.GrossPrice;
import io.konik.zugferd.entity.trade.item.Item;
import io.konik.zugferd.entity.trade.item.SpecifiedAgreement;
import io.konik.zugferd.unqualified.Amount;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collection;
import java.util.Random;
import static io.konik.validation.AmountCalculator.ItemTotalAllowanceChargeCalculator;
import static java.math.BigDecimal.valueOf;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.runners.Parameterized.Parameter;
import static org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class ItemTotalAllowanceChargeCalculatorTest {
private static final CurrencyCode CURRENCY_CODE = CurrencyCode.USD;
private static final Random RANDOM = new Random();
@Parameters(name = "Calculating expected total allowance charge = {0} USD")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{ BigDecimal.ZERO, new AllowanceCharge[] {} },
{ valueOf(1), new AllowanceCharge[] { charge(valueOf(1)) } },
{ valueOf(5.23), new AllowanceCharge[] { charge(valueOf(0.23)), charge(valueOf(2.00)), charge(valueOf(1.5)), charge(valueOf(1.5)) } },
{ valueOf(2), new AllowanceCharge[] { charge(valueOf(5.01)), charge(valueOf(-3.01)) } }
});
}
@Parameter
public BigDecimal expectedTotalAllowanceCharge;
@Parameter(1)
public AllowanceCharge[] allowanceCharges;
@Test
public void test() {
//given:
Item item = createItem();
ItemTotalAllowanceChargeCalculator calculator = new ItemTotalAllowanceChargeCalculator(CURRENCY_CODE);
//when:
Amount totalAllowanceCharge = calculator.apply(item);
//then:
assertThat(totalAllowanceCharge.getValue())
.isEqualByComparingTo(expectedTotalAllowanceCharge);
}
private Item createItem() {
Item item = new Item();
GrossPrice grossPrice = new GrossPrice(Amounts.zero(CURRENCY_CODE));
grossPrice.addAllowanceCharge(allowanceCharges);
SpecifiedAgreement agreement = new SpecifiedAgreement();
agreement.setGrossPrice(grossPrice);
item.setAgreement(agreement);
return item;
}
private static AllowanceCharge charge(final BigDecimal value) {
AllowanceCharge charge = new AllowanceCharge();
charge.setActual(new Amount(value.abs(), CURRENCY_CODE));
if (value.signum() < 0) {
charge.setDiscount();
} else {
charge.setSurcharge();
}
return charge;
}
}