dispose project in a write action
[fedora-idea.git] / platform / testFramework / src / com / intellij / testFramework / fixtures / impl / HeavyIdeaTestFixtureImpl.java
blob736362c96a06746cbc12f2ac818836b2ab5b0d12
1 /*
2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
3 */
5 package com.intellij.testFramework.fixtures.impl;
7 import com.intellij.codeInsight.completion.CompletionProgressIndicator;
8 import com.intellij.ide.highlighter.ProjectFileType;
9 import com.intellij.ide.startup.impl.StartupManagerImpl;
10 import com.intellij.idea.IdeaTestApplication;
11 import com.intellij.openapi.actionSystem.DataConstants;
12 import com.intellij.openapi.actionSystem.DataProvider;
13 import com.intellij.openapi.application.ApplicationManager;
14 import com.intellij.openapi.command.WriteCommandAction;
15 import com.intellij.openapi.editor.Editor;
16 import com.intellij.openapi.editor.EditorFactory;
17 import com.intellij.openapi.editor.impl.EditorFactoryImpl;
18 import com.intellij.openapi.fileEditor.FileDocumentManager;
19 import com.intellij.openapi.fileEditor.FileEditorManager;
20 import com.intellij.openapi.fileEditor.OpenFileDescriptor;
21 import com.intellij.openapi.module.Module;
22 import com.intellij.openapi.module.ModuleManager;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.project.ex.ProjectManagerEx;
25 import com.intellij.openapi.startup.StartupManager;
26 import com.intellij.openapi.util.Disposer;
27 import com.intellij.openapi.util.EmptyRunnable;
28 import com.intellij.openapi.util.io.FileUtil;
29 import com.intellij.openapi.util.text.StringUtil;
30 import com.intellij.openapi.vfs.LocalFileSystem;
31 import com.intellij.openapi.vfs.VfsUtil;
32 import com.intellij.openapi.vfs.VirtualFile;
33 import com.intellij.psi.PsiDocumentManager;
34 import com.intellij.psi.PsiFile;
35 import com.intellij.psi.PsiManager;
36 import com.intellij.psi.impl.PsiDocumentManagerImpl;
37 import com.intellij.testFramework.EditorListenerTracker;
38 import com.intellij.testFramework.PlatformTestCase;
39 import com.intellij.testFramework.ThreadTracker;
40 import com.intellij.testFramework.builders.ModuleFixtureBuilder;
41 import com.intellij.testFramework.fixtures.HeavyIdeaTestFixture;
42 import com.intellij.util.PathUtil;
43 import gnu.trove.THashSet;
44 import org.jetbrains.annotations.NonNls;
45 import org.jetbrains.annotations.Nullable;
47 import javax.swing.*;
48 import java.io.ByteArrayOutputStream;
49 import java.io.File;
50 import java.io.IOException;
51 import java.io.PrintStream;
52 import java.util.HashSet;
53 import java.util.Set;
55 /**
56 * @author mike
58 class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixture {
60 @NonNls private static final String PROJECT_FILE_PREFIX = "temp";
61 @NonNls private static final String PROJECT_FILE_SUFFIX = ProjectFileType.DOT_DEFAULT_EXTENSION;
63 private Project myProject;
64 private final Set<File> myFilesToDelete = new HashSet<File>();
65 private IdeaTestApplication myApplication;
66 private final Set<ModuleFixtureBuilder> myModuleFixtureBuilders = new THashSet<ModuleFixtureBuilder>();
67 private EditorListenerTracker myEditorListenerTracker;
68 private ThreadTracker myThreadTracker;
70 protected void addModuleFixtureBuilder(ModuleFixtureBuilder builder) {
71 myModuleFixtureBuilders.add(builder);
74 public void setUp() throws Exception {
75 super.setUp();
77 initApplication();
78 setUpProject();
80 myEditorListenerTracker = new EditorListenerTracker();
81 myThreadTracker = new ThreadTracker();
84 public void tearDown() throws Exception {
85 ((StartupManagerImpl)StartupManager.getInstance(getProject())).prepareForNextTest();
86 checkAllTimersAreDisposed();
87 ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments();
89 for (ModuleFixtureBuilder moduleFixtureBuilder: myModuleFixtureBuilders) {
90 moduleFixtureBuilder.getFixture().tearDown();
93 ProjectManagerEx.getInstanceEx().setCurrentTestProject(null);
94 ApplicationManager.getApplication().runWriteAction(EmptyRunnable.getInstance()); // Flash posponed formatting if any.
95 FileDocumentManager.getInstance().saveAllDocuments();
97 doPostponedFormatting(myProject);
99 Runnable runnable = new Runnable() {
100 public void run() {
101 ApplicationManager.getApplication().runWriteAction(new Runnable() {
102 public void run() {
103 Disposer.dispose(myProject);
108 if (ApplicationManager.getApplication().isDispatchThread()) {
109 runnable.run();
110 } else {
111 SwingUtilities.invokeAndWait(runnable);
114 for (final File fileToDelete : myFilesToDelete) {
115 boolean deleted = FileUtil.delete(fileToDelete);
116 assert deleted : "Can't delete "+fileToDelete;
119 myApplication.setDataProvider(null);
121 EditorFactory editorFactory = EditorFactory.getInstance();
122 final Editor[] allEditors = editorFactory.getAllEditors();
123 ((EditorFactoryImpl)editorFactory).validateEditorsAreReleased(getProject());
124 for (Editor editor : allEditors) {
125 editorFactory.releaseEditor(editor);
127 assert 0 == editorFactory.getAllEditors().length : "There are unrealeased editors";
128 CompletionProgressIndicator.cleanupForNextTest();
130 super.tearDown();
132 myEditorListenerTracker.checkListenersLeak();
133 myThreadTracker.checkLeak();
137 private void setUpProject() throws Exception {
138 File projectFile = File.createTempFile(PROJECT_FILE_PREFIX, PROJECT_FILE_SUFFIX);
139 myFilesToDelete.add(projectFile);
141 LocalFileSystem.getInstance().refreshAndFindFileByIoFile(projectFile);
142 ByteArrayOutputStream buffer = new ByteArrayOutputStream();
143 new Throwable(projectFile.getPath()).printStackTrace(new PrintStream(buffer));
144 myProject = PlatformTestCase.createProject(projectFile, buffer.toString());
146 for (ModuleFixtureBuilder moduleFixtureBuilder: myModuleFixtureBuilders) {
147 moduleFixtureBuilder.getFixture().setUp();
150 //PropertiesReferenceManager.getInstance(myProject).projectOpened();
152 StartupManagerImpl sm = (StartupManagerImpl)StartupManager.getInstance(myProject);
153 sm.runStartupActivities();
154 sm.runPostStartupActivities();
156 ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject);
159 private void initApplication() throws Exception {
160 myApplication = IdeaTestApplication.getInstance(null);
161 myApplication.setDataProvider(new MyDataProvider());
164 public Project getProject() {
165 assert myProject != null : "setUp() should be called first";
166 return myProject;
169 public Module getModule() {
170 Module[] modules = ModuleManager.getInstance(getProject()).getModules();
171 return modules.length == 0 ? null : modules[0];
174 private class MyDataProvider implements DataProvider {
175 @Nullable
176 public Object getData(@NonNls String dataId) {
177 if (dataId.equals(DataConstants.PROJECT)) {
178 return myProject;
180 else if (dataId.equals(DataConstants.EDITOR) || dataId.equals(OpenFileDescriptor.NAVIGATE_IN_EDITOR.getName())) {
181 return FileEditorManager.getInstance(myProject).getSelectedTextEditor();
183 else {
184 return null;
189 public PsiFile addFileToProject(@NonNls String rootPath, @NonNls final String relativePath, @NonNls final String fileText) throws IOException {
190 final VirtualFile dir = VfsUtil.createDirectories(rootPath + "/" + PathUtil.getParentPath(relativePath));
192 final VirtualFile[] virtualFile = new VirtualFile[1];
193 new WriteCommandAction.Simple(getProject()) {
194 protected void run() throws Throwable {
195 virtualFile[0] = dir.createChildData(this, StringUtil.getShortName(relativePath, '/'));
196 VfsUtil.saveText(virtualFile[0], fileText);
198 }.execute();
199 return PsiManager.getInstance(getProject()).findFile(virtualFile[0]);