package org.hamcrest.io; import org.hamcrest.Description; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeDiagnosingMatcher; import java.io.File; import java.io.IOException; import static org.hamcrest.core.IsEqual.equalTo; public final class FileMatchers { public static Matcher<File> anExistingDirectory() { return fileChecker(IS_DIRECTORY, "an existing directory", "is not a directory"); } public static Matcher<File> anExistingFileOrDirectory() { return fileChecker(EXISTS, "an existing file or directory", "does not exist"); } public static Matcher<File> anExistingFile() { return fileChecker(IS_FILE, "an existing File", "is not a file"); } public static Matcher<File> aReadableFile() { return fileChecker(CAN_READ, "a readable File", "cannot be read"); } public static Matcher<File> aWritableFile() { return fileChecker(CAN_WRITE, "a writable File", "cannot be written to"); } public static Matcher<File> aFileWithSize(long size) { return aFileWithSize(equalTo(size)); } public static Matcher<File> aFileWithSize(final Matcher<Long> expected) { return new FeatureMatcher<File, Long>(expected, "A file with size", "size") { @Override protected Long featureValueOf(File actual) { return actual.length(); } }; } public static Matcher<File> aFileNamed(final Matcher<String> expected) { return new FeatureMatcher<File, String>(expected, "A file with name", "name") { @Override protected String featureValueOf(File actual) { return actual.getName(); } }; } public static Matcher<File> aFileWithCanonicalPath(final Matcher<String> expected) { return new FeatureMatcher<File, String>(expected, "A file with canonical path", "path") { @Override protected String featureValueOf(File actual) { try { return actual.getCanonicalPath(); } catch (IOException e) { return "Exception: " + e.getMessage(); } } }; } public static Matcher<File> aFileWithAbsolutePath(final Matcher<String> expected) { return new FeatureMatcher<File, String>(expected, "A file with absolute path", "path") { @Override protected String featureValueOf(File actual) { return actual.getAbsolutePath(); } }; } public static interface FileStatus { boolean check(File actual); } public static final FileStatus CAN_WRITE = new FileStatus() { @Override public boolean check(File actual) { return actual.canWrite(); } }; public static final FileStatus CAN_READ = new FileStatus() { @Override public boolean check(File actual) { return actual.canRead(); } }; public static final FileStatus IS_FILE = new FileStatus() { @Override public boolean check(File actual) { return actual.isFile(); } }; public static final FileStatus IS_DIRECTORY = new FileStatus() { @Override public boolean check(File actual) { return actual.isDirectory(); } }; public static final FileStatus EXISTS = new FileStatus() { @Override public boolean check(File actual) { return actual.exists(); } }; private static Matcher<File> fileChecker(final FileStatus fileStatus, final String successDescription, final String failureDescription) { return new TypeSafeDiagnosingMatcher<File>() { public boolean matchesSafely(File actual, Description mismatchDescription) { final boolean result = fileStatus.check(actual); if (!result) { mismatchDescription.appendText(failureDescription); } return result; } public void describeTo(Description description) { description.appendText(successDescription); } }; } }