[Git] Rework GitChangeProviderTest
[idea/community.git] / plugins / git4idea / tests / git4idea / tests / GitTestUtil.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package git4idea.tests;
17
18 import com.intellij.openapi.command.WriteCommandAction;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.util.Ref;
21 import com.intellij.openapi.vfs.CharsetToolkit;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import org.jetbrains.annotations.Nullable;
24
25 import java.io.IOException;
26 import java.util.HashMap;
27 import java.util.Map;
28
29 /**
30  * @author Kirill Likhodedov
31  */
32 public class GitTestUtil {
33
34   /**
35    * <p>Creates file structure for given paths. Path element should be a relative (from project root)
36    * path to a file or a directory. All intermediate paths will be created if needed.
37    * To create a dir without creating a file pass "dir/" as a parameter.</p>
38    * <p>Usage example:
39    * <code>createFileStructure("a.txt", "b.txt", "dir/c.txt", "dir/subdir/d.txt", "anotherdir/");</code></p>
40    * <p>This will create files a.txt and b.txt in the project dir, create directories dir, dir/subdir and anotherdir,
41    * and create file c.txt in dir and d.txt in dir/subdir.</p>
42    * <p>Note: use forward slash to denote directories, even if it is backslash that separates dirs in your system.</p>
43    * <p>All files are populated with "initial content" string.</p>
44    */
45   public static Map<String, VirtualFile> createFileStructure(Project project, GitTestRepository repo, String... paths) {
46     Map<String, VirtualFile> result = new HashMap<String, VirtualFile>();
47
48     for (String path : paths) {
49       String[] pathElements = path.split("/");
50       boolean lastIsDir = path.endsWith("/");
51       VirtualFile currentParent = repo.getDir();
52       for (int i = 0; i < pathElements.length-1; i++) {
53         currentParent = createDir(project, currentParent, pathElements[i]);
54       }
55
56       String lastElement = pathElements[pathElements.length-1];
57       currentParent = lastIsDir ? createDir(project, currentParent, lastElement) : createFile(project, currentParent, lastElement, "content" + Math.random());
58       result.put(path, currentParent);
59     }
60     return result;
61   }
62
63   // TODO: option - create via IDEA or via java.io. In latter case no need in Project parameter.
64   public static VirtualFile createFile(Project project, final VirtualFile parent, final String name, @Nullable final String content) {
65     final Ref<VirtualFile> result = new Ref<VirtualFile>();
66     new WriteCommandAction.Simple(project) {
67       @Override
68       protected void run() throws Throwable {
69         try {
70           VirtualFile file = parent.createChildData(this, name);
71           if (content != null) {
72             file.setBinaryContent(CharsetToolkit.getUtf8Bytes(content));
73           }
74           result.set(file);
75         }
76         catch (IOException e) {
77           throw new RuntimeException(e);
78         }
79       }
80     }.execute();
81     return result.get();
82   }
83
84   /**
85    * TODO: option - create via IDEA or via java.io. In latter case no need in Project parameter.
86    * Creates directory inside a write action and returns the resulting reference to it.
87    * If the directory already exists, does nothing.
88    * @param parent Parent directory.
89    * @param name   Name of the directory.
90    * @return reference to the created or already existing directory.
91    */
92   public static VirtualFile createDir(Project project, final VirtualFile parent, final String name) {
93     final Ref<VirtualFile> result = new Ref<VirtualFile>();
94     new WriteCommandAction.Simple(project) {
95       @Override
96       protected void run() throws Throwable {
97         try {
98           VirtualFile dir = parent.findChild(name);
99           if (dir == null) {
100             dir = parent.createChildDirectory(this, name);
101           }
102           result.set(dir);
103         }
104         catch (IOException e) {
105           throw new RuntimeException(e);
106         }
107       }
108     }.execute();
109     return result.get();
110   }
111
112 }