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.util;
017    
018    import org.junit.Assert;
019    import org.junit.Test;
020    import org.kuali.rice.krad.util.BeanPropertyComparator.BeanComparisonException;
021    
022    import java.text.DateFormat;
023    import java.text.ParseException;
024    import java.text.SimpleDateFormat;
025    import java.util.ArrayList;
026    import java.util.Arrays;
027    import java.util.Date;
028    import java.util.List;
029    
030    /**
031     * BeanPropertyComparatorTest tests the BeanPropertyComparator methods
032     */
033    public class BeanPropertyComparatorTest {
034    
035        @Test
036        /**
037         * tests that an IllegalArgumentException is thrown when BeanPropertyComparator constructor is passed a null argument
038         */
039        public void testConstructor_nullList() {
040            boolean failedAsExpected = false;
041    
042            try {
043                new BeanPropertyComparator(null);
044            }
045            catch (IllegalArgumentException e) {
046                failedAsExpected = true;
047            }
048    
049            Assert.assertTrue(failedAsExpected);
050        }
051    
052        /**
053         * tests that an IllegalArgumentException is thrown when BeanPropertyComparator constructor is passed a empty list
054         */
055        @Test public void testConstructor_emptyList() {
056            boolean failedAsExpected = false;
057            try {
058                new BeanPropertyComparator(new ArrayList());
059            }
060            catch (IllegalArgumentException e) {
061                failedAsExpected = true;
062            }
063            Assert.assertTrue(failedAsExpected);
064        }
065    
066        @Test
067        /**
068         * tests comparison with an unknown property name
069         *
070         * <p>test that a <code>NullPointerException</code> is thrown when the list of property names contains a property name
071         * that does not exist in the first argument to  @{link  org.kuali.rice.krad.util.BeanPropertyComparator#compare(java.lang.Object, java.lang.Object)}</p>
072         */
073        public void testCompare_unknownPropertyNames() {
074            List unknownProperties = Arrays.asList(new String[] { "one", "two", "three" });
075    
076            BeanPropertyComparator bpc = new BeanPropertyComparator(unknownProperties);
077            A a = new A("something", new Integer(0), Boolean.valueOf(false));
078            B b = new B("something else", new Integer(1), Boolean.valueOf(true));
079    
080            boolean failedAsExpected = false;
081            try {
082                bpc.compare(a, b);
083            }
084            catch (BeanComparisonException e) {
085                if (e.getCause() instanceof NullPointerException) {
086                    failedAsExpected = true;
087                }
088            }
089            Assert.assertTrue(failedAsExpected);
090        }
091    
092        @Test
093        /**
094         * tests that a ClassCastException is thrown when comparing beans that each have a property with the same name but of different object type
095         */
096        public void testCompare_propertyTypeMismatch() {
097            List mismatchedProperties = Arrays.asList(new String[] { "i", "b" });
098    
099            BeanPropertyComparator bpc = new BeanPropertyComparator(mismatchedProperties);
100            A a = new A("something", new Integer(0), Boolean.valueOf(false));
101            C c = new C("something else", 1, true);
102    
103    
104            boolean failedAsExpected = false;
105            try {
106                bpc.compare(a, c);
107            }
108            catch (ClassCastException e) {
109                failedAsExpected = true;
110            }
111            Assert.assertTrue(failedAsExpected);
112        }
113    
114        @Test
115        /**
116         * tests comparison when a property has a getter with private scope
117         *
118         * <p>test that a NullPointerException exception is thrown when the first argument to
119         * @{link  org.kuali.rice.krad.util.BeanPropertyComparator#compare(java.lang.Object, java.lang.Object)}
120         * has a private scoped getter</p>
121         */
122        public void testCompare_privateProperty() {
123            List privateProperty = Arrays.asList(new String[] { "s" });
124    
125            BeanPropertyComparator bpc = new BeanPropertyComparator(privateProperty);
126            C c = new C("something else", 1, true);
127            A a = new A("something", new Integer(0), Boolean.valueOf(false));
128    
129    
130            boolean failedAsExpected = false;
131            try {
132                bpc.compare(c, a);
133            }
134            catch (BeanComparisonException e) {
135                if (e.getCause() instanceof NullPointerException) {
136                    failedAsExpected = true;
137                }
138            }
139            Assert.assertTrue(failedAsExpected);
140        }
141    
142    
143        @Test
144        /**
145         * test the comparison result when specifying a property of type String
146         */
147        public void testCompare_oneProperty_string() {
148            List properties = Arrays.asList(new String[] { "s" });
149    
150            BeanPropertyComparator bpc = new BeanPropertyComparator(properties);
151            A lesser = new A("One", new Integer(0), Boolean.valueOf(false));
152            B greater = new B("Two", new Integer(0), Boolean.valueOf(false));
153    
154            int lessThan = bpc.compare(lesser, greater);
155            Assert.assertTrue(lessThan < 0);
156    
157            int greaterThan = bpc.compare(greater, lesser);
158            Assert.assertTrue(greaterThan > 0);
159    
160            int equal = bpc.compare(greater, greater);
161            Assert.assertTrue(equal == 0);
162        }
163    
164        @Test
165        /**
166         * test the comparison result when specifying a property of type Integer
167         */
168        public void testCompare_oneProperty_integer() {
169            List properties = Arrays.asList(new String[] { "i" });
170    
171            BeanPropertyComparator bpc = new BeanPropertyComparator(properties);
172            A lesser = new A("One", new Integer(-1), Boolean.valueOf(false));
173            B greater = new B("One", new Integer(1), Boolean.valueOf(false));
174    
175            int lessThan = bpc.compare(lesser, greater);
176            Assert.assertTrue(lessThan < 0);
177    
178            int greaterThan = bpc.compare(greater, lesser);
179            Assert.assertTrue(greaterThan > 0);
180    
181            int equal = bpc.compare(greater, greater);
182            Assert.assertTrue(equal == 0);
183        }
184    
185        @Test
186        /**
187         * test the comparison result when specifying a property of type Boolean
188         */
189        public void testCompare_oneProperty_boolean() {
190            List properties = Arrays.asList(new String[] { "b" });
191    
192            BeanPropertyComparator bpc = new BeanPropertyComparator(properties);
193            A lesser = new A("One", new Integer(0), Boolean.valueOf(false));
194            B greater = new B("One", new Integer(0), Boolean.valueOf(true));
195    
196            int lessThan = bpc.compare(lesser, greater);
197            Assert.assertTrue(lessThan < 0);
198    
199            int greaterThan = bpc.compare(greater, lesser);
200            Assert.assertTrue(greaterThan > 0);
201    
202            int equal = bpc.compare(greater, greater);
203            Assert.assertTrue(equal == 0);
204        }
205    
206        @Test
207        /**
208         * tests comparison of multiple properties
209         *
210         * <p>using 3 properties, compare two beans that have a different value for the first property
211         * and the same values for the other two properties</p>
212         */
213        public void testCompare_oneLevel() {
214            List propertiesSIB = Arrays.asList(new String[] { "s", "i", "b" });
215    
216            BeanPropertyComparator bpcSIB = new BeanPropertyComparator(propertiesSIB);
217            A lesser = new A("One", new Integer(0), Boolean.valueOf(false));
218            B greater = new B("Two", new Integer(0), Boolean.valueOf(false));
219    
220            int lessThan = bpcSIB.compare(lesser, greater);
221            Assert.assertTrue(lessThan < 0);
222    
223            int greaterThan = bpcSIB.compare(greater, lesser);
224            Assert.assertTrue(greaterThan > 0);
225    
226            int equal = bpcSIB.compare(greater, greater);
227            Assert.assertTrue(equal == 0);
228        }
229    
230        @Test
231        /**
232         * tests comparison of multiple properties
233         *
234         * <p>using 3 properties, compare two beans that have a different value for the second property
235         * and the same values for the other two properties</p>
236         */
237        public void testCompare_twoLevels() {
238            List propertiesSIB = Arrays.asList(new String[] { "s", "i", "b" });
239    
240            BeanPropertyComparator bpc = new BeanPropertyComparator(propertiesSIB);
241            A lesser = new A("Same", new Integer(-1), Boolean.valueOf(false));
242            B greater = new B("Same", new Integer(1), Boolean.valueOf(false));
243    
244            int lessThan = bpc.compare(lesser, greater);
245            Assert.assertTrue(lessThan < 0);
246    
247            int greaterThan = bpc.compare(greater, lesser);
248            Assert.assertTrue(greaterThan > 0);
249    
250            int equal = bpc.compare(greater, greater);
251            Assert.assertTrue(equal == 0);
252        }
253    
254        @Test
255        /**
256         * tests comparison of multiple properties
257         *
258         * <p>using 3 properties, compare two beans that have a different value for the third property
259         * and the same values for the other two properties</p>
260         */
261        public void testCompare_threeLevels() {
262            List propertiesSIB = Arrays.asList(new String[] { "s", "i", "b" });
263    
264            BeanPropertyComparator bpc = new BeanPropertyComparator(propertiesSIB);
265            A lesser = new A("Same", new Integer(1), Boolean.valueOf(false));
266            B greater = new B("Same", new Integer(1), Boolean.valueOf(true));
267    
268            int lessThan = bpc.compare(lesser, greater);
269            Assert.assertTrue(lessThan < 0);
270    
271            int greaterThan = bpc.compare(greater, lesser);
272            Assert.assertTrue(greaterThan > 0);
273    
274            int equal = bpc.compare(greater, greater);
275            Assert.assertTrue(equal == 0);
276        }
277    
278        @Test
279        /**
280         * test that case is ignored during String comparisons when set to true the constructor
281         */
282        public void testCompare_differentCases() {
283            List propertiesSIB = Arrays.asList(new String[] { "s", "i", "b" });
284    
285            BeanPropertyComparator sensitive = new BeanPropertyComparator(propertiesSIB, false);
286            BeanPropertyComparator insensitive = new BeanPropertyComparator(propertiesSIB, true);
287    
288            A lesser = new A("SomeThing", new Integer(1), Boolean.valueOf(false));
289            B greater = new B("something", new Integer(1), Boolean.valueOf(false));
290    
291            int equal = insensitive.compare(greater, lesser);
292            Assert.assertTrue(equal == 0);
293    
294            int inequal = sensitive.compare(greater, lesser);
295            Assert.assertTrue(inequal != 0);
296        }
297        
298        @Test
299        /**
300         * test that the result of comparing two dates is as expected
301         */
302        public void testCompare_differentDates() throws ParseException {
303            List propertiesD = Arrays.asList(new String[] { "d" });
304            
305            DateFormat dateFormat = SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT);
306            
307            BeanPropertyComparator comparator = new BeanPropertyComparator(propertiesD);
308            
309            D lesser = new D(dateFormat.parse("01/01/1990"));
310            D greater = new D(dateFormat.parse("01/02/1990"));
311            
312            int result = comparator.compare(greater, lesser);
313            Assert.assertEquals(1, result);
314            
315            result = comparator.compare(lesser, greater);
316            Assert.assertEquals(-1, result);
317            
318            result = comparator.compare(lesser, lesser);
319            Assert.assertEquals(0, result);
320            
321            result = comparator.compare(greater, greater);
322            Assert.assertEquals(0, result);
323        }
324        
325        @Test
326        /**
327         * test the comparison of null objects
328         */
329        public void testCompare_firstNullDates() throws ParseException {
330            List propertiesD = Arrays.asList(new String[] { "d" });
331            
332            DateFormat dateFormat = SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT);
333            
334            BeanPropertyComparator comparator = new BeanPropertyComparator(propertiesD);
335            
336            D lesser = new D(null);
337            D greater = new D(dateFormat.parse("01/02/1990"));
338            
339            int result = comparator.compare(greater, lesser);
340            Assert.assertEquals(1, result);
341            
342            result = comparator.compare(lesser, greater);
343            Assert.assertEquals(-1, result);
344            
345            result = comparator.compare(lesser, lesser);
346            Assert.assertEquals(0, result);
347            
348            result = comparator.compare(greater, greater);
349            Assert.assertEquals(0, result);
350        }
351        
352        @Test
353        /**
354         * test the comparison of null objects
355         */
356        public void testCompare_secondNullDates() throws ParseException {
357            List propertiesD = Arrays.asList(new String[] { "d" });
358            
359            DateFormat dateFormat = SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT);
360            
361            BeanPropertyComparator comparator = new BeanPropertyComparator(propertiesD);
362            
363            D lesser = new D(dateFormat.parse("01/02/1990"));
364            D greater = new D(null);
365            
366            int result = comparator.compare(greater, lesser);
367            Assert.assertEquals(-1, result);
368            
369            result = comparator.compare(lesser, greater);
370            Assert.assertEquals(1, result);
371            
372            result = comparator.compare(lesser, lesser);
373            Assert.assertEquals(0, result);
374            
375            result = comparator.compare(greater, greater);
376            Assert.assertEquals(0, result);
377        }
378    
379        public static class A {
380            private String s;
381            private Integer i;
382            private Boolean b;
383    
384            public A(String s, Integer i, Boolean b) {
385                this.s = s;
386                this.i = i;
387                this.b = b;
388            }
389    
390            public String getS() {
391                return s;
392            }
393    
394            public Integer getI() {
395                return i;
396            }
397    
398            public Boolean getB() {
399                return b;
400            }
401        }
402    
403        public static class B {
404            private String s;
405            private Integer i;
406            private Boolean b;
407            private Long l;
408    
409            public B(String s, Integer i, Boolean b) {
410                this.s = s;
411                this.i = i;
412                this.b = b;
413                this.l = new Long(23);
414            }
415    
416            public String getS() {
417                return s;
418            }
419    
420            public Integer getI() {
421                return i;
422            }
423    
424            public Boolean getB() {
425                return b;
426            }
427    
428            public Long getL() {
429                return l;
430            }
431        }
432    
433        public static class C {
434            private boolean s;
435            private String i;
436            private float b;
437    
438            public C(String i, float b, boolean s) {
439                this.s = s;
440                this.i = i;
441                this.b = b;
442            }
443    
444            private boolean getS() {
445                return s;
446            }
447    
448            public String getI() {
449                return i;
450            }
451    
452            public float getB() {
453                return b;
454            }
455        }
456        
457        public static class D {
458            private Date d;
459            
460            public D(Date d) {
461                    this.d = d;
462            }
463            
464            public Date getD() {
465                    return d;
466            }
467        }
468    }