001    package org.springframework.richclient.exceptionhandling.delegation;
002    
003    import java.util.ArrayList;
004    import java.util.Arrays;
005    import java.util.Collections;
006    import java.util.List;
007    
008    import junit.framework.TestCase;
009    
010    /**
011     * @author Geoffrey De Smet
012     */
013    public class DefaultExceptionPurgerTests extends TestCase {
014    
015        // Chain A1->B1->C1->B2->D1
016        private DException d1 = new DException();
017        private BException b2 = new BException(d1);
018        private CException c1 = new CException(b2);
019        private BException b1 = new BException(c1);
020        private AException a1 = new AException(b1);
021    
022        /**
023         * {A} returns A1;
024         * {B} returns B1;
025         * {D} returns D1;
026         * {Z) returns A1;
027         * {C, Z} returns C1;
028         * {B, D} returns B1;
029         * {D, B} return B1;
030         */
031        public void testIncludedThrowableClassList() {
032            assertEquals(a1, checkIncluded(AException.class));
033            assertEquals(b1, checkIncluded(BException.class));
034            assertEquals(d1, checkIncluded(DException.class));
035            assertEquals(a1, checkIncluded(ZException.class));
036            assertEquals(c1, checkIncluded(CException.class, ZException.class));
037            assertEquals(b1, checkIncluded(BException.class, DException.class));
038            assertEquals(b1, checkIncluded(DException.class, BException.class));
039        }
040        
041        public Throwable checkIncluded(Class ... includedThrowableClasses) {
042            return new DefaultExceptionPurger(Arrays.asList(includedThrowableClasses), null).purge(a1);
043        }
044    
045        /**
046         * {A} returns B1;
047         * {B} returns D1;
048         * {D} returns D1;
049         * {Z) returns A1;
050         * {C, Z} returns B2;
051         * {C, D} returns D1;
052         * {D, C} return D1;
053         */
054        public void testExcludedThrowableClassList() {
055            assertEquals(b1, checkExcluded(AException.class));
056            assertEquals(d1, checkExcluded(BException.class));
057            assertEquals(d1, checkExcluded(DException.class));
058            assertEquals(a1, checkExcluded(ZException.class));
059            assertEquals(b2, checkExcluded(CException.class, ZException.class));
060            assertEquals(d1, checkExcluded(CException.class, DException.class));
061            assertEquals(d1, checkExcluded(DException.class, CException.class));
062        }
063        
064        public Throwable checkExcluded(Class ... excludedThrowableClasses) {
065            return new DefaultExceptionPurger(null, Arrays.asList(excludedThrowableClasses)).purge(a1);
066        }
067        
068        private class AException extends RuntimeException {
069            private AException(Throwable cause) {
070                super(cause);
071            }
072        }
073        private class BException extends RuntimeException {
074            private BException(Throwable cause) {
075                super(cause);
076            }
077        }
078        private class CException extends RuntimeException {
079            private CException(Throwable cause) {
080                super(cause);
081            }
082        }
083        private class DException extends RuntimeException {
084        }
085        private class ZException extends RuntimeException {
086        }
087        
088    }