package net.exoego.queen.factory;
import java.io.File;
import java.io.IOException;
import net.exoego.function.helper.OnFile;
import net.exoego.queen.Seq;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import static net.exoego.queen.Sequence.from;
import static net.exoego.util.Make.array;
import static net.exoego.util.Make.list;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
public class FileTest {
private File singleFile;
private File emptyDir;
private File dir;
private File readOnlyFile;
@Before
public void setUp() throws IOException {
singleFile = File.createTempFile(uid(), ".txt");
}
@Before
public void createDirectory() throws IOException {
final TemporaryFolder tempDir = createDir();
final String[] dummyFiles = array("kafuka", "kaere", "kiri");
for (final String name : dummyFiles) {
tempDir.newFile(name);
}
dir = tempDir.getRoot();
assertThat(dir.listFiles().length, is(dummyFiles.length));
}
@Before
public void createEmptyDir() throws IOException {
emptyDir = createDir().getRoot();
assertThat(emptyDir.isDirectory(), is(true));
}
@Before
public void Rees() throws IOException {
readOnlyFile = File.createTempFile(uid(), ".txt");
readOnlyFile.setReadOnly();
assertThat(readOnlyFile.canWrite(), is(false));
}
@After
public void deleteFiles() throws IOException {
for (final File file : list(singleFile, emptyDir, dir, readOnlyFile)) {
if (file != null) {
file.delete();
}
}
}
private TemporaryFolder createDir() throws IOException {
final TemporaryFolder dir = new TemporaryFolder();
dir.create();
return dir;
}
private static String uid() {
return Long.toString(System.nanoTime());
}
private static Seq<File> files(final File f) {
return from(f).traverseDepthFirst(OnFile.listFiles()).filter(File::isFile);
}
private Seq<File> filesAndDirectories(final File f) {
return from(f).traverseDepthFirst(OnFile.listFiles());
}
private Seq<File> directories(final File f) {
return from(f).traverseDepthFirst(OnFile.listFiles()).filter(File::isDirectory);
}
@Test
public void Files() {
assertThat(files(singleFile).count(), is(1));
assertThat(files(emptyDir).count(), is(0));
assertThat(files(dir).count(), is(3));
}
@Test
public void FilesAndDirectories() {
assertThat(filesAndDirectories(singleFile).count(), is(1));
assertThat(filesAndDirectories(emptyDir).count(), is(1));
assertThat(filesAndDirectories(dir).count(), is(4));
}
@Test
public void Directories() {
assertThat(directories(singleFile).count(), is(0));
assertThat(directories(emptyDir).count(), is(1));
assertThat(directories(dir).count(), is(1));
}
@Test
public void FilePredicate() {
assertThat(filesAndDirectories(dir).filter(File::isFile).toSet(),
is(from(dir.listFiles(File::canRead)).toSet()));
assertThat(filesAndDirectories(dir).first(File::isDirectory).get(), is(dir));
}
}