package com.beijunyi.parallelgit.filesystem; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import org.junit.Before; import org.junit.Test; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; import static org.junit.Assert.*; public class FilesCopyTest extends AbstractGitFileSystemTest { @Before public void setUp() throws IOException { initRepository(); } @Test public void copyFile_theTargetFileShouldBeIdenticalToTheSourceFile() throws IOException { byte[] expected = someBytes(); writeToCache("/source.txt", expected); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target); assertTrue(Files.exists(target)); assertTrue(Files.isRegularFile(target)); assertArrayEquals(expected, Files.readAllBytes(target)); } @Test public void copyFile_theSourceFileDataShouldRemainTheSame() throws IOException { byte[] expected = someBytes(); writeToCache("/source.txt", expected); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target); assertArrayEquals(expected, Files.readAllBytes(source)); } @Test public void copyFile_theFileSystemShouldBecomeDirty() throws IOException { writeToCache("/source.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target); assertTrue(gfs.getStatusProvider().isDirty()); } @Test public void copyModifiedFile_theTargetFileShouldHaveTheModifiedContent() throws IOException { writeToCache("/source.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); byte[] expected = someBytes(); Files.write(source, expected); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target); assertArrayEquals(expected, Files.readAllBytes(target)); } @Test(expected = FileAlreadyExistsException.class) public void copyFileWhenTargetExists_shouldThrowFileAlreadyExistsException() throws IOException { writeToCache("/source.txt"); writeToCache("/target.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target); } @Test public void copyFileWithReplaceExistingOption_shouldOverwriteTheTargetFileData() throws IOException { byte[] expected = someBytes(); writeToCache("/source.txt", expected); writeToCache("/target.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target, REPLACE_EXISTING); assertArrayEquals(expected, Files.readAllBytes(target)); } @Test public void copyFileWhenTargetEqualsSource_shouldHaveNoEffect() throws IOException { byte[] expected = someBytes(); writeToCache("/source.txt", expected); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); Files.copy(source, source); assertArrayEquals(expected, Files.readAllBytes(source)); } @Test(expected = NoSuchFileException.class) public void copyNonExistentFile_shouldThrowNoSuchFileException() throws IOException { initGitFileSystem(); GitPath source = gfs.getPath("/non_existent_file.txt"); GitPath target = gfs.getPath("/target.txt"); Files.copy(source, target); } @Test(expected = FileAlreadyExistsException.class) public void copyFileWhenTargetIsDirectory_shouldThrowFileAlreadyExistsException() throws IOException { writeToCache("/source.txt"); writeToCache("/target/file.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target"); Files.copy(source, target); } @Test public void copyFileReplacingTargetDirectory_theTargetShouldBecomeFile() throws IOException { writeToCache("/source.txt"); writeToCache("/target/file.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target"); Files.copy(source, target, REPLACE_EXISTING); assertTrue(Files.isRegularFile(target)); } @Test public void copyFileReplacingTargetDirectory_theTargetFileShouldHaveTheSameData() throws IOException { byte[] expected = someBytes(); writeToCache("/source.txt", expected); writeToCache("/target/file.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source.txt"); GitPath target = gfs.getPath("/target"); Files.copy(source, target, REPLACE_EXISTING); assertArrayEquals(expected, Files.readAllBytes(target)); } @Test public void copyDirectory_theTargetDirectoryShouldExist() throws IOException { writeToCache("/source/file.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source"); GitPath target = gfs.getPath("/target"); Files.copy(source, target); assertTrue(Files.exists(target)); } @Test public void copyDirectory_theTargetDirectoryShouldBeDirectory() throws IOException { writeToCache("/source/file.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source"); GitPath target = gfs.getPath("/target"); Files.copy(source, target); assertTrue(Files.isDirectory(target)); } @Test public void copyDirectory_theTargetDirectoryShouldHaveTheSameChildren() throws IOException { writeToCache("/source/file1.txt"); writeToCache("/source/file2.txt"); commitToMaster(); initGitFileSystem(); Files.copy(gfs.getPath("/source"), gfs.getPath("/target")); assertTrue(Files.exists(gfs.getPath("/target/file1.txt"))); assertTrue(Files.exists(gfs.getPath("/target/file2.txt"))); } @Test public void copyDirectory_theSourceDirectoryShouldRemainTheSame() throws IOException { writeToCache("/source/file1.txt"); writeToCache("/source/file2.txt"); commitToMaster(); initGitFileSystem(); Files.copy(gfs.getPath("/source"), gfs.getPath("/target")); assertTrue(Files.exists(gfs.getPath("/source/file1.txt"))); assertTrue(Files.exists(gfs.getPath("/source/file2.txt"))); } @Test public void copyDirectory_theChildrenInTheTargetDirectoryShouldHaveTheSameData() throws IOException { byte[] expectedData1 = someBytes(); writeToCache("/source/file1.txt", expectedData1); byte[] expectedData2 = someBytes(); writeToCache("/source/file2.txt", expectedData2); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source"); GitPath target = gfs.getPath("/target"); Files.copy(source, target); assertArrayEquals(expectedData1, Files.readAllBytes(target.resolve("file1.txt"))); assertArrayEquals(expectedData2, Files.readAllBytes(target.resolve("file2.txt"))); } @Test public void copyDirectory_theFileSystemShouldBecomeDirty() throws IOException { writeToCache("/source/file.txt"); commitToMaster(); initGitFileSystem(); GitPath source = gfs.getPath("/source"); GitPath target = gfs.getPath("/target"); Files.copy(source, target); assertTrue(gfs.getStatusProvider().isDirty()); } }