001 /* 002 * Created on Dec 23, 2007 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with 005 * 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 is distributed on 010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the 011 * specific language governing permissions and limitations under the License. 012 * 013 * Copyright @2007-2009 the original author or authors. 014 */ 015 package org.fest.assertions; 016 017 import static org.fest.assertions.Formatting.inBrackets; 018 import static org.fest.util.Arrays.isEmpty; 019 import static org.fest.util.Strings.concat; 020 import static org.fest.util.Systems.LINE_SEPARATOR; 021 022 import java.io.File; 023 import java.io.IOException; 024 025 import org.fest.assertions.FileContentComparator.LineDiff; 026 027 /** 028 * Understands assertion methods for <code>File</code>. To create a new instance of this class use the method <code> 029 * {@link Assertions#assertThat(File)}</code>. 030 * 031 * @author David DIDIER 032 * @author Yvonne Wang 033 * @author Alex Ruiz 034 */ 035 public class FileAssert extends GenericAssert<File> { 036 037 private final FileContentComparator comparator; 038 039 /** 040 * Creates a new <code>FileAssert</code>. 041 * @param actual the target to verify. 042 */ 043 protected FileAssert(File actual) { 044 this(actual, new FileContentComparator()); 045 } 046 047 /* for testing only */ 048 FileAssert(File actual, FileContentComparator comparator) { 049 super(actual); 050 this.comparator = comparator; 051 } 052 053 /** {@inheritDoc} */ 054 public FileAssert as(String description) { 055 description(description); 056 return this; 057 } 058 059 /** {@inheritDoc} */ 060 public FileAssert describedAs(String description) { 061 return as(description); 062 } 063 064 /** {@inheritDoc} */ 065 public FileAssert as(Description description) { 066 description(description); 067 return this; 068 } 069 070 /** {@inheritDoc} */ 071 public FileAssert describedAs(Description description) { 072 return as(description); 073 } 074 075 /** 076 * Verifies that the actual <code>File</code> does not exist. 077 * @return this assertion object. 078 * @throws AssertionError if the the actual <code>File</code> is <code>null</code>. 079 * @throws AssertionError if the actual <code>File</code> exists. 080 */ 081 public FileAssert doesNotExist() { 082 isNotNull(); 083 if (!actual.exists()) return this; 084 failIfCustomMessageIsSet(); 085 throw failure(concat("file:", inBrackets(actual), " should not exist")); 086 } 087 088 /** 089 * Verifies that the actual <code>File</code> does exist. 090 * @return this assertion object. 091 * @throws AssertionError if the the actual <code>File</code> is <code>null</code>. 092 * @throws AssertionError if the actual <code>File</code> does not exist. 093 */ 094 public FileAssert exists() { 095 isNotNull(); 096 assertExists(actual); 097 return this; 098 } 099 100 /** 101 * Verifies that the size of the actual <code>File</code> is equal to the given one. 102 * @param expected the expected size of the actual <code>File</code>. 103 * @return this assertion object. 104 * @throws AssertionError if the the actual <code>File</code> is <code>null</code>. 105 * @throws AssertionError if the size of the actual <code>File</code> is not equal to the given one. 106 */ 107 public FileAssert hasSize(long expected) { 108 isNotNull(); 109 long size = actual.length(); 110 if (size == expected) return this; 111 failIfCustomMessageIsSet(); 112 throw failure(concat( 113 "size of file:", inBrackets(actual), " expected:", inBrackets(expected), " but was:", inBrackets(size))); 114 } 115 116 /** 117 * Verifies that the actual <code>File</code> is a directory. 118 * @return this assertion object. 119 * @throws AssertionError if the the actual <code>File</code> is <code>null</code>. 120 * @throws AssertionError if the actual <code>File</code> is not a directory. 121 */ 122 public FileAssert isDirectory() { 123 isNotNull(); 124 if (actual.isDirectory()) return this; 125 failIfCustomMessageIsSet(); 126 throw failure(concat("file:", inBrackets(actual), " should be a directory")); 127 } 128 129 /** 130 * Verifies that the actual <code>File</code> is equal to the given one. To verify that the actual <code>File</code> 131 * has the same content as another <code>File</code>, use <code>{@link #hasSameContentAs(File)}</code>. 132 * @param expected the given <code>File</code> to compare the actual <code>File</code> to. 133 * @return this assertion object. 134 * @throws AssertionError if the actual <code>File</code> is not equal to the given one. 135 */ 136 public FileAssert isEqualTo(File expected) { 137 assertEqualTo(expected); 138 return this; 139 } 140 141 /** 142 * Verifies that the actual <code>File</code> is a regular file. 143 * @return this assertion object. 144 * @throws AssertionError if the the actual <code>File</code> is <code>null</code>. 145 * @throws AssertionError if the actual <code>File</code> is not a regular file. 146 */ 147 public FileAssert isFile() { 148 isNotNull(); 149 if (actual.isFile()) return this; 150 failIfCustomMessageIsSet(); 151 throw failure(concat("file:", inBrackets(actual), " should be a file")); 152 } 153 154 /** 155 * Verifies that the actual <code>File</code> is not equal to the given one. 156 * @param other the given <code>File</code> to compare the actual <code>File</code> to. 157 * @return this assertion object. 158 * @throws AssertionError if the actual <code>File</code> is equal to the given one. 159 */ 160 public FileAssert isNotEqualTo(File other) { 161 assertNotEqualTo(other); 162 return this; 163 } 164 165 /** 166 * Verifies that the actual <code>File</code> is not <code>null</code>. 167 * @return this assertion object. 168 * @throws AssertionError if the actual <code>File</code> is <code>null</code>. 169 */ 170 public FileAssert isNotNull() { 171 assertNotNull(); 172 return this; 173 } 174 175 /** 176 * Verifies that the actual <code>File</code> is not the same as the given one. 177 * @param other the given <code>File</code> to compare the actual <code>File</code> to. 178 * @return this assertion object. 179 * @throws AssertionError if the actual <code>File</code> is the same as the given one. 180 */ 181 public FileAssert isNotSameAs(File other) { 182 assertNotSameAs(other); 183 return this; 184 } 185 186 /** 187 * Verifies that the actual <code>File</code> is the same as the given one. 188 * @param expected the given <code>File</code> to compare the actual <code>File</code> to. 189 * @return this assertion object. 190 * @throws AssertionError if the actual <code>File</code> is not the same as the given one. 191 */ 192 public FileAssert isSameAs(File expected) { 193 assertSameAs(expected); 194 return this; 195 } 196 197 /** 198 * Verifies that the actual <code>File</code> satisfies the given condition. 199 * @param condition the given condition. 200 * @return this assertion object. 201 * @throws NullPointerException if the given condition is <code>null</code>. 202 * @throws AssertionError if the actual <code>File</code> does not satisfy the given condition. 203 * @see #is(Condition) 204 */ 205 public FileAssert satisfies(Condition<File> condition) { 206 assertSatisfies(condition); 207 return this; 208 } 209 210 /** 211 * Verifies that the actual <code>File</code> does not satisfy the given condition. 212 * @param condition the given condition. 213 * @return this assertion object. 214 * @throws AssertionError if the actual <code>File</code> satisfies the given condition. 215 * @throws NullPointerException if the given condition is <code>null</code>. 216 * @see #isNot(Condition) 217 */ 218 public FileAssert doesNotSatisfy(Condition<File> condition) { 219 assertDoesNotSatisfy(condition); 220 return this; 221 } 222 223 224 /** 225 * Verifies that the actual <code>File</code> satisfies the given condition. 226 * @param condition the given condition. 227 * @return this assertion object. 228 * @throws NullPointerException if the given condition is <code>null</code>. 229 * @throws AssertionError if the actual <code>File</code> does not satisfy the given condition. 230 */ 231 public FileAssert is(Condition<File> condition) { 232 assertIs(condition); 233 return this; 234 } 235 236 /** 237 * Verifies that the actual <code>File</code> does not satisfy the given condition. 238 * @param condition the given condition. 239 * @return this assertion object. 240 * @throws AssertionError if the actual <code>File</code> satisfies the given condition. 241 * @throws NullPointerException if the given condition is <code>null</code>. 242 */ 243 public FileAssert isNot(Condition<File> condition) { 244 assertIsNot(condition); 245 return this; 246 } 247 248 /** 249 * Verifies that the content of the actual <code>File</code> is equal to the content of the given one. Adapted from 250 * <a href="http://junit-addons.sourceforge.net/junitx/framework/FileAssert.html" target="_blank">FileAssert</a> (from 251 * <a href="http://sourceforge.net/projects/junit-addons">JUnit-addons</a>.) 252 * @param expected the given <code>File</code> to compare the actual <code>File</code> to. 253 * @return this assertion object. 254 * @throws NullPointerException if the file to compare to is <code>null</code>. 255 * @throws AssertionError if the the actual <code>File</code> is <code>null</code>. 256 * @throws AssertionError if the content of the actual <code>File</code> is not equal to the content of the given one. 257 */ 258 public FileAssert hasSameContentAs(File expected) { 259 if (expected == null) 260 throw new NullPointerException(formattedErrorMessage("File to compare to should not be null")); 261 isNotNull(); 262 assertExists(actual).assertExists(expected); 263 try { 264 LineDiff[] diffs = comparator.compareContents(actual, expected); 265 if (!isEmpty(diffs)) fail(expected, diffs); 266 } catch (IOException e) { 267 cannotCompareToExpectedFile(expected, e); 268 } 269 return this; 270 } 271 272 private void fail(File expected, LineDiff[] diffs) { 273 failIfCustomMessageIsSet(); 274 StringBuilder b = new StringBuilder(); 275 b.append("file:").append(inBrackets(actual)).append(" and file:").append(inBrackets(expected)) 276 .append(" do not have same contents:"); 277 for (LineDiff diff : diffs) { 278 b.append(LINE_SEPARATOR).append("line:").append(inBrackets(diff.lineNumber)) 279 .append(", expected:").append(inBrackets(diff.expected)).append(" but was:").append(inBrackets(diff.actual)); 280 } 281 fail(b.toString()); 282 } 283 284 private void cannotCompareToExpectedFile(File expected, Exception e) { 285 failIfCustomMessageIsSet(e); 286 String message = concat( 287 "unable to compare contents of files:", inBrackets(actual), " and ", inBrackets(expected)); 288 fail(message, e); 289 } 290 291 private FileAssert assertExists(File file) { 292 if (file.exists()) return this; 293 failIfCustomMessageIsSet(); 294 throw failure(concat("file:", inBrackets(file), " should exist")); 295 } 296 297 /** 298 * Verifies that the actual <code>File</code> is a relative path. 299 * @return this assertion object. 300 * @throws AssertionError if the actual <code>File</code> is not a relative path. 301 */ 302 public FileAssert isRelative() { 303 isNotNull(); 304 if (!actual.isAbsolute()) return this; 305 failIfCustomMessageIsSet(); 306 throw failure(concat("file:", inBrackets(actual), " should be a relative path")); 307 } 308 309 /** 310 * Verifies that the actual <code>File</code> is an absolute path. 311 * @return this assertion object. 312 * @throws AssertionError if the actual <code>File</code> is not an absolute path. 313 */ 314 public FileAssert isAbsolute() { 315 isNotNull(); 316 if (actual.isAbsolute()) return this; 317 failIfCustomMessageIsSet(); 318 throw failure(concat("file:", inBrackets(actual), " should be an absolute path")); 319 } 320 321 /** {@inheritDoc} */ 322 public FileAssert overridingErrorMessage(String message) { 323 replaceDefaultErrorMessagesWith(message); 324 return this; 325 } 326 }