package com.beijunyi.parallelgit.utils;
import java.io.IOException;
import java.util.Iterator;
import java.util.NoSuchElementException;
import com.beijunyi.parallelgit.AbstractParallelGitTest;
import com.beijunyi.parallelgit.utils.exceptions.NoSuchCacheDirectoryException;
import com.beijunyi.parallelgit.utils.exceptions.NoSuchCacheEntryException;
import com.beijunyi.parallelgit.utils.io.CacheNode;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class CacheUtilsIterateDirectoryTest extends AbstractParallelGitTest {
@Before
public void setUp() throws IOException {
initRepository();
}
@Test
public void testHasNextWhenThereAreRemainingNodes_shouldReturnTrue() throws IOException {
writeMultipleToCache
(
"/file1.txt",
"/file2.txt",
"/file3.txt"
);
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
iterator.next();
assertTrue(iterator.hasNext());
}
@Test
public void testHasNextWhenThereIsNoRemainingNode_shouldReturnFalse() throws IOException {
writeMultipleToCache
(
"/file1.txt",
"/file2.txt",
"/file3.txt"
);
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
iterator.next();
iterator.next();
iterator.next();
assertFalse(iterator.hasNext());
}
@Test(expected = NoSuchElementException.class)
public void getHasNextWhenThereIsNoRemainingNode_shouldThrowNoSuchElementException() throws IOException {
writeMultipleToCache
(
"/file1.txt",
"/file2.txt",
"/file3.txt"
);
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
iterator.next();
iterator.next();
iterator.next();
iterator.next();
}
@Test
public void iterateDirectory_shouldReturnTheDirectChildrenNodesInAlphabeticalOrder() throws IOException {
writeMultipleToCache
(
"/a/aa/aaa/aaaa.txt",
"/a/aa/aab.txt",
"/a/aa/aac.txt",
"/a/ab.txt",
"/a/ac.txt",
"/a/ad/ada.txt",
"/b/ba.txt"
);
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/a", cache);
assertEquals("/a/aa", iterator.next().getPath());
assertEquals("/a/ab.txt", iterator.next().getPath());
assertEquals("/a/ac.txt", iterator.next().getPath());
assertEquals("/a/ad", iterator.next().getPath());
assertFalse(iterator.hasNext());
}
@Test
public void iterateDirectoryRecursively_shouldReturnAllChildrenNodesInAlphabeticalOrder() throws IOException {
writeMultipleToCache
(
"/a/aa/aaa/aaaa.txt",
"/a/aa/aab.txt",
"/a/aa/aac.txt",
"/a/ab.txt",
"/a/ac.txt",
"/a/ad/ada.txt",
"/b/ba.txt"
);
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/a", true, cache);
assertEquals("/a/aa/aaa/aaaa.txt", iterator.next().getPath());
assertEquals("/a/aa/aab.txt", iterator.next().getPath());
assertEquals("/a/aa/aac.txt", iterator.next().getPath());
assertEquals("/a/ab.txt", iterator.next().getPath());
assertEquals("/a/ac.txt", iterator.next().getPath());
assertEquals("/a/ad/ada.txt", iterator.next().getPath());
assertFalse(iterator.hasNext());
}
@Test
public void testIsFileWhenCacheNodeIsFile_shouldReturnTrue() throws IOException {
writeToCache("/file.txt");
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
assertTrue(iterator.next().isFile());
}
@Test
public void testIsFileWhenCacheNodeIsDirectory_shouldReturnTrue() throws IOException {
writeToCache("/dir/file.txt");
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
assertFalse(iterator.next().isFile());
}
@Test
public void testIsDirectoryWhenCacheNodeIsFile_shouldReturnFalse() throws IOException {
writeToCache("/file.txt");
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
assertFalse(iterator.next().isDirectory());
}
@Test
public void testIsDirectoryWhenCacheNodeIsDirectory_shouldReturnTrue() throws IOException {
writeToCache("/dir/file.txt");
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
assertTrue(iterator.next().isDirectory());
}
@Test
public void getEntryWhenCacheNodeIsFile_shouldReturnTheFileEntry() throws IOException {
writeToCache("/file.txt");
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
assertEquals("file.txt", iterator.next().getEntry().getPathString());
}
@Test(expected = NoSuchCacheEntryException.class)
public void getEntryWhenCacheNodeIsDirectory_shouldThrowNoSuchCacheEntryException() throws IOException {
writeToCache("/dir/file.txt");
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
iterator.next().getEntry();
}
@Test(expected = NoSuchCacheDirectoryException.class)
public void iterateDirectoryWhenDirectoryDoesNotExist_shouldThrowNoSuchCacheDirectoryException() throws IOException {
CacheUtils.iterateDirectory("/a", cache);
}
@Test(expected = UnsupportedOperationException.class)
public void removeNode_shouldThrowUnsupportedOperationException() throws IOException {
writeMultipleToCache
(
"/file1.txt",
"/file2.txt",
"/file3.txt"
);
Iterator<CacheNode> iterator = CacheUtils.iterateDirectory("/", cache);
iterator.remove();
}
}