package com.googlecode.totallylazy.io;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
/* RFC 3986 URI Generic Syntax
5.2.4. Remove Dot Segments
The pseudocode also refers to a "remove_dot_segments" routine for
interpreting and removing the special "." and ".." complete path
segments from a referenced path. This is done after the path is
extracted from a reference, whether or not the path was relative, in
order to remove any invalid or extraneous dot-segments prior to
forming the target URI. Although there are many ways to accomplish
this removal process, we describe a simple method using two string
buffers.
1. The input buffer is initialized with the now-appended path
components and the output buffer is initialized to the empty
string.
2. While the input buffer is not empty, loop as follows:
A. If the input buffer begins with a prefix of "../" or "./",
then remove that prefix from the input buffer; otherwise,
B. if the input buffer begins with a prefix of "/./" or "/.",
where "." is a complete path segment, then replace that
prefix with "/" in the input buffer; otherwise,
C. if the input buffer begins with a prefix of "/../" or "/..",
where ".." is a complete path segment, then replace that
prefix with "/" in the input buffer and remove the last
segment and its preceding "/" (if any) from the output
buffer; otherwise,
D. if the input buffer consists only of "." or "..", then remove
that from the input buffer; otherwise,
E. move the first path segment in the input buffer to the end of
the output buffer, including the initial "/" character (if
any) and any subsequent characters up to, but not including,
the next "/" character or the end of the input buffer.
3. Finally, the output buffer is returned as the result of
remove_dot_segments.
*/
public class DotSegmentsTest {
@Test
public void removeDotSegments() throws Exception {
assertThat(DotSegments.remove("."), is(""));
assertThat(DotSegments.remove("./"), is("/"));
assertThat(DotSegments.remove("./foo"), is("/foo"));
assertThat(DotSegments.remove("./foo/"), is("/foo/"));
assertThat(DotSegments.remove("/./foo/"), is("/foo/"));
assertThat(DotSegments.remove("bar/./foo/"), is("bar/foo/"));
assertThat(DotSegments.remove(".."), is(""));
assertThat(DotSegments.remove("../"), is("/"));
assertThat(DotSegments.remove("../foo"), is("/foo"));
assertThat(DotSegments.remove("../foo/"), is("/foo/"));
assertThat(DotSegments.remove("/../foo"), is("/foo"));
assertThat(DotSegments.remove("bar/../foo/"), is("/foo/"));
assertThat(DotSegments.remove("baz/bar/../foo/"), is("baz/foo/"));
assertThat(DotSegments.remove(""), is(""));
assertThat(DotSegments.remove("/"), is("/"));
}
}