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 }