001 /* 002 * Created on Dec 27, 2006 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 005 * in compliance with the License. You may obtain a copy of the License at 006 * 007 * http://www.apache.org/licenses/LICENSE-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, software distributed under the License 010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 011 * or implied. See the License for the specific language governing permissions and limitations under 012 * the License. 013 * 014 * Copyright @2006-2009 the original author or authors. 015 */ 016 package org.fest.assertions; 017 018 import static org.fest.assertions.ErrorMessages.unexpectedNullType; 019 import static org.fest.assertions.Formatting.inBrackets; 020 import static org.fest.util.Objects.namesOf; 021 import static org.fest.util.Strings.concat; 022 023 import java.util.Arrays; 024 025 /** 026 * Understands assertion methods for objects. To create a new instance of this class use the 027 * method <code>{@link Assertions#assertThat(Object)}</code>. 028 * 029 * @author Yvonne Wang 030 * @author Alex Ruiz 031 */ 032 public class ObjectAssert extends GenericAssert<Object> { 033 034 /** 035 * Creates a new </code>{@link ObjectAssert}</code>. 036 * @param actual the target to verify. 037 */ 038 protected ObjectAssert(Object actual) { 039 super(actual); 040 } 041 042 /** 043 * Verifies that the actual <code>Object</code> is an instance of the given type. 044 * @param type the type to check the actual <code>Object</code> against. 045 * @return this assertion object. 046 * @throws AssertionError if the actual <code>Object</code> is <code>null</code>. 047 * @throws AssertionError if the actual <code>Object</code> is not an instance of the given type. 048 * @throws NullPointerException if the given type is <code>null</code>. 049 */ 050 public ObjectAssert isInstanceOf(Class<?> type) { 051 isNotNull(); 052 validateNotNull(type); 053 Class<?> current = actual.getClass(); 054 if (type.isAssignableFrom(current)) return this; 055 failIfCustomMessageIsSet(); 056 throw failure(concat("expected instance of:", inBrackets(type), " but was instance of:", inBrackets(current))); 057 } 058 059 /** 060 * Verifies that the actual <code>Object</code> is an instance of any of the given types. 061 * @param types the types to check the actual <code>Object</code> against. 062 * @return this assertion object. 063 * @throws AssertionError if the actual <code>Object</code> is <code>null</code>. 064 * @throws AssertionError if the actual <code>Object</code> is not an instance of any of the given types. 065 * @throws NullPointerException if the given array of types is <code>null</code>. 066 * @throws NullPointerException if the given array of types contains <code>null</code>s. 067 */ 068 public ObjectAssert isInstanceOfAny(Class<?>...types) { 069 isNotNull(); 070 if (types == null) 071 throw new NullPointerException(formattedErrorMessage("The given array of types should not be null")); 072 if (!foundInstanceOfAny(types)) 073 fail(concat("expected instance of any:<", typeNames(types), "> but was instance of:", inBrackets(actual.getClass()))); 074 return this; 075 } 076 077 private boolean foundInstanceOfAny(Class<?>...types) { 078 Class<?> current = actual.getClass(); 079 for (Class<?> type : types) { 080 validateNotNull(type); 081 if (type.isAssignableFrom(current)) return true; 082 } 083 return false; 084 } 085 086 void validateNotNull(Class<?> type) { 087 if (type == null) 088 throw new NullPointerException(unexpectedNullType(rawDescription())); 089 } 090 091 private String typeNames(Class<?>... types) { 092 return Arrays.toString(namesOf(types)); 093 } 094 095 /** {@inheritDoc} */ 096 public ObjectAssert as(String description) { 097 description(description); 098 return this; 099 } 100 101 /** {@inheritDoc} */ 102 public ObjectAssert describedAs(String description) { 103 return as(description); 104 } 105 106 /** {@inheritDoc} */ 107 public ObjectAssert as(Description description) { 108 description(description); 109 return this; 110 } 111 112 /** {@inheritDoc} */ 113 public ObjectAssert describedAs(Description description) { 114 return as(description); 115 } 116 117 /** 118 * Verifies that the actual <code>Object</code> satisfies the given condition. 119 * @param condition the given condition. 120 * @return this assertion object. 121 * @throws NullPointerException if the given condition is <code>null</code>. 122 * @throws AssertionError if the actual <code>Object</code> does not satisfy the given condition. 123 * @see #is(Condition) 124 */ 125 public ObjectAssert satisfies(Condition<Object> condition) { 126 assertSatisfies(condition); 127 return this; 128 } 129 130 /** 131 * Verifies that the actual <code>Object</code> does not satisfy the given condition. 132 * @param condition the given condition. 133 * @return this assertion object. 134 * @throws NullPointerException if the given condition is <code>null</code>. 135 * @throws AssertionError if the actual <code>Object</code> satisfies the given condition. 136 * @see #isNot(Condition) 137 */ 138 public ObjectAssert doesNotSatisfy(Condition<Object> condition) { 139 assertDoesNotSatisfy(condition); 140 return this; 141 } 142 143 /** 144 * Alias for <code>{@link #satisfies(Condition)}</code>. 145 * @param condition the given condition. 146 * @return this assertion object. 147 * @throws NullPointerException if the given condition is <code>null</code>. 148 * @throws AssertionError if the actual <code>Object</code> does not satisfy the given condition. 149 * @since 1.2 150 */ 151 public ObjectAssert is(Condition<Object> condition) { 152 assertIs(condition); 153 return this; 154 } 155 156 /** 157 * Alias for <code>{@link #doesNotSatisfy(Condition)}</code>. 158 * @param condition the given condition. 159 * @return this assertion object. 160 * @throws NullPointerException if the given condition is <code>null</code>. 161 * @throws AssertionError if the actual <code>Object</code> satisfies the given condition. 162 * @since 1.2 163 */ 164 public ObjectAssert isNot(Condition<Object> condition) { 165 assertIsNot(condition); 166 return this; 167 } 168 169 /** 170 * Verifies that the actual <code>Object</code> is not <code>null</code>. 171 * @return this assertion object. 172 * @throws AssertionError if the actual <code>Object</code> is <code>null</code>. 173 */ 174 public ObjectAssert isNotNull() { 175 assertNotNull(); 176 return this; 177 } 178 179 /** 180 * Verifies that the actual <code>Object</code> is the same as the given one. 181 * @param expected the given <code>Object</code> to compare the actual <code>Object</code> to. 182 * @return this assertion object. 183 * @throws AssertionError if the actual <code>Object</code> is not the same as the given one. 184 */ 185 public ObjectAssert isSameAs(Object expected) { 186 assertSameAs(expected); 187 return this; 188 } 189 190 /** 191 * Verifies that the actual <code>Object</code> is not the same as the given one. 192 * @param other the given <code>Object</code> to compare the actual <code>Object</code> to. 193 * @return this assertion object. 194 * @throws AssertionError if the actual <code>Object</code> is the same as the given one. 195 */ 196 public ObjectAssert isNotSameAs(Object other) { 197 assertNotSameAs(other); 198 return this; 199 } 200 201 /** 202 * Verifies that the actual <code>Object</code> is equal to the given one. 203 * @param expected the given <code>Object</code> to compare the actual <code>Object</code> to. 204 * @return this assertion object. 205 * @throws AssertionError if the actual <code>Object</code> is not equal to the given one. 206 */ 207 public ObjectAssert isEqualTo(Object expected) { 208 assertEqualTo(expected); 209 return this; 210 } 211 212 /** 213 * Verifies that the actual <code>Object</code> is not equal to the given one. 214 * @param other the given <code>Object</code> to compare the actual <code>Object</code> to. 215 * @return this assertion object. 216 * @throws AssertionError if the actual <code>Object</code> is equal to the given one. 217 */ 218 public ObjectAssert isNotEqualTo(Object other) { 219 assertNotEqualTo(other); 220 return this; 221 } 222 223 /** {@inheritDoc} */ 224 public ObjectAssert overridingErrorMessage(String message) { 225 replaceDefaultErrorMessagesWith(message); 226 return this; 227 } 228 }