/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.fp.businessobject;
import org.kuali.kfs.sys.context.KualiTestBase;
import org.kuali.rice.core.api.util.type.KualiDecimal;
public class CoinDetailTest extends KualiTestBase {
public enum CoinDetailAmountFixture {
GOOD_COIN_AMOUNT(5.0, 5.5, 0.75, 0.60, 0.45, 0.07), BAD_COIN_AMOUNT(5.5, 5.25, 0.80, 0.65, 0.63, 0.07), ALL_FIVES_COIN_AMOUNT(5.0, 5.0, 5.0, 5.0, 5.0, 5.0), ZERO_COIN_AMOUNT(0.0, 0.0, 0.0, 0.0, 0.0, 0.0), NEGATIVE_COIN_AMOUNT(-5.0, -5.0, -5.0, -5.0, -5.0, -5.0), NULL_COIN_AMOUNT(), ALL_TENS_COIN_AMOUNT(10.0, 10.0, 10.0, 10.0, 10.0, 10.0);
private KualiDecimal hundredCentAmount;
private KualiDecimal fiftyCentAmount;
private KualiDecimal twentyFiveCentAmount;
private KualiDecimal tenCentAmount;
private KualiDecimal fiveCentAmount;
private KualiDecimal oneCentAmount;
private CoinDetailAmountFixture() {
}
private CoinDetailAmountFixture(double hundredCentAmount, double fiftyCentAmount, double twentyFiveCentAmount, double tenCentAmount, double fiveCentAmount, double oneCentAmount) {
this.hundredCentAmount = new KualiDecimal(hundredCentAmount);
this.fiftyCentAmount = new KualiDecimal(fiftyCentAmount);
this.twentyFiveCentAmount = new KualiDecimal(twentyFiveCentAmount);
this.tenCentAmount = new KualiDecimal(tenCentAmount);
this.fiveCentAmount = new KualiDecimal(fiveCentAmount);
this.oneCentAmount = new KualiDecimal(oneCentAmount);
}
public CoinDetail convertToCoinDetail() {
CoinDetail coinDetail = new CoinDetail();
coinDetail.setFinancialDocumentHundredCentAmount(this.hundredCentAmount);
coinDetail.setFinancialDocumentFiftyCentAmount(this.fiftyCentAmount);
coinDetail.setFinancialDocumentTwentyFiveCentAmount(this.twentyFiveCentAmount);
coinDetail.setFinancialDocumentTenCentAmount(this.tenCentAmount);
coinDetail.setFinancialDocumentFiveCentAmount(this.fiveCentAmount);
coinDetail.setFinancialDocumentOneCentAmount(this.oneCentAmount);
return coinDetail;
}
}
public enum CoinDetailCountFixture {
GOOD_COIN_AMOUNT(new Integer(5), new Integer(7), new Integer(3), new Integer(6), new Integer(9), new Integer(7)), ALL_FIVES_COIN_AMOUNT(new Integer(5), new Integer(5), new Integer(5), new Integer(5), new Integer(5), new Integer(5)), ZERO_COIN_AMOUNT(new Integer(0), new Integer(0), new Integer(0), new Integer(0), new Integer(0), new Integer(0)), NULL_COIN_AMOUNT(null, null, null, null, null, null), NEGATIVE_COIN_AMOUNT(new Integer(-5), new Integer(-7), new Integer(-3), new Integer(-6), new Integer(-9), new Integer(-7));
private Integer hundredCentCount;
private Integer fiftyCentCount;
private Integer twentyFiveCentCount;
private Integer tenCentCount;
private Integer fiveCentCount;
private Integer oneCentCount;
private CoinDetailCountFixture(Integer hundredCentCount, Integer fiftyCentCount, Integer twentyFiveCentCount, Integer tenCentCount, Integer fiveCentCount, Integer oneCentCount) {
this.hundredCentCount = hundredCentCount;
this.fiftyCentCount = fiftyCentCount;
this.twentyFiveCentCount = twentyFiveCentCount;
this.tenCentCount = tenCentCount;
this.fiveCentCount = fiveCentCount;
this.oneCentCount = oneCentCount;
}
public CoinDetail convertToCoinDetail() {
CoinDetail coinDetail = new CoinDetail();
coinDetail.setHundredCentCount(this.hundredCentCount);
coinDetail.setFiftyCentCount(this.fiftyCentCount);
coinDetail.setTwentyFiveCentCount(this.twentyFiveCentCount);
coinDetail.setTenCentCount(this.tenCentCount);
coinDetail.setFiveCentCount(this.fiveCentCount);
coinDetail.setOneCentCount(this.oneCentCount);
return coinDetail;
}
}
public void testAmountToCountConversion() {
CoinDetail goodDetail = CoinDetailAmountFixture.GOOD_COIN_AMOUNT.convertToCoinDetail();
assertEquals(goodDetail.getHundredCentCount(), new Integer(5));
assertEquals(goodDetail.getFiftyCentCount(), new Integer(11));
assertEquals(goodDetail.getTwentyFiveCentCount(), new Integer(3));
assertEquals(goodDetail.getTenCentCount(), new Integer(6));
assertEquals(goodDetail.getFiveCentCount(), new Integer(9));
assertEquals(goodDetail.getOneCentCount(), new Integer(7));
}
public void testCountToAmountConversion() {
CoinDetail goodDetail = CoinDetailCountFixture.GOOD_COIN_AMOUNT.convertToCoinDetail();
assertEquals(goodDetail.getFinancialDocumentHundredCentAmount(), new KualiDecimal(5.0));
assertEquals(goodDetail.getFinancialDocumentFiftyCentAmount(), new KualiDecimal(3.5));
assertEquals(goodDetail.getFinancialDocumentTwentyFiveCentAmount(), new KualiDecimal(0.75));
assertEquals(goodDetail.getFinancialDocumentTenCentAmount(), new KualiDecimal(0.6));
assertEquals(goodDetail.getFinancialDocumentFiveCentAmount(), new KualiDecimal(0.45));
assertEquals(goodDetail.getFinancialDocumentOneCentAmount(), new KualiDecimal(0.07));
}
public void testZeroOutAmounts() {
CoinDetail zeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
CoinDetail goodAmount = CoinDetailAmountFixture.GOOD_COIN_AMOUNT.convertToCoinDetail();
CoinDetail goodZeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
CoinDetail nullAmount = CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
goodZeroAmount.zeroOutAmounts();
assertDetailAmountsEqual(goodZeroAmount, zeroAmount);
goodAmount.zeroOutAmounts();
assertDetailAmountsEqual(goodAmount, zeroAmount);
nullAmount.zeroOutAmounts();
assertDetailAmountsEqual(nullAmount, zeroAmount);
CoinDetail goodCount = CoinDetailCountFixture.GOOD_COIN_AMOUNT.convertToCoinDetail();
CoinDetail goodZeroCount = CoinDetailCountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
CoinDetail nullCount = CoinDetailCountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
goodZeroCount.zeroOutAmounts();
assertDetailAmountsEqual(goodZeroCount, zeroAmount);
goodCount.zeroOutAmounts();
assertDetailAmountsEqual(goodCount, zeroAmount);
nullCount.zeroOutAmounts();
assertDetailAmountsEqual(nullCount, zeroAmount);
}
public void testZeroOutUnpopulatedAmounts() {
CoinDetail zeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
CoinDetail goodAmount = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail nullAmount = CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
nullAmount.zeroOutUnpopulatedAmounts();
assertDetailAmountsEqual(nullAmount, zeroAmount);
goodAmount.zeroOutUnpopulatedAmounts();
assertDetailAmountsNotEqual(goodAmount, nullAmount);
goodAmount.setFinancialDocumentHundredCentAmount(null);
goodAmount.setFinancialDocumentTenCentAmount(null);
goodAmount.setFinancialDocumentOneCentAmount(null);
CoinDetail semiPopulatedAmount = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
semiPopulatedAmount.setFinancialDocumentHundredCentAmount(KualiDecimal.ZERO);
semiPopulatedAmount.setFinancialDocumentTenCentAmount(KualiDecimal.ZERO);
semiPopulatedAmount.setFinancialDocumentOneCentAmount(KualiDecimal.ZERO);
goodAmount.zeroOutUnpopulatedAmounts();
assertDetailAmountsEqual(goodAmount, semiPopulatedAmount);
CoinDetail goodCount = CoinDetailCountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail nullCount = CoinDetailCountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
nullCount.zeroOutUnpopulatedAmounts();
assertDetailAmountsEqual(nullCount, zeroAmount);
goodCount.zeroOutUnpopulatedAmounts();
assertDetailAmountsNotEqual(goodCount, zeroAmount);
}
public void testAdd() {
CoinDetail zeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
CoinDetail allFivesAmountControl = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail allFivesAmount = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail negativeAmountControl = CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail();
CoinDetail negativeAmount = CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail();
CoinDetail nullAmount = CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
allFivesAmount.add(zeroAmount);
assertDetailAmountsEqual(allFivesAmount, allFivesAmountControl);
allFivesAmount.add(nullAmount);
assertDetailAmountsEqual(allFivesAmount, allFivesAmountControl);
allFivesAmount.add(negativeAmount);
assertDetailAmountsEqual(allFivesAmount, zeroAmount);
negativeAmount.add(zeroAmount);
assertDetailAmountsEqual(negativeAmount, negativeAmountControl);
negativeAmount.add(nullAmount);
assertDetailAmountsEqual(negativeAmount, negativeAmountControl);
negativeAmount.add(allFivesAmountControl);
assertDetailAmountsEqual(negativeAmount, zeroAmount);
}
public void testSubtract() {
CoinDetail zeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
CoinDetail allFivesAmountControl = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail allFivesAmount = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
CoinDetail negativeAmountControl = CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail();
CoinDetail negativeAmount = CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail();
CoinDetail nullAmount = CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
allFivesAmount.subtract(zeroAmount);
assertDetailAmountsEqual(allFivesAmount, allFivesAmountControl);
allFivesAmount.subtract(nullAmount);
assertDetailAmountsEqual(allFivesAmount, allFivesAmountControl);
allFivesAmount.subtract(negativeAmount);
CoinDetail doublePositives = new CoinDetail();
doublePositives.setFinancialDocumentHundredCentAmount(new KualiDecimal(2).multiply(allFivesAmountControl.getFinancialDocumentHundredCentAmount()));
doublePositives.setFinancialDocumentFiftyCentAmount(new KualiDecimal(2).multiply(allFivesAmountControl.getFinancialDocumentFiftyCentAmount()));
doublePositives.setFinancialDocumentTwentyFiveCentAmount(new KualiDecimal(2).multiply(allFivesAmountControl.getFinancialDocumentTwentyFiveCentAmount()));
doublePositives.setFinancialDocumentTenCentAmount(new KualiDecimal(2).multiply(allFivesAmountControl.getFinancialDocumentTenCentAmount()));
doublePositives.setFinancialDocumentFiveCentAmount(new KualiDecimal(2).multiply(allFivesAmountControl.getFinancialDocumentFiveCentAmount()));
doublePositives.setFinancialDocumentOneCentAmount(new KualiDecimal(2).multiply(allFivesAmountControl.getFinancialDocumentOneCentAmount()));
assertDetailAmountsEqual(allFivesAmount, doublePositives);
negativeAmount.subtract(zeroAmount);
assertDetailAmountsEqual(negativeAmount, negativeAmountControl);
negativeAmount.subtract(nullAmount);
assertDetailAmountsEqual(negativeAmount, negativeAmountControl);
negativeAmount.subtract(allFivesAmountControl);
CoinDetail doubleNegatives = new CoinDetail();
doubleNegatives.setFinancialDocumentHundredCentAmount(new KualiDecimal(2).multiply(negativeAmountControl.getFinancialDocumentHundredCentAmount()));
doubleNegatives.setFinancialDocumentFiftyCentAmount(new KualiDecimal(2).multiply(negativeAmountControl.getFinancialDocumentFiftyCentAmount()));
doubleNegatives.setFinancialDocumentTwentyFiveCentAmount(new KualiDecimal(2).multiply(negativeAmountControl.getFinancialDocumentTwentyFiveCentAmount()));
doubleNegatives.setFinancialDocumentTenCentAmount(new KualiDecimal(2).multiply(negativeAmountControl.getFinancialDocumentTenCentAmount()));
doubleNegatives.setFinancialDocumentFiveCentAmount(new KualiDecimal(2).multiply(negativeAmountControl.getFinancialDocumentFiveCentAmount()));
doubleNegatives.setFinancialDocumentOneCentAmount(new KualiDecimal(2).multiply(negativeAmountControl.getFinancialDocumentOneCentAmount()));
assertDetailAmountsEqual(negativeAmount, doubleNegatives);
}
public void testTotal() {
CoinDetail zeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
assertEquals(zeroAmount.getTotalAmount(), KualiDecimal.ZERO);
CoinDetail nullAmount = CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
assertEquals(nullAmount.getTotalAmount(), KualiDecimal.ZERO);
CoinDetail allFivesAmount = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
assertEquals(allFivesAmount.getTotalAmount(), new KualiDecimal(30));
CoinDetail negativeAmount = CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail();
assertEquals(negativeAmount.getTotalAmount(), new KualiDecimal(-30));
}
public void testIsEmpty() {
CoinDetail zeroAmount = CoinDetailAmountFixture.ZERO_COIN_AMOUNT.convertToCoinDetail();
assertTrue(zeroAmount.isEmpty());
CoinDetail nullAmount = CoinDetailAmountFixture.NULL_COIN_AMOUNT.convertToCoinDetail();
assertTrue(nullAmount.isEmpty());
CoinDetail allFivesAmount = CoinDetailAmountFixture.ALL_FIVES_COIN_AMOUNT.convertToCoinDetail();
assertFalse(allFivesAmount.isEmpty());
CoinDetail negativeAmount = CoinDetailAmountFixture.NEGATIVE_COIN_AMOUNT.convertToCoinDetail();
assertFalse(allFivesAmount.isEmpty());
}
private void assertDetailAmountsEqual(CoinDetail tweedleDee, CoinDetail tweedleDum) {
assertEquals(tweedleDee.getFinancialDocumentHundredCentAmount(), tweedleDum.getFinancialDocumentHundredCentAmount());
assertEquals(tweedleDee.getFinancialDocumentFiftyCentAmount(), tweedleDum.getFinancialDocumentFiftyCentAmount());
assertEquals(tweedleDee.getFinancialDocumentTwentyFiveCentAmount(), tweedleDum.getFinancialDocumentTwentyFiveCentAmount());
assertEquals(tweedleDee.getFinancialDocumentTenCentAmount(), tweedleDum.getFinancialDocumentTenCentAmount());
assertEquals(tweedleDee.getFinancialDocumentFiveCentAmount(), tweedleDum.getFinancialDocumentFiveCentAmount());
assertEquals(tweedleDee.getFinancialDocumentOneCentAmount(), tweedleDum.getFinancialDocumentOneCentAmount());
}
private void assertDetailAmountsNotEqual(CoinDetail tweedleDee, CoinDetail tweedleDum) {
assertFalse(tweedleDee.getFinancialDocumentHundredCentAmount().equals(tweedleDum.getFinancialDocumentHundredCentAmount()));
assertFalse(tweedleDee.getFinancialDocumentFiftyCentAmount().equals(tweedleDum.getFinancialDocumentFiftyCentAmount()));
assertFalse(tweedleDee.getFinancialDocumentTwentyFiveCentAmount().equals(tweedleDum.getFinancialDocumentTwentyFiveCentAmount()));
assertFalse(tweedleDee.getFinancialDocumentTenCentAmount().equals(tweedleDum.getFinancialDocumentTenCentAmount()));
assertFalse(tweedleDee.getFinancialDocumentFiveCentAmount().equals(tweedleDum.getFinancialDocumentFiveCentAmount()));
assertFalse(tweedleDee.getFinancialDocumentOneCentAmount().equals(tweedleDum.getFinancialDocumentOneCentAmount()));
}
}