file structure filtering tests
[idea/community.git] / platform / testFramework / src / com / intellij / testFramework / FileStructureTestBase.java
1 /*
2  * Copyright 2000-2012 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 com.intellij.testFramework;
17
18 import com.intellij.ide.actions.ViewStructureAction;
19 import com.intellij.ide.util.FileStructurePopup;
20 import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider;
21 import com.intellij.openapi.util.Disposer;
22 import com.intellij.openapi.util.io.FileUtil;
23 import com.intellij.openapi.util.text.StringUtil;
24 import com.intellij.testFramework.fixtures.CodeInsightFixtureTestCase;
25 import com.intellij.ui.treeStructure.Tree;
26 import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder;
27 import com.intellij.ui.treeStructure.filtered.FilteringTreeStructure;
28 import com.intellij.util.ui.tree.TreeUtil;
29 import junit.framework.Assert;
30 import org.junit.Before;
31
32 import javax.swing.tree.TreePath;
33 import java.io.File;
34
35 /**
36  * @author Konstantin Bulenkov
37  */
38 public abstract class FileStructureTestBase extends CodeInsightFixtureTestCase {
39   protected FileStructurePopup myPopup;
40
41   @Before
42   public void setUp() throws Exception {
43     super.setUp();
44     myFixture.configureByFile(getFileName(getFileExtension()));
45     myPopup = ViewStructureAction.createPopup(myFixture.getEditor(),
46                                               myFixture.getProject(),
47                                               null,
48                                               TextEditorProvider.getInstance().getTextEditor(myFixture.getEditor()));
49     assert myPopup != null;
50     myPopup.createCenterPanel();
51     getBuilder().getUi().getUpdater().setPassThroughMode(true);
52     update();
53   }
54
55   protected abstract String getFileExtension();
56
57   @Override
58   public void tearDown() throws Exception {
59     Disposer.dispose(myPopup);
60     super.tearDown();
61   }
62
63   private String getFileName(String ext) {
64     return getTestName(false) + (StringUtil.isEmpty(ext) ? "" : "." + ext);
65   }
66
67   protected String getTreeFileName() {
68     return getFileName("tree");
69   }
70
71   protected void checkTree(String filter) throws Exception {
72     myPopup.setSearchFilterForTests(filter);
73     getBuilder().refilter(null, false, true);
74     getBuilder().queueUpdate();
75     TreeUtil.selectPath(getTree(), (TreePath)getSpeedSearch().findElement(filter));
76     checkTree();
77   }
78
79   protected void checkTree() throws Exception {
80     final String expected = FileUtil.loadFile(new File(getTestDataPath() + "/" + getTreeFileName()), true);
81     Assert.assertEquals(expected.trim(), PlatformTestUtil.print(getTree(), true).trim());
82   }
83
84
85   public void update() throws InterruptedException {
86     myPopup.getTreeBuilder().refilter().doWhenProcessed(new Runnable() {
87       @Override
88       public void run() {
89
90         getStructure().rebuild();
91         updateTree();
92         getBuilder().updateFromRoot();
93         TreeUtil.expandAll(getTree());
94         final FilteringTreeStructure.FilteringNode node = myPopup.selectPsiElement(myPopup.getCurrentElement(getFile()));
95         getBuilder().getUi().select(node, null);
96       }
97     });
98   }
99
100   protected Tree getTree() {
101     return myPopup.getTree();
102   }
103
104   protected FilteringTreeBuilder getBuilder() {
105     return myPopup.getTreeBuilder();
106   }
107
108   protected FileStructurePopup.MyTreeSpeedSearch getSpeedSearch() {
109     return (FileStructurePopup.MyTreeSpeedSearch)myPopup.getSpeedSearch();
110   }
111
112
113   protected void updateTree() {
114     updateRecursively(getRootNode());
115   }
116
117   protected FilteringTreeStructure getStructure() {
118     final FilteringTreeStructure structure = (FilteringTreeStructure)getBuilder().getTreeStructure();
119     assert structure != null;
120     return structure;
121   }
122
123   protected FilteringTreeStructure.FilteringNode getRootNode() {
124     return (FilteringTreeStructure.FilteringNode)getStructure().getRootElement();
125   }
126
127   protected void updateRecursively(final FilteringTreeStructure.FilteringNode node) {
128     node.update();
129     for (FilteringTreeStructure.FilteringNode child : node.children()) {
130       updateRecursively(child);
131     }
132   }
133 }