001 /**
002 * Copyright 2005-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.krad.datadictionary.validation.constraint;
017
018 import java.util.ArrayList;
019 import java.util.List;
020
021 import org.junit.Assert;
022 import org.junit.Before;
023 import org.junit.Ignore;
024 import org.junit.Test;
025 import org.kuali.rice.krad.datadictionary.AttributeDefinition;
026 import org.kuali.rice.krad.datadictionary.BusinessObjectEntry;
027 import org.kuali.rice.krad.datadictionary.validation.Account;
028 import org.kuali.rice.krad.datadictionary.validation.AttributeValueReader;
029 import org.kuali.rice.krad.datadictionary.validation.DictionaryObjectAttributeValueReader;
030 import org.kuali.rice.krad.datadictionary.validation.ErrorLevel;
031 import org.kuali.rice.krad.datadictionary.validation.processor.ValidCharactersConstraintProcessor;
032 import org.kuali.rice.krad.datadictionary.validation.result.ConstraintValidationResult;
033 import org.kuali.rice.krad.datadictionary.validation.result.DictionaryValidationResult;
034
035
036 /**
037 * Things this test should check:
038 *
039 * 1. empty value check. (failure) {@link #testValueEmpty()}
040 * 2. value with valid positive number within specified precision and scale. (success) {@link #testValueValidPositiveNumber()}
041 * 3. value with invalid positive number as per given precision and scale. (failure) {@link testValueInvalidPositiveNumber()}
042 * 4. value with invalid negative number as allowNegative set to false. (failure) {@link testValueInvalidNegativeNumber()}
043 * 5. value with valid negative number within specified precision and scale, with allowNegative set to true. (success) {@link testValueValidNegativeNumber()}
044 * 6. value with invalid negative number as per given precision and scale. (failure) {@link testValueInvalidNegativeNumber1()}
045 * 7. value with invalid positive number as per given precision and scale. (failure) {@link testValueInvalidPositiveNumber1()}
046 * 8. value with valid negative number within specified precision and scale, with allowNegative set to true. (success) {@link testValueValidNegativeNumber1()}
047 * 9. zero precision and scale test. (error) {@link testZeroPrecisionAndScale()}
048 * 10. precision less than scale test. (error) {@link testPrecisionLessThanScale()}
049 * 11. negative precision and scale test. (error) {@link testNegativePrecisionAndScale()}
050 *
051 *
052 *
053 * @author Kuali Rice Team (rice.collab@kuali.org)
054 */
055 public class FixedPointPatternConstraintTest {
056
057 private AttributeDefinition totalBalanceDefinition;
058 private AttributeDefinition debitBalanceDefinition;
059 private AttributeDefinition creditBalanceDefinition;
060
061 private BusinessObjectEntry addressEntry;
062 private DictionaryValidationResult dictionaryValidationResult;
063
064 private ValidCharactersConstraintProcessor processor;
065
066 private Account iciciAccount = new Account("11111111","ICICI","5000.00","15000","-10000");
067 private Account citibankAccount = new Account("22222222","Citi Bank","15000.70","14999.70","1.");
068 private Account wellsFargoAccount = new Account("33333333","Wells Fargo","",".25","-.25");
069 private Account morganAccount = new Account("44444444","J P Morgan","-1000.00","1000.00","-2000.00");
070
071 private FixedPointPatternConstraint totalBalanceFixedPointPatternConstraint;
072 private FixedPointPatternConstraint debitBalanceFixedPointPatternConstraint;
073 private FixedPointPatternConstraint creditBalanceFixedPointPatternConstraint;
074 private FixedPointPatternConstraint creditBalanceFixedPointPatternConstraint1;
075 private FixedPointPatternConstraint creditBalanceFixedPointPatternConstraint2;
076
077 @Before
078 public void setUp() throws Exception {
079
080 processor = new ValidCharactersConstraintProcessor();
081
082 dictionaryValidationResult = new DictionaryValidationResult();
083 dictionaryValidationResult.setErrorLevel(ErrorLevel.NOCONSTRAINT);
084
085 addressEntry = new BusinessObjectEntry();
086
087 List<AttributeDefinition> attributes = new ArrayList<AttributeDefinition>();
088
089 totalBalanceFixedPointPatternConstraint = new FixedPointPatternConstraint();
090 totalBalanceFixedPointPatternConstraint.setPrecision(6);
091 totalBalanceFixedPointPatternConstraint.setScale(2);
092
093 totalBalanceDefinition = new AttributeDefinition();
094 totalBalanceDefinition.setName("totalBalance");
095 totalBalanceDefinition.setValidCharactersConstraint(totalBalanceFixedPointPatternConstraint);
096 attributes.add(totalBalanceDefinition);
097
098 debitBalanceFixedPointPatternConstraint = new FixedPointPatternConstraint();
099 debitBalanceFixedPointPatternConstraint.setPrecision(6);
100 debitBalanceFixedPointPatternConstraint.setScale(2);
101 debitBalanceFixedPointPatternConstraint.setAllowNegative(true);
102
103 debitBalanceDefinition = new AttributeDefinition();
104 debitBalanceDefinition.setName("debitBalance");
105 debitBalanceDefinition.setValidCharactersConstraint(debitBalanceFixedPointPatternConstraint);
106 attributes.add(debitBalanceDefinition);
107
108 creditBalanceFixedPointPatternConstraint = new FixedPointPatternConstraint();
109 creditBalanceFixedPointPatternConstraint.setPrecision(0);
110 creditBalanceFixedPointPatternConstraint.setScale(0);
111
112 creditBalanceDefinition = new AttributeDefinition();
113 creditBalanceDefinition.setName("creditBalance");
114 creditBalanceDefinition.setValidCharactersConstraint(creditBalanceFixedPointPatternConstraint);
115 attributes.add(creditBalanceDefinition);
116
117 creditBalanceFixedPointPatternConstraint1 = new FixedPointPatternConstraint();
118 creditBalanceFixedPointPatternConstraint1.setPrecision(2);
119 creditBalanceFixedPointPatternConstraint1.setScale(3);
120
121 creditBalanceFixedPointPatternConstraint2 = new FixedPointPatternConstraint();
122 creditBalanceFixedPointPatternConstraint2.setPrecision(-2);
123 creditBalanceFixedPointPatternConstraint2.setScale(-3);
124
125 addressEntry.setAttributes(attributes);
126 }
127
128 @Test
129 public void testValueEmpty() {
130 ConstraintValidationResult result = process(wellsFargoAccount, "totalBalance", totalBalanceFixedPointPatternConstraint);
131 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
132 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
133 Assert.assertEquals(ErrorLevel.INAPPLICABLE, result.getStatus());
134 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
135 }
136
137 @Test
138 public void testValueValidPositiveNumber() {
139 ConstraintValidationResult result = process(iciciAccount, "totalBalance", totalBalanceFixedPointPatternConstraint);
140 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
141 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
142 Assert.assertEquals(ErrorLevel.OK, result.getStatus());
143 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
144 }
145
146 @Ignore
147 @Test
148 public void testValueInvalidPositiveNumber() {
149 ConstraintValidationResult result = process(citibankAccount, "totalBalance", totalBalanceFixedPointPatternConstraint);
150 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
151 Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
152 Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
153 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
154 }
155
156 @Ignore
157 @Test
158 public void testValueInvalidNegativeNumber() {
159 ConstraintValidationResult result = process(morganAccount, "totalBalance", totalBalanceFixedPointPatternConstraint);
160 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
161 Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
162 Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
163 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
164 }
165
166 @Test
167 public void testValueValidNegativeNumber() {
168 ConstraintValidationResult result = process(morganAccount, "debitBalance", debitBalanceFixedPointPatternConstraint);
169 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
170 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
171 Assert.assertEquals(ErrorLevel.OK, result.getStatus());
172 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
173 }
174
175 @Ignore
176 @Test
177 public void testValueInvalidNegativeNumber1() {
178 ConstraintValidationResult result = process(iciciAccount, "debitBalance", debitBalanceFixedPointPatternConstraint);
179 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
180 Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
181 Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
182 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
183 }
184
185 @Ignore
186 @Test
187 public void testValueInvalidPositiveNumber1() {
188 ConstraintValidationResult result = process(citibankAccount, "debitBalance", debitBalanceFixedPointPatternConstraint);
189 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
190 Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
191 Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
192 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
193 }
194
195 @Test
196 public void testValueValidNegativeNumber1() {
197 ConstraintValidationResult result = process(wellsFargoAccount, "debitBalance", debitBalanceFixedPointPatternConstraint);
198 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
199 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
200 Assert.assertEquals(ErrorLevel.OK, result.getStatus());
201 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
202 }
203
204 @Test(expected=java.util.regex.PatternSyntaxException.class)
205 public void testZeroPrecisionAndScale() {
206 ConstraintValidationResult result = process(wellsFargoAccount, "creditBalance", creditBalanceFixedPointPatternConstraint);
207 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
208 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
209 Assert.assertEquals(ErrorLevel.OK, result.getStatus());
210 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
211 }
212
213 @Test(expected=java.util.regex.PatternSyntaxException.class)
214 public void testPrecisionLessThanScale() {
215 ConstraintValidationResult result = process(wellsFargoAccount, "creditBalance", creditBalanceFixedPointPatternConstraint1);
216 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
217 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
218 Assert.assertEquals(ErrorLevel.OK, result.getStatus());
219 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
220 }
221
222 @Test(expected=java.util.regex.PatternSyntaxException.class)
223 public void testNegativePrecisionAndScale() {
224 ConstraintValidationResult result = process(wellsFargoAccount, "creditBalance", creditBalanceFixedPointPatternConstraint2);
225 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
226 Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
227 Assert.assertEquals(ErrorLevel.OK, result.getStatus());
228 Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
229 }
230
231 private ConstraintValidationResult process(Object object, String attributeName, ValidCharactersConstraint constraint) {
232 AttributeValueReader attributeValueReader = new DictionaryObjectAttributeValueReader(object, "org.kuali.rice.kns.datadictionary.validation.MockAddress", addressEntry);
233 attributeValueReader.setAttributeName(attributeName);
234
235 Object value = attributeValueReader.getValue();
236 return processor.process(dictionaryValidationResult, value, constraint, attributeValueReader).getFirstConstraintValidationResult();
237 }
238 }