2 * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved.
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
;
48 import java
.io
.ByteArrayOutputStream
;
50 import java
.io
.IOException
;
51 import java
.io
.PrintStream
;
52 import java
.util
.HashSet
;
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
{
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() {
101 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
103 Disposer
.dispose(myProject
);
108 if (ApplicationManager
.getApplication().isDispatchThread()) {
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();
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";
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
{
176 public Object
getData(@NonNls String dataId
) {
177 if (dataId
.equals(DataConstants
.PROJECT
)) {
180 else if (dataId
.equals(DataConstants
.EDITOR
) || dataId
.equals(OpenFileDescriptor
.NAVIGATE_IN_EDITOR
.getName())) {
181 return FileEditorManager
.getInstance(myProject
).getSelectedTextEditor();
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
);
199 return PsiManager
.getInstance(getProject()).findFile(virtualFile
[0]);