View Javadoc

1   /*
2    * The JUnit-addons Software License, Version 1.0
3    *     (based on the Apache Software License, Version 1.1)
4    *
5    * Copyright (c) 2002-2003 Vladimir R. Bossicard.  All rights reserved.
6    *
7    * Redistribution and use in source and binary forms, with or without
8    * modification, are permitted provided that the following conditions
9    * are met:
10   *
11   * 1. Redistributions of source code must retain the above copyright
12   *    notice, this list of conditions and the following disclaimer.
13   *
14   * 2. Redistributions in binary form must reproduce the above copyright
15   *    notice, this list of conditions and the following disclaimer in
16   *    the documentation and/or other materials provided with the
17   *    distribution.
18   *
19   * 3. The end-user documentation included with the redistribution, if
20   *    any, must include the following acknowlegement:
21   *       "This product includes software developed by Vladimir R.
22   *        Bossicard as well as other contributors
23   *        (http://junit-addons.sourceforge.net/)."
24   *    Alternately, this acknowlegement may appear in the software itself,
25   *    if and wherever such third-party acknowlegements normally appear.
26   *
27   * 4. The name "JUnit-addons" must not be used to endorse or promote
28   *    products derived from this software without prior written
29   *    permission. For written permission, please contact
30   *    vbossica@users.sourceforge.net.
31   *
32   * 5. Products derived from this software may not be called "JUnit-addons"
33   *    nor may "JUnit-addons" appear in their names without prior written
34   *    permission of the project managers.
35   *
36   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
40   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47   * SUCH DAMAGE.
48   * ======================================================================
49   *
50   * This software consists of voluntary contributions made by many
51   * individuals.  For more information on the JUnit-addons Project, please
52   * see <http://junit-addons.sourceforge.net/>.
53   */
54  
55  package junitx.framework;
56  
57  /**
58   * A set of assert methods specially targetted to asserting throwable objects.
59   *
60   * @version $Revision: 1.6 $ $Date: 2003/03/21 06:13:48 $
61   * @author <a href="mailto:vbossica@users.sourceforge.net">Vladimir R. Bossicard</a>
62   */
63  public class ThrowableAssert {
64  
65      /**
66       * Don't let anyone have access to this constructor.
67       */
68      private ThrowableAssert() {
69      }
70  
71      /**
72       * Asserts that two throwable objects are equal. Throws an
73       * <tt>AssertionFailedError</tt> if they are equal.<p>
74       *
75       * Two throwable objects are considered equals if:
76       * <ul>
77       * <li>their respective classes are the same</li>
78       * <li>their respective messages are equal</li>
79       * <li>their respective localized messages are equal</li>
80       * </ul>
81       */
82      public static void assertEquals(String message,
83                                      Throwable expected,
84                                      Throwable actual) {
85          ObjectAssert.assertInstanceOf(message, expected.getClass(), actual);
86          if (message == null) {
87              Assert.assertEquals("[message]", expected.getMessage(), actual.getMessage());
88              Assert.assertEquals("[localized message]", expected.getLocalizedMessage(), actual.getLocalizedMessage());
89          } else {
90              Assert.assertEquals(message + " [message]", expected.getMessage(), actual.getMessage());
91              Assert.assertEquals(message + " [localized message]", expected.getLocalizedMessage(), actual.getLocalizedMessage());
92          }
93      }
94  
95      /**
96       * Asserts that two throwable objects are equal. Throws an
97       * <tt>AssertionFailedError</tt> if they are equal.
98       *
99       * @see #assertEquals(String, Throwable, Throwable)
100      */
101     public static void assertEquals(Throwable expected,
102                                     Throwable actual) {
103         assertEquals(null, expected, actual);
104     }
105 
106     /**
107      * Assert that two throwable objects are similar. Throws an
108      * <tt>AssertionFailedError</tt> if they are equal.
109      *
110      * Two throwable objects are considered similar if:
111      * <ul>
112      * <li>their respective classes are the same</li>
113      * <li>the actual object's message or localized message contains the
114      * expected object's message</li>
115      * </ul>
116      */
117     public static void assertSimilar(String message,
118                                      Throwable expected,
119                                      Throwable actual) {
120         ObjectAssert.assertInstanceOf(message, expected.getClass(), actual);
121         if (expected.getMessage() == null) {
122             throw new IllegalArgumentException("String to search cannot be <null>");
123         }
124         if (actual.getMessage() != null) {
125             if (actual.getMessage().indexOf(expected.getMessage()) >= 0) {
126                 return;
127             }
128         }
129         if (actual.getLocalizedMessage() != null) {
130             if (actual.getLocalizedMessage().indexOf(expected.getMessage()) >= 0) {
131                 return;
132             }
133         }
134         failContainsMessage(message, expected, actual);
135     }
136 
137     /**
138      * Assert that two throwable objects are similar. Throws an
139      * <tt>AssertionFailedError</tt> if they are equal.
140      *
141      * @see #assertSimilar(String, Throwable, Throwable)
142      */
143     public static void assertSimilar(Throwable expected,
144                                      Throwable actual) {
145         assertSimilar(null, expected, actual);
146     }
147 
148     private static void failContainsMessage(String message,
149                                             Throwable expected,
150                                             Throwable actual) {
151         String formatted = "";
152         if (message != null) {
153             formatted = message + " ";
154         }
155         if (actual.getMessage().equals(actual.getLocalizedMessage())) {
156             Assert.fail(formatted + "Expected containing <" + expected.getMessage() + "> in <" + actual.getMessage() + ">");
157         } else {
158             Assert.fail(formatted + "Expected containing <" + expected.getMessage() + "> in <" + actual.getMessage() + "> or <" + actual.getLocalizedMessage() + "> (localized)");
159         }
160     }
161 
162 }