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 }