package org.jabref.logic.util.io;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import org.jabref.logic.layout.LayoutFormatterPreferences;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.util.FileHelper;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.Answers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
public class FileUtilTest {
private final Path nonExistingTestPath = Paths.get("nonExistingTestPath");
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
public TemporaryFolder otherTemporaryFolder = new TemporaryFolder();
private Path existingTestFile;
private Path otherExistingTestFile;
private LayoutFormatterPreferences layoutFormatterPreferences;
@Before
public void setUpViewModel() throws IOException {
existingTestFile = createTemporaryTestFile("existingTestFile.txt");
otherExistingTestFile = createTemporaryTestFile("otherExistingTestFile.txt");
otherTemporaryFolder.create();
layoutFormatterPreferences = mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS);
}
@Test
public void extensionBakAddedCorrectly() {
assertEquals(Paths.get("demo.bib.bak"),
FileUtil.addExtension(Paths.get("demo.bib"), ".bak"));
}
@Test
public void extensionBakAddedCorrectlyToAFileContainedInTmpDirectory() {
assertEquals(Paths.get("tmp", "demo.bib.bak"),
FileUtil.addExtension(Paths.get("tmp", "demo.bib"), ".bak"));
}
@Test
public void testGetLinkedFileNameDefault() {
// bibkey - title
String fileNamePattern = "\\bibtexkey\\begin{title} - \\format[RemoveBrackets]{\\title}\\end{title}";
BibEntry entry = new BibEntry();
entry.setCiteKey("1234");
entry.setField("title", "mytitle");
assertEquals("1234 - mytitle",
FileUtil.createFileNameFromPattern(null, entry, fileNamePattern, layoutFormatterPreferences));
}
@Test
public void testGetLinkedFileNameBibTeXKey() {
// bibkey
String fileNamePattern = "\\bibtexkey";
BibEntry entry = new BibEntry();
entry.setCiteKey("1234");
entry.setField("title", "mytitle");
assertEquals("1234",
FileUtil.createFileNameFromPattern(null, entry, fileNamePattern,
layoutFormatterPreferences));
}
@Test
public void testGetLinkedFileNameNoPattern() {
String fileNamePattern = "";
BibEntry entry = new BibEntry();
entry.setCiteKey("1234");
entry.setField("title", "mytitle");
assertEquals("1234", FileUtil.createFileNameFromPattern(null, entry, fileNamePattern,
layoutFormatterPreferences));
}
@Test
public void testGetDefaultFileNameNoPatternNoBibTeXKey() {
String fileNamePattern = "";
BibEntry entry = new BibEntry();
entry.setField("title", "mytitle");
assertEquals("default", FileUtil.createFileNameFromPattern(null, entry, fileNamePattern,
layoutFormatterPreferences));
}
@Test
public void testGetLinkedFileNameGetKeyIfEmptyField() {
// bibkey - title
String fileNamePattern = "\\begin{title} - \\format[RemoveBrackets]{\\title}\\end{title}";
BibEntry entry = new BibEntry();
entry.setCiteKey("1234");
assertEquals("1234", FileUtil.createFileNameFromPattern(null, entry, fileNamePattern,
layoutFormatterPreferences));
}
@Test
public void testGetLinkedFileNameGetDefaultIfEmptyFieldNoKey() {
// bibkey - title
String fileNamePattern = "\\begin{title} - \\format[RemoveBrackets]{\\title}\\end{title}";
BibEntry entry = new BibEntry();
assertEquals("default", FileUtil.createFileNameFromPattern(null, entry, fileNamePattern,
layoutFormatterPreferences));
}
@Test
public void testGetFileExtensionSimpleFile() {
assertEquals("pdf", FileHelper.getFileExtension(Paths.get("test.pdf")).get());
}
@Test
public void testGetFileExtensionLowerCaseAndTrimmingFile() {
assertEquals("pdf", FileHelper.getFileExtension(Paths.get("test.PdF ")).get());
}
@Test
public void testGetFileExtensionMultipleDotsFile() {
assertEquals("pdf", FileHelper.getFileExtension(Paths.get("te.st.PdF ")).get());
}
@Test
public void testGetFileExtensionNoExtensionFile() {
assertFalse(FileHelper.getFileExtension(Paths.get("JustTextNotASingleDot")).isPresent());
}
@Test
public void testGetFileExtensionNoExtension2File() {
assertFalse(FileHelper.getFileExtension(Paths.get(".StartsWithADotIsNotAnExtension")).isPresent());
}
@Test
public void getFileExtensionWithSimpleString() {
assertEquals("pdf", FileHelper.getFileExtension("test.pdf").get());
}
@Test
public void getFileExtensionTrimsAndReturnsInLowercase() {
assertEquals("pdf", FileHelper.getFileExtension("test.PdF ").get());
}
@Test
public void getFileExtensionWithMultipleDotsString() {
assertEquals("pdf", FileHelper.getFileExtension("te.st.PdF ").get());
}
@Test
public void getFileExtensionWithNoDotReturnsEmptyExtension() {
assertEquals(Optional.empty(), FileHelper.getFileExtension("JustTextNotASingleDot"));
}
@Test
public void getFileExtensionWithDotAtStartReturnsEmptyExtension() {
assertEquals(Optional.empty(), FileHelper.getFileExtension(".StartsWithADotIsNotAnExtension"));
}
@Test
public void getFileNameWithSimpleString() {
assertEquals("test", FileUtil.getFileName("test.pdf"));
}
@Test
public void getFileNameWithMultipleDotsString() {
assertEquals("te.st", FileUtil.getFileName("te.st.PdF "));
}
@Test
public void uniquePathSubstrings() {
String[] pathArr = {Paths.get("C:/uniquefile.bib").toString(),
Paths.get("C:/downloads/filename.bib").toString(), Paths.get("C:/mypaper/bib/filename.bib").toString(),
Paths.get("C:/external/mypaper/bib/filename.bib").toString(), ""};
String[] uniqArr = {Paths.get("uniquefile.bib").toString(), Paths.get("downloads/filename.bib").toString(),
Paths.get("C:/mypaper/bib/filename.bib").toString(),
Paths.get("external/mypaper/bib/filename.bib").toString(), ""};
List<String> paths = Arrays.asList(pathArr);
List<String> uniqPath = Arrays.asList(uniqArr);
List<String> result = FileUtil.uniquePathSubstrings(paths);
assertEquals(uniqPath, result);
}
@Test
public void testCopyFileFromEmptySourcePathToEmptyDestinationPathWithOverrideExistFile(){
assertFalse(FileUtil.copyFile(nonExistingTestPath, nonExistingTestPath, true));
}
@Test
public void testCopyFileFromEmptySourcePathToEmptyDestinationPathWithoutOverrideExistFile(){
assertFalse(FileUtil.copyFile(nonExistingTestPath, nonExistingTestPath, false));
}
@Test
public void testCopyFileFromEmptySourcePathToExistDestinationPathWithOverrideExistFile(){
assertFalse(FileUtil.copyFile(nonExistingTestPath, existingTestFile, true));
}
@Test
public void testCopyFileFromEmptySourcePathToExistDestinationPathWithoutOverrideExistFile(){
assertFalse(FileUtil.copyFile(nonExistingTestPath, existingTestFile, false));
}
@Test
public void testCopyFileFromExistSourcePathToExistDestinationPathWithOverrideExistFile(){
assertTrue(FileUtil.copyFile(existingTestFile, existingTestFile, true));
}
@Test
public void testCopyFileFromExistSourcePathToExistDestinationPathWithoutOverrideExistFile(){
assertFalse(FileUtil.copyFile(existingTestFile, existingTestFile, false));
}
@Test
public void testCopyFileFromExistSourcePathToOtherExistDestinationPathWithOverrideExistFile(){
assertTrue(FileUtil.copyFile(existingTestFile, otherExistingTestFile, true));
}
@Test
public void testCopyFileFromExistSourcePathToOtherExistDestinationPathWithoutOverrideExistFile(){
assertFalse(FileUtil.copyFile(existingTestFile, otherExistingTestFile, false));
}
@Test
public void testCopyFileSuccessfulWithOverrideExistFile() throws IOException {
Path temp = otherTemporaryFolder.newFile("existingTestFile.txt").toPath();
FileUtil.copyFile(existingTestFile, temp, true);
assertEquals(Files.readAllLines(existingTestFile, StandardCharsets.UTF_8),Files.readAllLines(temp, StandardCharsets.UTF_8));
}
@Test
public void testCopyFileSuccessfulWithoutOverrideExistFile() throws IOException {
Path temp = otherTemporaryFolder.newFile("existingTestFile.txt").toPath();
FileUtil.copyFile(existingTestFile, temp, false);
assertNotEquals(Files.readAllLines(existingTestFile, StandardCharsets.UTF_8),Files.readAllLines(temp, StandardCharsets.UTF_8));
}
@Test (expected = NullPointerException.class)
public void testRenameFileWithFromFileIsNullAndToFileIsNull() {
FileUtil.renameFile(null, null);
}
@Test (expected = NullPointerException.class)
public void testRenameFileWithFromFileExistAndToFileIsNull() {
FileUtil.renameFile(existingTestFile, null);
}
@Test (expected = NullPointerException.class)
public void testRenameFileWithFromFileIsNullAndToFileExist() {
FileUtil.renameFile(null, existingTestFile);
}
@Test
public void testRenameFileWithFromFileNotExistAndToFileNotExist(){
assertFalse(FileUtil.renameFile(nonExistingTestPath, nonExistingTestPath));
}
@Test
public void testRenameFileWithFromFileNotExistAndToFileExist(){
assertFalse(FileUtil.renameFile(nonExistingTestPath, existingTestFile));
}
@Test
public void testRenameFileWithFromFileExistAndToFileNotExist(){
assertTrue(FileUtil.renameFile(existingTestFile, nonExistingTestPath));
}
@Test
public void testRenameFileWithFromFileExistAndToFileExist(){
assertTrue(FileUtil.renameFile(existingTestFile, existingTestFile));
}
@Test
public void testRenameFileWithFromFileExistAndOtherToFileExist(){
assertFalse(FileUtil.renameFile(existingTestFile, otherExistingTestFile));
}
@Test
public void testRenameFileSuccessful() {
Path temp = Paths.get(otherTemporaryFolder.toString());
System.out.println(temp);
FileUtil.renameFile(existingTestFile, temp);
assertFalse(Files.exists(existingTestFile));
}
private Path createTemporaryTestFile(String name) throws IOException {
File testFile = temporaryFolder.newFile(name);
Files.write(testFile.toPath(), name.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
return testFile.toPath();
}
}