/* * 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 CurrencyDetailTest extends KualiTestBase { public enum CurrencyDetailAmountFixture { GOOD_POSITIVE_AMOUNT(500.0, 250.0, 100.0, 50.0, 25.0, 10.0, 5.0), BAD_POSITIVE_AMOUNT(367.0, 367.0, 367.0, 367.0, 367.0, 367.0, 367.5), ALL_FIVES_AMOUNT(500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0), NULL_AMOUNT, ZERO_AMOUNT(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), NEGATIVE_AMOUNT(-500.0, -500.0, -500.0, -500.0, -500.0, -500.0, -500.0), ALL_TENS_AMOUNT(1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0, 1000.0); private KualiDecimal hundredDollarAmount; private KualiDecimal fiftyDollarAmount; private KualiDecimal twentyDollarAmount; private KualiDecimal tenDollarAmount; private KualiDecimal fiveDollarAmount; private KualiDecimal twoDollarAmount; private KualiDecimal oneDollarAmount; private CurrencyDetailAmountFixture() { } private CurrencyDetailAmountFixture(double hundredDollarAmount, double fiftyDollarAmount, double twentyDollarAmount, double tenDollarAmount, double fiveDollarAmount, double twoDollarAmount, double oneDollarAmount) { this.hundredDollarAmount = new KualiDecimal(hundredDollarAmount); this.fiftyDollarAmount = new KualiDecimal(fiftyDollarAmount); this.twentyDollarAmount = new KualiDecimal(twentyDollarAmount); this.tenDollarAmount = new KualiDecimal(tenDollarAmount); this.fiveDollarAmount = new KualiDecimal(fiveDollarAmount); this.twoDollarAmount = new KualiDecimal(twoDollarAmount); this.oneDollarAmount = new KualiDecimal(oneDollarAmount); } public CurrencyDetail convertToCurrencyDetail() { CurrencyDetail detail = new CurrencyDetail(); detail.setFinancialDocumentHundredDollarAmount(this.hundredDollarAmount); detail.setFinancialDocumentFiftyDollarAmount(this.fiftyDollarAmount); detail.setFinancialDocumentTwentyDollarAmount(this.twentyDollarAmount); detail.setFinancialDocumentTenDollarAmount(this.tenDollarAmount); detail.setFinancialDocumentFiveDollarAmount(this.fiveDollarAmount); detail.setFinancialDocumentTwoDollarAmount(this.twoDollarAmount); detail.setFinancialDocumentOneDollarAmount(this.oneDollarAmount); return detail; } } public enum CurrencyDetailCountFixture { GOOD_POSITIVE_COUNT(new Integer(5), new Integer(10), new Integer(25), new Integer(50), new Integer(100), new Integer(250), new Integer(500)), ALL_FIVE_HUNDREDS_COUNT(new Integer(5), new Integer(5), new Integer(5), new Integer(5), new Integer(5), new Integer(5), new Integer(5)), NULL_COUNT, ZERO_COUNT(new Integer(0), new Integer(0), new Integer(0), new Integer(0), new Integer(0), new Integer(0), new Integer(0)), NEGATIVE_COUNT(new Integer(-5), new Integer(-5), new Integer(-5), new Integer(-5), new Integer(-5), new Integer(-5), new Integer(-5)); private Integer hundredDollarCount; private Integer fiftyDollarCount; private Integer twentyDollarCount; private Integer tenDollarCount; private Integer fiveDollarCount; private Integer twoDollarCount; private Integer oneDollarCount; private CurrencyDetailCountFixture() { } private CurrencyDetailCountFixture(Integer hundredDollarCount, Integer fiftyDollarCount, Integer twentyDollarCount, Integer tenDollarCount, Integer fiveDollarCount, Integer twoDollarCount, Integer oneDollarCount) { this.hundredDollarCount = hundredDollarCount; this.fiftyDollarCount = fiftyDollarCount; this.twentyDollarCount = twentyDollarCount; this.tenDollarCount = tenDollarCount; this.fiveDollarCount = fiveDollarCount; this.twoDollarCount = twoDollarCount; this.oneDollarCount = oneDollarCount; } public CurrencyDetail convertToCurrencyDetail() { CurrencyDetail detail = new CurrencyDetail(); detail.setHundredDollarCount(this.hundredDollarCount); detail.setFiftyDollarCount(this.fiftyDollarCount); detail.setTwentyDollarCount(this.twentyDollarCount); detail.setTenDollarCount(this.tenDollarCount); detail.setFiveDollarCount(this.fiveDollarCount); detail.setTwoDollarCount(this.twoDollarCount); detail.setOneDollarCount(this.oneDollarCount); return detail; } } public void testAmountToCountConversion() { CurrencyDetail goodAmount = CurrencyDetailAmountFixture.GOOD_POSITIVE_AMOUNT.convertToCurrencyDetail(); assertEquals(goodAmount.getHundredDollarCount(), new Integer(5)); assertEquals(goodAmount.getFiftyDollarCount(), new Integer(5)); assertEquals(goodAmount.getTwentyDollarCount(), new Integer(5)); assertEquals(goodAmount.getTenDollarCount(), new Integer(5)); assertEquals(goodAmount.getFiveDollarCount(), new Integer(5)); assertEquals(goodAmount.getTwoDollarCount(), new Integer(5)); assertEquals(goodAmount.getOneDollarCount(), new Integer(5)); } public void testCountToAmountConversion() { CurrencyDetail goodCount = CurrencyDetailCountFixture.GOOD_POSITIVE_COUNT.convertToCurrencyDetail(); assertEquals(goodCount.getFinancialDocumentHundredDollarAmount(), new KualiDecimal(500)); assertEquals(goodCount.getFinancialDocumentFiftyDollarAmount(), new KualiDecimal(500)); assertEquals(goodCount.getFinancialDocumentTwentyDollarAmount(), new KualiDecimal(500)); assertEquals(goodCount.getFinancialDocumentTenDollarAmount(), new KualiDecimal(500)); assertEquals(goodCount.getFinancialDocumentFiveDollarAmount(), new KualiDecimal(500)); assertEquals(goodCount.getFinancialDocumentTwoDollarAmount(), new KualiDecimal(500)); assertEquals(goodCount.getFinancialDocumentOneDollarAmount(), new KualiDecimal(500)); } public void testZeroOutAmounts() { CurrencyDetail zeroAmountControl = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail zeroAmount = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail nullAmount = CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail(); CurrencyDetail goodAmount = CurrencyDetailAmountFixture.GOOD_POSITIVE_AMOUNT.convertToCurrencyDetail(); CurrencyDetail negativeAmount = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); zeroAmount.zeroOutAmounts(); assertDetailAmountsEqual(zeroAmount, zeroAmountControl); nullAmount.zeroOutAmounts(); assertDetailAmountsEqual(nullAmount, zeroAmountControl); goodAmount.zeroOutAmounts(); assertDetailAmountsEqual(goodAmount, zeroAmountControl); negativeAmount.zeroOutAmounts(); assertDetailAmountsEqual(negativeAmount, zeroAmountControl); CurrencyDetail goodCount = CurrencyDetailCountFixture.GOOD_POSITIVE_COUNT.convertToCurrencyDetail(); CurrencyDetail zeroCount = CurrencyDetailCountFixture.ZERO_COUNT.convertToCurrencyDetail(); CurrencyDetail negativeCount = CurrencyDetailCountFixture.NEGATIVE_COUNT.convertToCurrencyDetail(); CurrencyDetail nullCount = CurrencyDetailCountFixture.NULL_COUNT.convertToCurrencyDetail(); zeroCount.zeroOutAmounts(); assertDetailAmountsEqual(zeroCount, zeroAmountControl); nullCount.zeroOutAmounts(); assertDetailAmountsEqual(nullCount, zeroAmountControl); goodCount.zeroOutAmounts(); assertDetailAmountsEqual(goodCount, zeroAmountControl); negativeCount.zeroOutAmounts(); assertDetailAmountsEqual(negativeCount, zeroAmountControl); } public void testZeroOutUnpopulatedAmounts() { CurrencyDetail zeroAmountControl = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail zeroAmount = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail nullAmount = CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail(); CurrencyDetail goodAmount = CurrencyDetailAmountFixture.GOOD_POSITIVE_AMOUNT.convertToCurrencyDetail(); zeroAmount.zeroOutUnpopulatedAmounts(); assertDetailAmountsEqual(zeroAmount, zeroAmountControl); nullAmount.zeroOutUnpopulatedAmounts(); assertDetailAmountsEqual(nullAmount, zeroAmountControl); goodAmount.zeroOutUnpopulatedAmounts(); assertDetailAmountsNotEqual(goodAmount, zeroAmountControl); goodAmount.setFinancialDocumentHundredDollarAmount(null); goodAmount.setFinancialDocumentTwentyDollarAmount(null); goodAmount.setFinancialDocumentFiveDollarAmount(null); goodAmount.setFinancialDocumentTwoDollarAmount(null); CurrencyDetail semiPopulatedAmount = CurrencyDetailAmountFixture.GOOD_POSITIVE_AMOUNT.convertToCurrencyDetail(); semiPopulatedAmount.setFinancialDocumentHundredDollarAmount(KualiDecimal.ZERO); semiPopulatedAmount.setFinancialDocumentTwentyDollarAmount(KualiDecimal.ZERO); semiPopulatedAmount.setFinancialDocumentFiveDollarAmount(KualiDecimal.ZERO); semiPopulatedAmount.setFinancialDocumentTwoDollarAmount(KualiDecimal.ZERO); goodAmount.zeroOutUnpopulatedAmounts(); assertDetailAmountsEqual(goodAmount, semiPopulatedAmount); CurrencyDetail goodCount = CurrencyDetailCountFixture.GOOD_POSITIVE_COUNT.convertToCurrencyDetail(); CurrencyDetail zeroCount = CurrencyDetailCountFixture.ZERO_COUNT.convertToCurrencyDetail(); CurrencyDetail nullCount = CurrencyDetailCountFixture.NULL_COUNT.convertToCurrencyDetail(); zeroCount.zeroOutUnpopulatedAmounts(); assertDetailAmountsEqual(zeroCount, zeroAmountControl); nullCount.zeroOutUnpopulatedAmounts(); assertDetailAmountsEqual(nullCount, zeroAmountControl); goodCount.zeroOutUnpopulatedAmounts(); assertDetailAmountsNotEqual(goodCount, zeroAmountControl); } public void testAdd() { CurrencyDetail zeroAmountControl = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail zeroAmount = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail nullAmount = CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail(); CurrencyDetail goodAmountControl = CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail(); CurrencyDetail goodAmount = CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail(); CurrencyDetail negativeAmountControl = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); CurrencyDetail negativeAmount = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); zeroAmount.add(zeroAmountControl); assertDetailAmountsEqual(zeroAmount, zeroAmountControl); nullAmount.add(zeroAmountControl); assertDetailAmountsEqual(nullAmount, zeroAmountControl); goodAmount.add(zeroAmountControl); assertDetailAmountsEqual(goodAmount, goodAmountControl); negativeAmount.add(zeroAmountControl); assertDetailAmountsEqual(negativeAmount, negativeAmountControl); goodAmount.add(negativeAmount); assertDetailAmountsEqual(goodAmount, zeroAmountControl); } public void testSubtract() { CurrencyDetail zeroAmountControl = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail zeroAmount = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); CurrencyDetail nullAmount = CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail(); CurrencyDetail goodAmountControl = CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail(); CurrencyDetail goodAmount = CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail(); CurrencyDetail negativeAmountControl = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); CurrencyDetail negativeAmount = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); zeroAmount.subtract(zeroAmountControl); assertDetailAmountsEqual(zeroAmount, zeroAmountControl); nullAmount.subtract(zeroAmountControl); assertDetailAmountsEqual(nullAmount, zeroAmountControl); goodAmount.subtract(zeroAmountControl); assertDetailAmountsEqual(goodAmount, goodAmountControl); negativeAmount.subtract(zeroAmountControl); assertDetailAmountsEqual(negativeAmount, negativeAmountControl); CurrencyDetail doublePositives = new CurrencyDetail(); doublePositives.setFinancialDocumentHundredDollarAmount(goodAmount.getFinancialDocumentHundredDollarAmount().multiply(new KualiDecimal(2.0))); doublePositives.setFinancialDocumentFiftyDollarAmount(goodAmount.getFinancialDocumentFiftyDollarAmount().multiply(new KualiDecimal(2.0))); doublePositives.setFinancialDocumentTwentyDollarAmount(goodAmount.getFinancialDocumentTwentyDollarAmount().multiply(new KualiDecimal(2.0))); doublePositives.setFinancialDocumentTenDollarAmount(goodAmount.getFinancialDocumentTenDollarAmount().multiply(new KualiDecimal(2.0))); doublePositives.setFinancialDocumentFiveDollarAmount(goodAmount.getFinancialDocumentFiveDollarAmount().multiply(new KualiDecimal(2.0))); doublePositives.setFinancialDocumentTwoDollarAmount(goodAmount.getFinancialDocumentTwoDollarAmount().multiply(new KualiDecimal(2.0))); doublePositives.setFinancialDocumentOneDollarAmount(goodAmount.getFinancialDocumentOneDollarAmount().multiply(new KualiDecimal(2.0))); goodAmount.subtract(negativeAmount); assertDetailAmountsEqual(goodAmount, doublePositives); negativeAmount = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); goodAmount = CurrencyDetailAmountFixture.ALL_FIVES_AMOUNT.convertToCurrencyDetail(); CurrencyDetail doubleNegatives = new CurrencyDetail(); doubleNegatives.setFinancialDocumentHundredDollarAmount(negativeAmount.getFinancialDocumentHundredDollarAmount().multiply(new KualiDecimal(2.0))); doubleNegatives.setFinancialDocumentFiftyDollarAmount(negativeAmount.getFinancialDocumentFiftyDollarAmount().multiply(new KualiDecimal(2.0))); doubleNegatives.setFinancialDocumentTwentyDollarAmount(negativeAmount.getFinancialDocumentTwentyDollarAmount().multiply(new KualiDecimal(2.0))); doubleNegatives.setFinancialDocumentTenDollarAmount(negativeAmount.getFinancialDocumentTenDollarAmount().multiply(new KualiDecimal(2.0))); doubleNegatives.setFinancialDocumentFiveDollarAmount(negativeAmount.getFinancialDocumentFiveDollarAmount().multiply(new KualiDecimal(2.0))); doubleNegatives.setFinancialDocumentTwoDollarAmount(negativeAmount.getFinancialDocumentTwoDollarAmount().multiply(new KualiDecimal(2.0))); doubleNegatives.setFinancialDocumentOneDollarAmount(negativeAmount.getFinancialDocumentOneDollarAmount().multiply(new KualiDecimal(2.0))); negativeAmount.subtract(goodAmount); assertDetailAmountsEqual(negativeAmount, doubleNegatives); } public void testTotal() { CurrencyDetail zeroAmount = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); assertEquals(zeroAmount.getTotalAmount(), new KualiDecimal(0.0)); CurrencyDetail nullAmount = CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail(); assertEquals(nullAmount.getTotalAmount(), new KualiDecimal(0.0)); CurrencyDetail goodAmount = CurrencyDetailAmountFixture.GOOD_POSITIVE_AMOUNT.convertToCurrencyDetail(); assertEquals(goodAmount.getTotalAmount(), new KualiDecimal(940.0)); CurrencyDetail negativeAmount = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); assertEquals(negativeAmount.getTotalAmount(), new KualiDecimal(-3500.0)); } public void testIsEmpty() { CurrencyDetail zeroAmount = CurrencyDetailAmountFixture.ZERO_AMOUNT.convertToCurrencyDetail(); assertTrue(zeroAmount.isEmpty()); CurrencyDetail nullAmount = CurrencyDetailAmountFixture.NULL_AMOUNT.convertToCurrencyDetail(); assertTrue(nullAmount.isEmpty()); CurrencyDetail goodAmount = CurrencyDetailAmountFixture.GOOD_POSITIVE_AMOUNT.convertToCurrencyDetail(); assertFalse(goodAmount.isEmpty()); CurrencyDetail negativeAmount = CurrencyDetailAmountFixture.NEGATIVE_AMOUNT.convertToCurrencyDetail(); assertFalse(negativeAmount.isEmpty()); } private void assertDetailAmountsEqual(CurrencyDetail tweedleDee, CurrencyDetail tweedleDum) { assertEquals(tweedleDee.getFinancialDocumentHundredDollarAmount(), tweedleDum.getFinancialDocumentHundredDollarAmount()); assertEquals(tweedleDee.getFinancialDocumentFiftyDollarAmount(), tweedleDum.getFinancialDocumentFiftyDollarAmount()); assertEquals(tweedleDee.getFinancialDocumentTwentyDollarAmount(), tweedleDum.getFinancialDocumentTwentyDollarAmount()); assertEquals(tweedleDee.getFinancialDocumentTenDollarAmount(), tweedleDum.getFinancialDocumentTenDollarAmount()); assertEquals(tweedleDee.getFinancialDocumentFiveDollarAmount(), tweedleDum.getFinancialDocumentFiveDollarAmount()); assertEquals(tweedleDee.getFinancialDocumentTwoDollarAmount(), tweedleDum.getFinancialDocumentTwoDollarAmount()); assertEquals(tweedleDee.getFinancialDocumentOneDollarAmount(), tweedleDum.getFinancialDocumentOneDollarAmount()); } public void assertDetailAmountsNotEqual(CurrencyDetail tweedleDee, CurrencyDetail tweedleDum) { assertFalse(tweedleDee.getFinancialDocumentHundredDollarAmount().equals(tweedleDum.getFinancialDocumentHundredDollarAmount())); assertFalse(tweedleDee.getFinancialDocumentFiftyDollarAmount().equals(tweedleDum.getFinancialDocumentFiftyDollarAmount())); assertFalse(tweedleDee.getFinancialDocumentTwentyDollarAmount().equals(tweedleDum.getFinancialDocumentTwentyDollarAmount())); assertFalse(tweedleDee.getFinancialDocumentTenDollarAmount().equals(tweedleDum.getFinancialDocumentTenDollarAmount())); assertFalse(tweedleDee.getFinancialDocumentFiveDollarAmount().equals(tweedleDum.getFinancialDocumentFiveDollarAmount())); assertFalse(tweedleDee.getFinancialDocumentTwoDollarAmount().equals(tweedleDum.getFinancialDocumentTwoDollarAmount())); assertFalse(tweedleDee.getFinancialDocumentOneDollarAmount().equals(tweedleDum.getFinancialDocumentOneDollarAmount())); } }