All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fitbur.assertj.api.AbstractPathAssert Maven / Gradle / Ivy

There is a newer version: 1.0.0
Show newest version
/**
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 *
 * Copyright 2012-2016 the original author or authors.
 */
package com.fitbur.assertj.api;

import static java.lang.String.format;
import static com.fitbur.assertj.util.Preconditions.checkNotNull;

import java.nio.charset.Charset;
import java.nio.file.ClosedFileSystemException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.ProviderMismatchException;
import java.nio.file.spi.FileSystemProvider;

import com.fitbur.assertj.api.exception.PathsException;
import com.fitbur.assertj.api.exception.RuntimeIOException;
import com.fitbur.assertj.internal.Paths;
import com.fitbur.assertj.util.VisibleForTesting;

/**
 * Assertions for {@link Path} objects
 *
 * 

* Note that some assertions have two versions: a normal one and a "raw" one (for instance, {@code hasParent()} and * {@code hasParentRaw()}. The difference is that normal assertions will {@link Path#toRealPath(LinkOption...) * canonicalize} or {@link Path#normalize() normalize} the tested path and, where applicable, the path argument, before * performing the actual test. Canonicalization includes normalization. *

* *

* Canonicalization may lead to an I/O error if a path does not exist, in which case the given assertions will fail with * a {@link PathsException}. Also note that {@link Files#isSymbolicLink(Path) symbolic links} will be followed if the * filesystem supports them. Finally, if a path is not {@link Path#isAbsolute() absolute}, canonicalization will * resolve the path against the process' current working directory. *

* *

* These assertions are filesystem independent. You may use them on {@code Path} instances issued from the default * filesystem (ie, instances you get when using {@link java.nio.file.Paths#get(String, String...)}) or from other * filesystems. For more information, see the {@link FileSystem javadoc for {@code FileSystem} . *

* *

* Furthermore: *

* *
    *
  • Unless otherwise noted, assertions which accept arguments will not accept {@code null} arguments; if a null * argument is passed, these assertions will throw a {@link NullPointerException}.
  • *
  • It is the caller's responsibility to ensure that paths used in assertions are issued from valid filesystems which * are not {@link FileSystem#close() closed}. If a filesystems is closed, assertions will throw a * {@link ClosedFileSystemException}.
  • *
  • Some assertions take another {@link Path} as an argument. If this path is not issued from the same * {@link FileSystemProvider provider} as the tested path, assertions will throw a {@link ProviderMismatchException}.
  • *
  • Some assertions may need to perform I/O on the path's underlying filesystem; if an I/O error occurs when * accessing the filesystem, these assertions will throw a {@link PathsException}.
  • *
* * @param self type * * @see Path * @see java.nio.file.Paths#get(String, String...) * @see FileSystem * @see FileSystem#getPath(String, String...) * @see FileSystems#getDefault() * @see Files */ public abstract class AbstractPathAssert> extends AbstractComparableAssert { @VisibleForTesting protected Paths paths = Paths.instance(); @VisibleForTesting Charset charset = Charset.defaultCharset(); protected AbstractPathAssert(final Path actual, final Class selfType) { super(actual, selfType); } /** * Verifies that the content of the actual {@code Path} is the same as the given one (both paths must be a readable * files). * The charset to use when reading the actual path can be provided with {@link #usingCharset(Charset)} or * {@link #usingCharset(String)} prior to calling this method; if not, the platform's default charset (as returned by * {@link Charset#defaultCharset()}) will be used. * * Examples: *
 // use the default charset
   * Path xFile = Files.write(Paths.get("xfile.txt"), "The Truth Is Out There".getBytes());
   * Path xFileUTF8 = Files.write(Paths.get("xfile-clone.txt"), "The Truth Is Out There".getBytes("UTF-8"));
   * Path xFileClone = Files.write(Paths.get("xfile-clone.txt"), "The Truth Is Out There".getBytes());
   * Path xFileFrench = Files.write(Paths.get("xfile-french.txt"), "La Vérité Est Ailleurs".getBytes());
   * 
   * // The following assertion succeeds (default charset is used):
   * assertThat(xFile).hasSameContentAs(xFileClone);
   * // The following assertion succeeds (UTF-8 charset is used to read xFile):
   * assertThat(xFileUTF8).usingCharset("UTF-8").hasContent(xFileClone);
   * 
   * // The following assertion fails:
   * assertThat(xFile).hasSameContentAs(xFileFrench);
* * @param expected the given {@code Path} to compare the actual {@code Path} to. * @return {@code this} assertion object. * @throws NullPointerException if the given {@code Path} is {@code null}. * @throws AssertionError if the actual or given {@code Path} is not an existing readable file. * @throws AssertionError if the actual {@code Path} is {@code null}. * @throws AssertionError if the content of the actual {@code Path} is not equal to the content of the given one. * @throws PathsException if an I/O error occurs. */ public S hasSameContentAs(Path expected) { paths.assertHasSameContentAs(info, actual, charset, expected, Charset.defaultCharset()); return myself; } /** * Verifies that the content of the actual {@code Path} is the same as the expected one, the expected {@code Path} being read with the given charset while * the charset used to read the actual path can be provided with {@link #usingCharset(Charset)} or * {@link #usingCharset(String)} prior to calling this method; if not, the platform's default charset (as returned by * {@link Charset#defaultCharset()}) will be used. * * Examples: *
 Path fileUTF8Charset = Files.write(Paths.get("actual"), Collections.singleton("Gerçek"), StandardCharsets.UTF_8);
   * Charset turkishCharset = Charset.forName("windows-1254");
   * Path fileTurkischCharset = Files.write(Paths.get("expected"), Collections.singleton("Gerçek"), turkishCharset);
   * 
   * // The following assertion succeeds:
   * assertThat(fileUTF8Charset).usingCharset(StandardCharsets.UTF_8).hasSameContentAs(fileTurkischCharset, turkishCharset);
   * 
   * // The following assertion fails:
   * assertThat(fileUTF8Charset).usingCharset(StandardCharsets.UTF_8).hasSameContentAs(fileTurkischCharset, StandardCharsets.UTF_8);
* * @param expected the given {@code Path} to compare the actual {@code Path} to. * @param expectedCharset the {@Charset} used to read the content of the expected Path. * @return {@code this} assertion object. * @throws NullPointerException if the given {@code Path} is {@code null}. * @throws AssertionError if the actual or given {@code Path} is not an existing readable file. * @throws AssertionError if the actual {@code Path} is {@code null}. * @throws AssertionError if the content of the actual {@code Path} is not equal to the content of the given one. * @throws PathsException if an I/O error occurs. */ public S hasSameContentAs(Path expected, Charset expectedCharset) { paths.assertHasSameContentAs(info, actual, charset, expected, expectedCharset); return myself; } /** * Verifies that the binary content of the actual {@code Path} is exactly equal to the given one. * * Examples: *
 // using the default charset, the following assertion succeeds:
   * Path xFile = Files.write(Paths.get("xfile.txt"), "The Truth Is Out There".getBytes());
   * assertThat(xFile).hasBinaryContent("The Truth Is Out There".getBytes());
   *
   * // using a specific charset 
   * Charset turkishCharset = Charset.forName("windows-1254");
   * Path xFileTurkish = Files.write(Paths.get("xfile.turk"), Collections.singleton("Gerçek Başka bir yerde mi"), turkishCharset);
   * 
   * // The following assertion succeeds:
   * String expectedContent = "Gerçek Başka bir yerde mi" + com.fitbur.assertj.util.Compatibility.System.lineSeparator();
   * byte[] binaryContent = expectedContent.getBytes(turkishCharset.name());
   * assertThat(xFileTurkish).hasBinaryContent(binaryContent);
   * 
   * // The following assertion fails ... unless you are in Turkey ;-):
   * assertThat(xFileTurkish).hasBinaryContent("Gerçek Başka bir yerde mi".getBytes());
* * @param expected the expected binary content to compare the actual {@code File}'s content to. * @return {@code this} assertion object. * @throws NullPointerException if the given content is {@code null}. * @throws AssertionError if the actual {@code File} is {@code null}. * @throws AssertionError if the actual {@code File} is not an existing file. * @throws RuntimeIOException if an I/O error occurs. * @throws AssertionError if the content of the actual {@code File} is not equal to the given binary content. */ public S hasBinaryContent(byte[] expected) { paths.assertHasBinaryContent(info, actual, expected); return myself; } /** * Specifies the name of the charset to use for text-based assertions on the path's contents (path must be a readable * file). * * Examples: *
 Charset turkishCharset = Charset.forName("windows-1254");
   * Path xFileTurkish = Files.write(Paths.get("xfile.turk"), Collections.singleton("Gerçek Başka bir yerde mi"), turkishCharset);
   * 
   * // The following assertion succeeds:
   * assertThat(xFileTurkish).usingCharset("windows-1254").hasContent("Gerçek Başka bir yerde mi");
* * @param charsetName the name of the charset to use. * @return {@code this} assertion object. * @throws IllegalArgumentException if the given encoding is not supported on this platform. */ public S usingCharset(String charsetName) { if (!Charset.isSupported(charsetName)) throw new IllegalArgumentException(format("Charset:<'%s'> is not supported on this system", charsetName)); return usingCharset(Charset.forName(charsetName)); } /** * Specifies the charset to use for text-based assertions on the path's contents (path must be a readable file). * * Examples: *
 Charset turkishCharset = Charset.forName("windows-1254");
   * Path xFileTurkish = Files.write(Paths.get("xfile.turk"), Collections.singleton("Gerçek Başka bir yerde mi"), turkishCharset);
   * 
   * // The following assertion succeeds:
   * assertThat(xFileTurkish).usingCharset(turkishCharset).hasContent("Gerçek Başka bir yerde mi");
* * @param charset the charset to use. * @return {@code this} assertion object. * @throws NullPointerException if the given charset is {@code null}. */ public S usingCharset(Charset charset) { this.charset = checkNotNull(charset, "The charset should not be null"); return myself; } /** * Verifies that the text content of the actual {@code Path} (which must be a readable file) is exactly equal * to the given one.
* The charset to use when reading the actual path should be provided with {@link #usingCharset(Charset)} or * {@link #usingCharset(String)} prior to calling this method; if not, the platform's default charset (as returned by * {@link Charset#defaultCharset()}) will be used. * * Examples: *
 // use the default charset
   * Path xFile = Files.write(Paths.get("xfile.txt"), "The Truth Is Out There".getBytes());
   * 
   * // The following assertion succeeds (default charset is used):
   * assertThat(xFile).hasContent("The Truth Is Out There");
   * 
   * // The following assertion fails:
   * assertThat(xFile).hasContent("La Vérité Est Ailleurs");
   * 
   * // using a specific charset 
   * Charset turkishCharset = Charset.forName("windows-1254");
   * 
   * Path xFileTurkish = Files.write(Paths.get("xfile.turk"), Collections.singleton("Gerçek Başka bir yerde mi"), turkishCharset);
   * 
   * // The following assertion succeeds:
   * assertThat(xFileTurkish).usingCharset(turkishCharset).hasContent("Gerçek Başka bir yerde mi");
   * 
   * // The following assertion fails ... unless you are in Turkey ;-):
   * assertThat(xFileTurkish).hasContent("Gerçek Başka bir yerde mi");
* * @param expected the expected text content to compare the actual {@code File}'s content to. * @return {@code this} assertion object. * @throws NullPointerException if the given content is {@code null}. * @throws RuntimeIOException if an I/O error occurs. * @throws AssertionError if the actual {@code Path} is {@code null}. * @throws AssertionError if the actual {@code Path} is not a {@link Files#isReadable(Path) readable} file. * @throws AssertionError if the content of the actual {@code File} is not equal to the given content. */ public S hasContent(String expected) { paths.assertHasContent(info, actual, expected, charset); return myself; } /** * Assert that the tested {@link Path} is a readable file, it checks that the file exists (according to * {@link Files#exists(Path, LinkOption...)}) and that it is readable(according to {@link Files#isReadable(Path)}). * * Examples: *
 // Create a file and set permissions to be readable by all.
   * Path readableFile = Paths.get("readableFile");
   * Set<PosixFilePermission> perms = PosixFilePermissions.fromString("r--r--r--");
   * Files.createFile(readableFile, PosixFilePermissions.asFileAttribute(perms));
   * 
   * final Path symlinkToReadableFile = FileSystems.getDefault().getPath("symlinkToReadableFile");
   * Files.createSymbolicLink(symlinkToReadableFile, readableFile);
   * 
   * // Create a file and set permissions not to be readable.
   * Path nonReadableFile = Paths.get("nonReadableFile");
   * Set<PosixFilePermission> notReadablePerms = PosixFilePermissions.fromString("-wx------");
   * Files.createFile(nonReadableFile, PosixFilePermissions.asFileAttribute(notReadablePerms));
   * 
   * final Path nonExistentPath = FileSystems.getDefault().getPath("nonexistent");
   *
   * // The following assertions succeed:
   * assertThat(readableFile).isReadable();
   * assertThat(symlinkToReadableFile).isReadable();
   *
   * // The following assertions fail:
   * assertThat(nonReadableFile).isReadable();
   * assertThat(nonExistentPath).isReadable();
* * @return self * * @see Files#isReadable(Path) */ public S isReadable() { paths.assertIsReadable(info, actual); return myself; } /** * Assert that the tested {@link Path} is a writable file, it checks that the file exists (according to * {@link Files#exists(Path, LinkOption...)}) and that it is writable(according to {@link Files#isWritable(Path)}). * * Examples: *
 Create a file and set permissions to be writable by all.
   * Path writableFile = Paths.get("writableFile");
   * Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-rw-rw-");
   * Files.createFile(writableFile, PosixFilePermissions.asFileAttribute(perms));
   * 
   * final Path symlinkToWritableFile = FileSystems.getDefault().getPath("symlinkToWritableFile");
   * Files.createSymbolicLink(symlinkToWritableFile, writableFile);
   * 
   * // Create a file and set permissions not to be writable.
   * Path nonWritableFile = Paths.get("nonWritableFile");
   * perms = PosixFilePermissions.fromString("r--r--r--");
   * Files.createFile(nonWritableFile, PosixFilePermissions.asFileAttribute(perms));
   * 
   * final Path nonExistentPath = FileSystems.getDefault().getPath("nonexistent");
   *
   * // The following assertions succeed:
   * assertThat(writableFile).isWritable();
   * assertThat(symlinkToWritableFile).isWritable();
   *
   * // The following assertions fail:
   * assertThat(nonWritableFile).isWritable();
   * assertThat(nonExistentPath).isWritable();
* * @return self * * @see Files#isWritable(Path) */ public S isWritable() { paths.assertIsWritable(info, actual); return myself; } /** * Assert that the tested {@link Path} is an executable file, it checks that the file exists (according to * {@link Files#exists(Path, LinkOption...)}) and that it is executable(according to {@link Files#isExecutable(Path)} * ). * * Examples: *
 // Create a file and set permissions to be executable by all.
   * Path executableFile = Paths.get("executableFile");
   * Set<PosixFilePermission> perms = PosixFilePermissions.fromString("r-xr-xr-x");
   * Files.createFile(executableFile, PosixFilePermissions.asFileAttribute(perms));
   * 
   * final Path symlinkToExecutableFile = FileSystems.getDefault().getPath("symlinkToExecutableFile");
   * Files.createSymbolicLink(symlinkToExecutableFile, executableFile);
   * 
   * // Create a file and set permissions not to be executable.
   * Path nonExecutableFile = Paths.get("nonExecutableFile");
   * perms = PosixFilePermissions.fromString("rw-------");
   * Files.createFile(nonExecutableFile, PosixFilePermissions.asFileAttribute(perms));
   * 
   * final Path nonExistentPath = FileSystems.getDefault().getPath("nonexistent");
   *
   * // The following assertions succeed:
   * assertThat(executableFile).isExecutable();
   * assertThat(symlinkToExecutableFile).isExecutable();
   *
   * // The following assertions fail:
   * assertThat(nonExecutableFile).isExecutable();
   * assertThat(nonExistentPath).isExecutable();
* * @return self * * @see Files#isExecutable(Path) */ public S isExecutable() { paths.assertIsExecutable(info, actual); return myself; } /** * Assert that the tested {@link Path} exists according to {@link Files#exists(Path, LinkOption...) * Files#exists(Path)}) * *

* Note that this assertion will follow symbolic links before asserting the path's existence. *

* *

* On Windows system, this has no influence. On Unix systems, this means the assertion result will fail if the path is * a symbolic link whose target does not exist. If you want to assert the existence of the symbolic link itself, use * {@link #existsNoFollowLinks()} instead. *

* * Examples: *
 // fs is a Unix filesystem
   * // Create a regular file, and a symbolic link pointing to it
   * final Path existingFile = fs.getPath("somefile");
   * Files.createFile(existingFile);
   * final Path symlinkToExistingFile = fs.getPath("symlinkToExistingFile");
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   *
   * // Create a symbolic link whose target does not exist
   * final Path nonExistentPath = fs.getPath("nonexistent");
   * final Path symlinkToNonExistentPath = fs.getPath("symlinkToNonExistentPath");
   * Files.createSymbolicLink(symlinkToNonExistentPath, nonExistentPath);
   *
   * // The following assertions succeed:
   * assertThat(existingFile).exists();
   * assertThat(symlinkToExistingFile).exists();
   *
   * // The following assertions fail:
   * assertThat(nonExistentPath).exists();
   * assertThat(symlinkToNonExistentPath).exists();
* * @return self * * @see Files#exists(Path, LinkOption...) */ public S exists() { paths.assertExists(info, actual); return myself; } /** * Assert that the tested {@link Path} exists, not following symbolic links, by calling * {@link Files#exists(Path, LinkOption...) Files#exists(Path, LinkOption.NOFOLLOW_LINKS)}). * *

* This assertion behaves like {@link #exists()}, with the difference that it can be used to assert the existence of a * symbolic link even if its target is invalid. *

* * Examples: *
 // fs is a Unix filesystem
   * // Create a regular file, and a symbolic link pointing to it
   * final Path existingFile = fs.getPath("somefile");
   * Files.createFile(existingFile);
   * final Path symlinkToExistingFile = fs.getPath("symlink");
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   * 
   * // Create a symbolic link whose target does not exist
   * final Path nonExistentPath = fs.getPath("nonexistent");
   * final Path symlinkToNonExistentPath = fs.getPath("symlinkToNonExistentPath");
   * Files.createSymbolicLink(symlinkToNonExistentPath, nonExistentPath);
   *
   * // The following assertions succeed
   * assertThat(existingFile).existsNoFollowLinks();
   * assertThat(symlinkToExistingFile).existsNoFollowLinks();
   * assertThat(symlinkToNonExistentPath).existsNoFollowLinks();
   *
   * // The following assertion fails
   * assertThat(nonExistentPath).existsNoFollowLinks();
* * @return self * * @see Files#exists(Path, LinkOption...) */ public S existsNoFollowLinks() { paths.assertExistsNoFollowLinks(info, actual); return myself; } /** * Assert that the tested {@link Path} does not exist. * *

* IMPORTANT NOTE: this method will NOT follow symbolic links (provided that the underlying * {@link FileSystem} of this path supports symbolic links at all). *

* *

* This means that even if the link exists this assertion will fail even if the link's target does not exists - note * that this is unlike the default behavior of {@link #exists()}. *

* *

* If you are a Windows user, the above does not apply to you; if you are a Unix user however, this is important. * Consider the following: *

 // fs is a FileSystem
   * // Create a regular file, and a symbolic link pointing to it
   * final Path existingFile = fs.getPath("somefile");
   * Files.createFile(existingFile);
   * final Path symlinkToExistingFile = fs.getPath("symlink");
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   * 
   * // Create a symbolic link to a nonexistent target file.
   * final Path nonExistentPath = fs.getPath("nonExistentPath");
   * final Path symlinkToNonExistentPath = fs.getPath("symlinkToNonExistentPath");
   * Files.createSymbolicLink(symlinkToNonExistentPath, nonExistentPath);
   *
   * // The following assertion succeeds
   * assertThat(nonExistentPath).doesNotExist();
   * 
   * // The following assertions fail:
   * assertThat(existingFile).doesNotExist();
   * assertThat(symlinkToExistingFile).doesNotExist();
   * // fail because symlinkToNonExistentPath exists even though its target does not.
   * assertThat(symlinkToNonExistentPath).doesNotExist();
* * @return self * * @see Files#notExists(Path, LinkOption...) * @see LinkOption#NOFOLLOW_LINKS */ public S doesNotExist() { paths.assertDoesNotExist(info, actual); return myself; } /** * Assert that the tested {@link Path} is a regular file. * *

* Note that this method will follow symbolic links. If you are a Unix user and wish to assert that a * path is a symbolic link instead, use {@link #isSymbolicLink()}. *

* *

* This assertion first asserts the existence of the path (using {@link #exists()}) then checks whether the path is a * regular file. *

* * Examples: *
 // fs is a Unix filesystem
   *
   * // Create a regular file, and a symbolic link to that regular file
   * final Path existingFile = fs.getPath("existingFile");
   * final Path symlinkToExistingFile = fs.getPath("symlinkToExistingFile");
   * Files.createFile(existingFile);
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   *
   * // Create a directory, and a symbolic link to that directory
   * final Path dir = fs.getPath("dir");
   * final Path dirSymlink = fs.getPath("dirSymlink");
   * Files.createDirectories(dir);
   * Files.createSymbolicLink(dirSymlink, dir);
   *
   * // Create a nonexistent entry, and a symbolic link to that entry
   * final Path nonExistentPath = fs.getPath("nonexistent");
   * final Path symlinkToNonExistentPath = fs.getPath("symlinkToNonExistentPath");
   * Files.createSymbolicLink(symlinkToNonExistentPath, nonExistentPath);
   *
   * // the following assertions succeed:
   * assertThat(existingFile).isRegularFile();
   * assertThat(symlinkToExistingFile).isRegularFile();
   *
   * // the following assertions fail because paths do not exist:
   * assertThat(nonExistentPath).isRegularFile();
   * assertThat(symlinkToNonExistentPath).isRegularFile();
   *
   * // the following assertions fail because paths exist but are not regular files:
   * assertThat(dir).isRegularFile();
   * assertThat(dirSymlink).isRegularFile();
* * @return self */ public S isRegularFile() { paths.assertIsRegularFile(info, actual); return myself; } /** * Assert that the tested {@link Path} is a directory. *

* Note that this method will follow symbolic links. If you are a Unix user and wish to assert that a * path is a symbolic link instead, use {@link #isSymbolicLink()}. *

* *

* This assertion first asserts the existence of the path (using {@link #exists()}) then checks whether the path is a * directory. *

* * Examples: *
 // fs is a Unix filesystem
   *
   * // Create a regular file, and a symbolic link to that regular file
   * final Path existingFile = fs.getPath("existingFile");
   * final Path symlinkToExistingFile = fs.getPath("symlinkToExistingFile");
   * Files.createFile(existingFile);
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   *
   * // Create a directory, and a symbolic link to that directory
   * final Path dir = fs.getPath("dir");
   * final Path dirSymlink = fs.getPath("dirSymlink");
   * Files.createDirectories(dir);
   * Files.createSymbolicLink(dirSymlink, dir);
   *
   * // Create a nonexistent entry, and a symbolic link to that entry
   * final Path nonExistentPath = fs.getPath("nonexistent");
   * final Path symlinkToNonExistentPath = fs.getPath("symlinkToNonExistentPath");
   * Files.createSymbolicLink(symlinkToNonExistentPath, nonExistentPath);
   *
   * // the following assertions succeed:
   * assertThat(dir).isDirectory();
   * assertThat(dirSymlink).isDirectory();
   *
   * // the following assertions fail because paths do not exist:
   * assertThat(nonExistentPath).isDirectory();
   * assertThat(symlinkToNonExistentPath).isDirectory();
   *
   * // the following assertions fail because paths exist but are not directories:
   * assertThat(existingFile).isDirectory();
   * assertThat(symlinkToExistingFile).isDirectory();
* * @return self */ public S isDirectory() { paths.assertIsDirectory(info, actual); return myself; } /** * Assert that the tested {@link Path} is a symbolic link. *

* This assertion first asserts the existence of the path (using {@link #existsNoFollowLinks()}) then checks whether * the path is a symbolic link. *

* * Examples: *
 // fs is a Unix filesystem
   *
   * // Create a regular file, and a symbolic link to that regular file
   * final Path existingFile = fs.getPath("existingFile");
   * final Path symlinkToExistingFile = fs.getPath("symlinkToExistingFile");
   * Files.createFile(existingFile);
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   *
   * // Create a directory, and a symbolic link to that directory
   * final Path dir = fs.getPath("dir");
   * final Path dirSymlink = fs.getPath("dirSymlink");
   * Files.createDirectories(dir);
   * Files.createSymbolicLink(dirSymlink, dir);
   *
   * // Create a nonexistent entry, and a symbolic link to that entry
   * final Path nonExistentPath = fs.getPath("nonexistent");
   * final Path symlinkToNonExistentPath = fs.getPath("symlinkToNonExistentPath");
   * Files.createSymbolicLink(symlinkToNonExistentPath, nonExistentPath);
   *
   * // the following assertions succeed:
   * assertThat(dirSymlink).isSymbolicLink();
   * assertThat(symlinkToExistingFile).isSymbolicLink();
   * assertThat(symlinkToNonExistentPath).isSymbolicLink();
   *
   * // the following assertion fails because the path does not exist:
   * assertThat(nonExistentPath).isSymbolicLink();
   *
   * // the following assertions fail because paths exist but are not symbolic links
   * assertThat(existingFile).isSymbolicLink();
   * assertThat(dir).isSymbolicLink();
* * @return self */ public S isSymbolicLink() { paths.assertIsSymbolicLink(info, actual); return myself; } /** * Assert that the tested {@link Path} is absolute (the path does not have to exist). * *

* Note that the fact that a path is absolute does not mean that it is {@link Path#normalize() normalized}: * {@code /foo/..} is absolute, for instance, but it is not normalized. *

* * Examples: *
 // unixFs is a Unix FileSystem
   *
   * // The following assertion succeeds:
   * assertThat(unixFs.getPath("/foo/bar")).isAbsolute();
   *
   * // The following assertion fails:
   * assertThat(unixFs.getPath("foo/bar")).isAbsolute();
   *
   * // windowsFs is a Windows FileSystem
   *
   * // The following assertion succeeds:
   * assertThat(windowsFs.getPath("c:\\foo")).isAbsolute();
   *
   * // The following assertions fail:
   * assertThat(windowsFs.getPath("foo\\bar")).isAbsolute();
   * assertThat(windowsFs.getPath("c:foo")).isAbsolute();
   * assertThat(windowsFs.getPath("\\foo\\bar")).isAbsolute();
* * @return self * * @see Path#isAbsolute() */ public S isAbsolute() { paths.assertIsAbsolute(info, actual); return myself; } /** * Assert that the tested {@link Path} is relative (opposite to {@link Path#isAbsolute()}). * * Examples: *
 // unixFs is a Unix FileSystem
   *
   * // The following assertions succeed:
   * assertThat(unixFs.getPath("./foo/bar")).isRelative();
   * assertThat(unixFs.getPath("foo/bar")).isRelative();
   *
   * // The following assertion fails:
   * assertThat(unixFs.getPath("/foo/bar")).isRelative();
   *
   * // windowsFs is a Windows FileSystem
   *
   * // The following assertion succeeds:
   * assertThat(windowsFs.getPath("foo\\bar")).isRelative();
   * assertThat(windowsFs.getPath("c:foo")).isRelative();
   * assertThat(windowsFs.getPath("\\foo\\bar")).isRelative();
   *
   * // The following assertions fail:
   * assertThat(windowsFs.getPath("c:\\foo")).isRelative();
* * @return self * * @see Path#isAbsolute() */ public S isRelative() { paths.assertIsRelative(info, actual); return myself; } /** * Assert that the tested {@link Path} is normalized. * *

* A path is normalized if it has no redundant components; typically, on both Unix and Windows, this means that the * path has no "self" components ({@code .}) and that its only parent components ({@code ..}), if any, are at the * beginning of the path. *

* * Examples: *
 // fs is a Unix filesystem
   *
   * // the following assertions succeed:
   * assertThat(fs.getPath("/usr/lib")).isNormalized();
   * assertThat(fs.getPath("a/b/c")).isNormalized();
   * assertThat(fs.getPath("../d")).isNormalized();
   *
   * // the following assertions fail:
   * assertThat(fs.getPath("/a/./b")).isNormalized();
   * assertThat(fs.getPath("c/b/..")).isNormalized();
   * assertThat(fs.getPath("/../../e")).isNormalized();
* * @return self */ public S isNormalized() { paths.assertIsNormalized(info, actual); return myself; } /** * Assert that the tested {@link Path} is canonical by comparing it to its {@link Path#toRealPath(LinkOption...) real * path}. * *

* For Windows users, this assertion is no different than {@link #isAbsolute()} expect that the file must exist. For * Unix users, this assertion ensures that the tested path is the actual file system resource, that is, it is not a * {@link Files#isSymbolicLink(Path) symbolic link} to the actual resource, even if the path is absolute. *

* * Examples: *
 // fs is a Unix filesystem
   * // Create a directory
   * final Path basedir = fs.getPath("/tmp/foo");
   * Files.createDirectories(basedir);
   * 
   * // Create a file in this directory
   * final Path existingFile = basedir.resolve("existingFile");
   * Files.createFile(existingFile);
   * 
   * // Create a symbolic link to that file
   * final Path symlinkToExistingFile = basedir.resolve("symlinkToExistingFile");
   * Files.createSymbolicLink(symlinkToExistingFile, existingFile);
   *
   * // The following assertion succeeds:
   * assertThat(existingFile).isCanonical();
   *
   * // The following assertion fails:
   * assertThat(symlinkToExistingFile).isCanonical();
* * @throws PathsException an I/O error occurred while evaluating the path * * @see Path#toRealPath(LinkOption...) * @see Files#isSameFile(Path, Path) */ public S isCanonical() { paths.assertIsCanonical(info, actual); return myself; } /** * Assert that the tested {@link Path} last element String representation is equal to the given filename. * *

* Note that the path does not need to exist to check its file name. *

* * Examples: *
 // fs is a Unix filesystem
   * final Path file = fs.getPath("/foo/foo.txt");
   * final Path symlink = fs.getPath("/home/symlink-to-foo");
   * Files.createSymbolicLink(symlink, file);
   *
   * // the following assertions succeed:
   * assertThat(fs.getPath("/dir1/file.txt")).hasFileName("file.txt");
   * assertThat(fs.getPath("/dir1/dir2")).hasFileName("dir2");
   * // you can check file name on non existent paths
   * assertThat(file).hasFileName("foo.txt");
   * assertThat(symlink).hasFileName("symlink-to-foo");
   *
   * // the following assertions fail:
   * assertThat(fs.getPath("/dir1/file.txt").hasFileName("other.txt");
   * // fail because, last element is "." 
   * assertThat(fs.getPath("/dir1/.")).hasFileName("dir1");
   * // fail because a link filename is not the same as its target filename
   * assertThat(symlink).hasFileName("file.txt");
* * @param fileName the expected filename * @return self * * @throws NullPointerException if the given fileName is null. * @see Path#getFileName() */ public S hasFileName(final String fileName) { paths.assertHasFileName(info, actual, fileName); return myself; } /** * Assert that the tested {@link Path} has the expected parent path. * *

* This assertion will perform canonicalization of the tested path and of the given argument before performing the test; see the class * description for more details. If this is not what you want, use {@link #hasParentRaw(Path)} instead. *

* *

* Checks that the tested path has the given parent. This assertion will fail both if the tested path has no parent, * or has a different parent than what is expected. *

* * Examples: *
 // fs is a Unix filesystem
   * final Path actual = fs.getPath("/dir1/dir2/file");
   *
   * // the following assertion succeeds:
   * assertThat(actual).hasParent(fs.getPath("/dir1/dir2/."));
   * // this one too as this path will be normalized to "/dir1/dir2":
   * assertThat(actual).hasParent(fs.getPath("/dir1/dir3/../dir2/."));
   *
   * // the following assertion fails:
   * assertThat(actual).hasParent(fs.getPath("/dir1"));
* * @param expected the expected parent path * @return self * * @throws NullPointerException if the given parent path is null. * @throws PathsException failed to canonicalize the tested path or the path given as an argument * * @see Path#getParent() */ public S hasParent(final Path expected) { paths.assertHasParent(info, actual, expected); return myself; } /** * Assert that the tested {@link Path} has the expected parent path. * *

* This assertion will not perform any canonicalization of either the tested path or the path given as an argument; * see class description for more details. If this is not what you want, use {@link #hasParent(Path)} instead. *

* *

* This assertion uses {@link Path#getParent()} with no modification, which means the only criterion for this * assertion's success is the path's components (its root and its name elements). *

* *

* This may lead to surprising results if the tested path and the path given as an argument are not normalized. For * instance, if the tested path is {@code /home/foo/../bar} and the argument is {@code /home}, the assertion will * fail since the parent of the tested path is not {@code /home} but... {@code /home/foo/..}. *

* *

* While this may seem counterintuitive, it has to be recalled here that it is not required for a {@link FileSystem} * to consider that {@code .} and {@code ..} are name elements for respectively the current directory and the parent * directory respectively. In fact, it is not even required that a {@link FileSystem} be hierarchical at all. *

* * Examples: *
 // fs is a Unix filesystem
   * final Path actual = fs.getPath("/dir1/dir2/file");
   *
   * // the following assertion succeeds:
   * assertThat(actual).hasParentRaw(fs.getPath("/dir1/dir2"));
   *
   * // the following assertions fails:
   * assertThat(actual).hasParent(fs.getPath("/dir1"));
   * // ... and this one too as expected path is not canonicalized.
   * assertThat(actual).hasParentRaw(fs.getPath("/dir1/dir3/../dir2"));
* * @param expected the expected parent path * @return self * * @throws NullPointerException if the given parent path is null. * * @see Path#getParent() */ public S hasParentRaw(final Path expected) { paths.assertHasParentRaw(info, actual, expected); return myself; } /** * Assert that the tested {@link Path} has no parent. * *

* This assertion will first canonicalize the tested path before performing the test; if this is not what you want, use {@link #hasNoParentRaw()} instead. *

* *

* Check that the tested path, after canonicalization, has no parent. See the class description for more information * about canonicalization. *

* * Examples: *
 // fs is a Unix filesystem
   *
   * // the following assertion succeeds:
   * assertThat(fs.getPath("/")).hasNoParent();
   * // this one too as path will be normalized to "/"
   * assertThat(fs.getPath("/usr/..")).hasNoParent();
   *
   * // the following assertions fail:
   * assertThat(fs.getPath("/usr/lib")).hasNoParent();
   * assertThat(fs.getPath("/usr")).hasNoParent();
* * @return self * * @throws PathsException failed to canonicalize the tested path * * @see Path#getParent() */ public S hasNoParent() { paths.assertHasNoParent(info, actual); return myself; } /** * Assert that the tested {@link Path} has no parent. * *

* This assertion will not canonicalize the tested path before performing the test; * if this is not what you want, use {@link #hasNoParent()} instead. *

* *

* As canonicalization is not performed, this means the only criterion for this assertion's success is the path's * components (its root and its name elements). *

* *

* This may lead to surprising results. For instance, path {@code /usr/..} does have a parent, and this * parent is {@code /usr}. *

* * Examples: *
 // fs is a Unix filesystem
   *
   * // the following assertions succeed:
   * assertThat(fs.getPath("/")).hasNoParentRaw();
   * assertThat(fs.getPath("foo")).hasNoParentRaw();
   *
   * // the following assertions fail:
   * assertThat(fs.getPath("/usr/lib")).hasNoParentRaw();
   * assertThat(fs.getPath("/usr")).hasNoParentRaw();
   * // this one fails as canonicalization is not performed, leading to parent being /usr
   * assertThat(fs.getPath("/usr/..")).hasNoParent();
* * @return self * * @see Path#getParent() */ public S hasNoParentRaw() { paths.assertHasNoParentRaw(info, actual); return myself; } /** * Assert that the tested {@link Path} starts with the given path. * *

* This assertion will perform canonicalization of both the tested path and the path given as an argument; * see class description for more details. If this is not what you want, use {@link #startsWithRaw(Path)} instead. *

* *

* Checks that the given {@link Path} starts with another path. Note that the name components matter, not the string * representation; this means that, for example, {@code /home/foobar/baz} does not start with * {@code /home/foo}. *

* * Examples: *
 // fs is a Unix filesystem
   * final Path tested = fs.getPath("/home/joe/myfile");
   *
   * // the following assertion succeeds:
   * assertThat(tested).startsWith(fs.getPath("/home"));
   * assertThat(tested).startsWith(fs.getPath("/home/"));
   * assertThat(tested).startsWith(fs.getPath("/home/."));
   * // assertion succeeds because this path will be canonicalized to "/home/joe"
   * assertThat(tested).startsWith(fs.getPath("/home/jane/../joe/."));
   *
   * // the following assertion fails:
   * assertThat(tested).startsWith(fs.getPath("/home/harry"));
* * @param other the other path * @return self * * @throws NullPointerException if the given path is null. * @throws PathsException failed to canonicalize the tested path or the path given as an argument * * @see Path#startsWith(Path) * @see Path#toRealPath(LinkOption...) */ public S startsWith(final Path other) { paths.assertStartsWith(info, actual, other); return myself; } /** * Assert that the tested {@link Path} starts with the given path. * *

* This assertions does not perform canonicalization on either the * tested path or the path given as an argument; see class description for * more details. If this is not what you want, use {@link #startsWith(Path)} * instead. *

* *

* Checks that the given {@link Path} starts with another path, without performing canonicalization on its arguments. * This means that the only criterion to determine whether a path starts with another is the tested path's, and the * argument's, name elements. *

* *

* This may lead to some surprising results: for instance, path {@code /../home/foo} does not start with * {@code /home} since the first name element of the former ({@code ..}) is different from the first name element of * the latter ({@code home}). *

* * Examples: *
 // fs is a Unix filesystem
   * final Path tested = fs.getPath("/home/joe/myfile");
   *
   * // the following assertion succeeds:
   * assertThat(tested).startsWithRaw(fs.getPath("/home/joe"));
   *
   * // the following assertion fails:
   * assertThat(tested).startsWithRaw(fs.getPath("/home/harry"));
   * // .... and this one too as given path is not canonicalized
   * assertThat(tested).startsWithRaw(fs.getPath("/home/joe/.."));
* * @param other the other path * @return self * * @throws NullPointerException if the given path is null. * * @see Path#startsWith(Path) */ public S startsWithRaw(final Path other) { paths.assertStartsWithRaw(info, actual, other); return myself; } /** * Assert that the tested {@link Path} ends with the given path. * *

* This assertion will attempt to canonicalize the tested path and normalize the path given as an argument before * performing the actual test. *

* *

* Note that the criterion to determine success is determined by the path's name elements; therefore, * {@code /home/foobar/baz} does not end with {@code bar/baz}. *

* * Examples: *
 // fs is a Unix filesystem.
   * // the current directory is supposed to be /home.
   * final Path tested = fs.getPath("/home/joe/myfile");
   * // as tested will be canonicalized, it could have been written: /home/jane/../joe/myfile
   *
   * // the following assertion succeeds:
   * assertThat(tested).endsWith(fs.getPath("joe/myfile"));
   *
   * // the following assertions fail:
   * assertThat(tested).endsWith(fs.getPath("joe/otherfile"));
   * // this path will be normalized to joe/otherfile
   * assertThat(tested).endsWith(fs.getPath("joe/myfile/../otherfile"));
* * @param other the other path * @return self * * @throws NullPointerException if the given path is null. * @throws PathsException failed to canonicalize the tested path (see class * description) * * @see Path#endsWith(Path) * @see Path#toRealPath(LinkOption...) */ public S endsWith(final Path other) { paths.assertEndsWith(info, actual, other); return myself; } /** * Assert that the tested {@link Path} ends with the given path. * *

* This assertion will not perform any canonicalization (on the * tested path) or normalization (on the path given as an argument); see the * class description for more details. If this is not what you want, use * {@link #endsWith(Path)} instead. *

* *

* This may lead to some surprising results; for instance, path {@code /home/foo} does not end with * {@code foo/.} since the last name element of the former ({@code foo}) is different from the last name element of * the latter ({@code .}). *

* * Examples: *
 // fs is a Unix filesystem
   * // the current directory is supposed to be /home.
   * final Path tested = fs.getPath("/home/joe/myfile");
   *
   * // The following assertion succeeds:
   * assertThat(tested).endsWithRaw(fs.getPath("joe/myfile"));
   *
   * // But the following assertion fails:
   * assertThat(tested).endsWithRaw(fs.getPath("harry/myfile"));
   * // and this one too as the given path is not normalized
   * assertThat(tested).endsWithRaw(fs.getPath("harry/../joe/myfile"));
* * @param other the other path * @return self * * @throws NullPointerException if the given path is null. * * @see Path#endsWith(Path) */ public S endsWithRaw(final Path other) { paths.assertEndsWithRaw(info, actual, other); return myself; } }