001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.krad.util;
017
018import org.junit.Assert;
019import org.junit.Test;
020import org.kuali.rice.krad.util.BeanPropertyComparator.BeanComparisonException;
021
022import java.text.DateFormat;
023import java.text.ParseException;
024import java.text.SimpleDateFormat;
025import java.util.ArrayList;
026import java.util.Arrays;
027import java.util.Date;
028import java.util.List;
029
030/**
031 * BeanPropertyComparatorTest tests the BeanPropertyComparator methods
032 */
033public 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}