diff options
Diffstat (limited to 'python/testSrc/com/jetbrains/python/hierarchy/PyCallHierarchyTest.java')
-rw-r--r-- | python/testSrc/com/jetbrains/python/hierarchy/PyCallHierarchyTest.java | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/python/testSrc/com/jetbrains/python/hierarchy/PyCallHierarchyTest.java b/python/testSrc/com/jetbrains/python/hierarchy/PyCallHierarchyTest.java new file mode 100644 index 000000000000..f9f7e226f913 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/hierarchy/PyCallHierarchyTest.java @@ -0,0 +1,158 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.python.hierarchy; + +import com.intellij.codeInsight.TargetElementUtilBase; +import com.intellij.ide.hierarchy.HierarchyBrowserBaseEx; +import com.intellij.ide.hierarchy.HierarchyNodeDescriptor; +import com.intellij.ide.hierarchy.HierarchyTreeStructure; +import com.intellij.psi.PsiElement; +import com.jetbrains.python.fixtures.PyTestCase; +import com.jetbrains.python.hierarchy.call.PyCalleeFunctionTreeStructure; +import com.jetbrains.python.hierarchy.call.PyCallerFunctionTreeStructure; +import com.jetbrains.python.psi.PyFunction; +import org.jetbrains.annotations.Nullable; + +/** + * @author novokrest + */ +public class PyCallHierarchyTest extends PyTestCase { + private static final String CALLER_VERIFICATION_SUFFIX = "_caller_verification.xml"; + private static final String CALLEE_VERIFICATION_SUFFIX = "_callee_verification.xml"; + + public static String dump(final HierarchyTreeStructure treeStructure, @Nullable HierarchyNodeDescriptor descriptor) { + StringBuilder s = new StringBuilder(); + dump(treeStructure, descriptor, 0, s); + return s.toString(); + } + + private static void dump(final HierarchyTreeStructure treeStructure, + @Nullable HierarchyNodeDescriptor descriptor, + int level, + StringBuilder b) { + if (level > 10) { + for(int i = 0; i<level; i++) b.append(" "); + b.append("<Probably infinite part skipped>\n"); + return; + } + if(descriptor==null) descriptor = (HierarchyNodeDescriptor)treeStructure.getRootElement(); + for(int i = 0; i<level; i++) b.append(" "); + descriptor.update(); + b.append("<node text=\"").append(descriptor.getHighlightedText().getText()).append("\"") + .append(treeStructure.getBaseDescriptor() == descriptor ? " base=\"true\"" : ""); + + final Object[] children = treeStructure.getChildElements(descriptor); + if(children.length>0) { + b.append(">\n"); + for (Object o : children) { + HierarchyNodeDescriptor d = (HierarchyNodeDescriptor)o; + dump(treeStructure, d, level + 1, b); + } + for(int i = 0; i<level; i++) b.append(" "); + b.append("</node>\n"); + } else { + b.append("/>\n"); + } + } + + private String getBasePath() { + return "hierarchy/call/Static/" + getTestName(false); + } + + private void configureByFiles(String ... fileNames) { + String[] filePaths = new String[fileNames.length]; + int i = 0; + for (String fileName: fileNames) { + filePaths[i] = getBasePath() + "/" + fileName; + i++; + } + myFixture.configureByFiles(filePaths); + } + + private String getVerificationFilePath(final String suffix) { + return getTestDataPath() + "/" + getBasePath() + "/" + getTestName(false) + suffix; + } + + private String getVerificationCallerFilePath() { + return getVerificationFilePath(CALLER_VERIFICATION_SUFFIX); + } + + private String getVerificationCalleeFilePath() { + return getVerificationFilePath(CALLEE_VERIFICATION_SUFFIX); + } + + private void checkHierarchyTreeStructure(PyFunction function) throws Exception { + final PyCallerFunctionTreeStructure callerStructure = new PyCallerFunctionTreeStructure(myFixture.getProject(), function, + HierarchyBrowserBaseEx.SCOPE_PROJECT); + assertSameLinesWithFile(getVerificationCallerFilePath(), dump(callerStructure, null)); + final PyCalleeFunctionTreeStructure calleeStructure = new PyCalleeFunctionTreeStructure(myFixture.getProject(), function, + HierarchyBrowserBaseEx.SCOPE_PROJECT); + assertSameLinesWithFile(getVerificationCalleeFilePath(), dump(calleeStructure, null)); + } + + private void doTestCallHierarchy(String ... fileNames) throws Exception { + configureByFiles(fileNames); + + final PsiElement targetElement = TargetElementUtilBase + .findTargetElement(myFixture.getEditor(), + TargetElementUtilBase.ELEMENT_NAME_ACCEPTED | TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED); + assert targetElement != null : "Cannot find referenced element"; + assert targetElement instanceof PyFunction : "Referenced element is not PyFunction"; + + PyFunction function = (PyFunction) targetElement; + checkHierarchyTreeStructure(function); + } + + public void testSimple() throws Exception { + doTestCallHierarchy("main.py"); + } + + public void testArgumentList() throws Exception { + doTestCallHierarchy("main.py", "file_1.py"); + } + + public void testDefaultValue() throws Exception { + doTestCallHierarchy("main.py"); + } + + public void testLambda() throws Exception { + doTestCallHierarchy("main.py", "file_1.py"); + } + + public void testNestedCall() throws Exception { + doTestCallHierarchy("main.py", "file_1.py"); + } + + public void testInheritance() throws Exception { + doTestCallHierarchy("main.py"); + } + + public void testOverriddenMethod() throws Exception { + doTestCallHierarchy("main.py", "file_1.py"); + } + + public void testInnerFunction() throws Exception { + doTestCallHierarchy("main.py"); + } + + public void testConstructor() throws Exception { + doTestCallHierarchy("main.py"); + } + + public void testParentheses() throws Exception { + doTestCallHierarchy("main.py", "file_1.py"); + } +}
\ No newline at end of file |