Signed-off-by: Florian Koeberle <florianskarten@xxxxxx> --- .../treewalk/rules/AddCommandIterationTest.java | 339 ++++++++++++++++++++ 1 files changed, 339 insertions(+), 0 deletions(-) create mode 100644 org.spearce.jgit.test/tst/org/spearce/jgit/treewalk/rules/AddCommandIterationTest.java diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/treewalk/rules/AddCommandIterationTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/treewalk/rules/AddCommandIterationTest.java new file mode 100644 index 0000000..a17fc18 --- /dev/null +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/treewalk/rules/AddCommandIterationTest.java @@ -0,0 +1,339 @@ +/* + * Copyright (C) 2008, Florian Köberle <florianskarten@xxxxxx> + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * - Neither the name of the Git Development Community nor the + * names of its contributors may be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.spearce.jgit.treewalk.rules; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Set; + +import org.spearce.jgit.errors.InvalidPatternException; +import org.spearce.jgit.errors.PathNotInProjectDirectoryException; +import org.spearce.jgit.lib.AbstractTestCase; +import org.spearce.jgit.lib.Repository; +import org.spearce.jgit.lib.WorkTree; +import org.spearce.jgit.treewalk.LightFileTreeIterable; + +public class AddCommandIterationTest extends AbstractTestCase { + + private WorkTree workTree; + + private AddRulesFactory factory; + + private Iterable<File> createIterable(File workingDirectory, + List<String> filePatternsOfAddCommand) + throws PathNotInProjectDirectoryException, InvalidPatternException, + IOException { + final Rules rules = factory.createRules(workTree.getDirectory(), + workingDirectory, filePatternsOfAddCommand); + return new LightFileTreeIterable(workTree.getDirectory(), rules, false); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + final File projectDirectory = createTemporaryDirectory(); + this.workTree = Repository.createWorkTree(projectDirectory); + this.factory = new AddRulesFactory(); + } + + public void testNoPattern() throws Exception { + createFile("a.txt"); + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + Collections.<String> emptyList()); + final Set<File> expectedPaths = Collections.emptySet(); + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedPaths, iterable); + } + + public void testTreePattern1() throws Exception { + final Set<File> expectedFiles = new HashSet<File>(); + createFile("a.txt"); + expectedFiles.add(createFile("a", "a.txt")); + expectedFiles.add(createFile("a", "a", "a.txt")); + expectedFiles.add(createFile("a", "b", "a.txt")); + createFile("a", "b", "a.c"); + + final File directoryA = new File(workTree.getDirectory(), "a"); + + final Iterable<File> iterable = createIterable(directoryA, Arrays + .asList("*.txt")); + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedFiles, iterable); + } + + public void testTreePattern2() throws Exception { + final Set<File> expectedFiles = new HashSet<File>(); + createFile("a.txt"); + expectedFiles.add(createFile("a", "a.txt")); + expectedFiles.add(createFile("a", "a", "a.txt")); + expectedFiles.add(createFile("a", "b", "a.txt")); + createFile("a", "b", "a.c"); + + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + Arrays.asList("a" + File.separator + "*.txt")); + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedFiles, iterable); + } + + public void testSelectCompleteSubdirectory() throws Exception { + final Set<File> expectedPaths = new HashSet<File>(); + final File directoryA = new File(workTree.getDirectory(), "a"); + final File directoryAA = new File(directoryA, "a"); + final File directoryAB = new File(directoryA, "b"); + createFile("a.txt"); + expectedPaths.add(directoryA); + expectedPaths.add(directoryAA); + expectedPaths.add(createFile("a", "a.txt")); + expectedPaths.add(createFile("a", "a", "a.txt")); + expectedPaths.add(directoryAB); + expectedPaths.add(createFile("a", "b", "a.txt")); + expectedPaths.add(createFile("a", "b", "a.c")); + + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + Arrays.asList("a")); + + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedPaths, iterable); + } + + public void testSelectTwoSubdirectories() throws Exception { + final Set<File> expectedPaths = new HashSet<File>(); + final File directoryA = new File(workTree.getDirectory(), "a"); + final File directoryAA = new File(directoryA, "a"); + final File directoryAB = new File(directoryA, "b"); + createFile("a.txt"); + createFile("a", "a.txt"); + expectedPaths.add(directoryAA); + expectedPaths.add(createFile("a", "a", "a.txt")); + expectedPaths.add(directoryAB); + expectedPaths.add(createFile("a", "b", "a.txt")); + expectedPaths.add(createFile("a", "b", "a.c")); + + final List<String> patternList = new ArrayList<String>(2); + patternList.add("a" + File.separator + "a"); + patternList.add("a" + File.separator + "b"); + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + patternList); + + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedPaths, iterable); + } + + public void testTwoDifferentSelects() throws Exception { + final Set<File> expectedPaths = new HashSet<File>(); + final File directoryA = new File(workTree.getDirectory(), "a"); + final File directoryAA = new File(directoryA, "a"); + createFile("a.txt"); + createFile("a", "a.txt"); + expectedPaths.add(directoryAA); + expectedPaths.add(createFile("a", "a", "a.txt")); + expectedPaths.add(createFile("a", "b", "a.txt")); + expectedPaths.add(createFile("a", "b", "c", "a.txt")); + createFile("a", "b", "a.c"); + + final List<String> patternList = new ArrayList<String>(2); + patternList.add("a" + File.separator + "a"); + patternList.add("a" + File.separator + "b" + File.separator + "*.txt"); + + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + patternList); + + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedPaths, iterable); + } + + public void testRealisticExample() throws Exception { + final Set<File> expectedPaths = new HashSet<File>(); + + // write the .gitignore file + final File dotGitIgnoreFile = createFile(".gitignore"); + final PrintWriter dotGitIgnoreFilePrinter = new PrintWriter( + dotGitIgnoreFile); + try { + dotGitIgnoreFilePrinter.println("/alpha/config.xml"); + dotGitIgnoreFilePrinter.println("*.class"); + dotGitIgnoreFilePrinter.println("!/alpha/test/ressources/"); + dotGitIgnoreFilePrinter.println("*~"); + } finally { + dotGitIgnoreFilePrinter.close(); + } + + // write the .git/info/exclude file + final File repositoryDirectory = workTree.getRepository() + .getDirectory(); + final File infoDirectory = new File(repositoryDirectory, "info"); + infoDirectory.mkdir(); + final File infoExcludeFile = new File(infoDirectory, "exclude"); + final PrintWriter infoExcludeFilePrinter = new PrintWriter( + infoExcludeFile); + try { + infoExcludeFilePrinter.println("/alpha/test/ressources/mytest.txt"); + } finally { + infoExcludeFilePrinter.close(); + } + + createFile("alpha", "config.xml"); + expectedPaths.add(createFile("alpha", "src", "Main.java")); + createFile("alpha", "src", "Main.class"); + expectedPaths.add(createFile("alpha", "test", "ressources", + "Example.class")); + expectedPaths + .add(createFile("alpha", "test", "ressources", "input.txt")); + createFile("alpha", "test", "ressources", "input.txt~"); + createFile("alpha", "test", "ressources", "mytest.txt"); + + final File alphaDirectory = new File(workTree.getDirectory(), "alpha"); + final File srcDirectory = new File(alphaDirectory, "src"); + final File testDirectory = new File(alphaDirectory, "test"); + final File ressources = new File(testDirectory, "ressources"); + + expectedPaths.add(alphaDirectory); + expectedPaths.add(srcDirectory); + expectedPaths.add(testDirectory); + expectedPaths.add(ressources); + + final List<String> patternList = new ArrayList<String>(2); + patternList.add("alpha"); + + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + patternList); + + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedPaths, iterable); + } + + public void testSingleFile() throws Exception { + createFile("a.txt"); + createFile("a", "a.txt"); + createFile("a", "a", "a.txt"); + final File expectedFile = createFile("a", "b", "a.txt"); + createFile("a", "b", "a.c"); + + final String pattern = "a" + File.separator + "b" + File.separator + + "a.txt"; + final Iterable<File> iterable = createIterable(workTree.getDirectory(), + Arrays.asList(pattern)); + final Set<File> expectedPaths = Collections.singleton(expectedFile); + assertIsValidIterable(iterable); + assertIterableReturnsSet(expectedPaths, iterable); + } + + /** + * Tests if the specified {@link Iterable} returns the specified set of + * {@link File}s. The assertion will fail if the {@link Iterable} returns + * to much, to less files. It will also fail if the {@link Iterable} returns + * a file twice. + * + * @param expectedContent + * the expected set of files. + * @param iterable + * the {@link Iterable} to test. + */ + private void assertIterableReturnsSet(Set<File> expectedContent, + Iterable<File> iterable) { + final Set<File> returnedFiles = new HashSet<File>(); + final List<File> doubleReturnedFiles = new ArrayList<File>(); + + final Iterator<File> iterator = iterable.iterator(); + while (iterator.hasNext()) { + final File file = iterator.next(); + if (!returnedFiles.add(file)) { + doubleReturnedFiles.add(file); + } + } + final Set<File> missingFiles = new HashSet<File>(); + for (File file : expectedContent) { + if (!returnedFiles.contains(file)) { + missingFiles.add(file); + } + } + if (!missingFiles.isEmpty()) { + fail(String.format("missing paths: %s", missingFiles)); + } + + final Set<File> unexpectedFiles = new HashSet<File>(); + for (File file : returnedFiles) { + if (!expectedContent.contains(file)) { + unexpectedFiles.add(file); + } + } + if (!unexpectedFiles.isEmpty()) { + fail(String.format("unexpected paths: %s", unexpectedFiles)); + } + + if (!doubleReturnedFiles.isEmpty()) { + fail(String.format("multiple times returned paths: %s", + doubleReturnedFiles)); + } + + } + + private static void assertIsValidIterable(Iterable<File> iterable) { + final Iterator<File> iterator = iterable.iterator(); + while (iterator.hasNext()) { + iterator.next(); + } + try { + iterator.next(); + fail(); + } catch (NoSuchElementException e) { + // expected + } + } + + private File createFile(String... path) throws IOException { + File file = workTree.getDirectory(); + for (int i = 0; i < path.length; i++) { + file = new File(file, path[i]); + if (i == path.length - 1) { + file.getParentFile().mkdirs(); + file.createNewFile(); + break; + } + } + return file; + } +} -- 1.5.4.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html