1 package com
.intellij
.testFramework
.codeInsight
.hierarchy
;
3 import com
.intellij
.codeInsight
.CodeInsightTestCase
;
4 import com
.intellij
.ide
.hierarchy
.HierarchyNodeDescriptor
;
5 import com
.intellij
.ide
.hierarchy
.HierarchyTreeStructure
;
6 import com
.intellij
.openapi
.util
.Computable
;
7 import com
.intellij
.openapi
.util
.JDOMUtil
;
8 import org
.jdom
.Document
;
9 import org
.jdom
.Element
;
15 * Checks tree structure for Type Hierarchy (Ctrl+H), Call Hierarchy (Ctrl+Alt+H), Method Hierarchy (Ctrl+Shift+H).
17 public abstract class HierarchyViewTestBase
extends CodeInsightTestCase
{
19 private static final String NODE_ELEMENT_NAME
= "node";
20 private static final String ANY_NODES_ELEMENT_NAME
= "any";
21 private static final String TEXT_ATTR_NAME
= "text";
22 private static final String BASE_ATTR_NAME
= "base";
24 protected abstract String
getBasePath();
26 protected void doHierarchyTest(final Computable
<HierarchyTreeStructure
> treeStructureComputable
, final String
... fileNames
)
28 final String
[] relFilePaths
= new String
[fileNames
.length
];
29 for (int i
= 0; i
< fileNames
.length
; i
++) {
30 relFilePaths
[i
] = "/" + getBasePath() + "/" + fileNames
[i
];
32 configureByFiles(null, relFilePaths
);
34 final String verificationFilePath
= getTestDataPath() + "/" + getBasePath() + "/" + getTestName(false) + "_verification.xml";
35 checkHierarchyTreeStructure(treeStructureComputable
.compute(), JDOMUtil
.loadDocument(new File(verificationFilePath
)));
38 private static void checkHierarchyTreeStructure(final HierarchyTreeStructure treeStructure
, final Document document
) {
39 final HierarchyNodeDescriptor rootNodeDescriptor
= (HierarchyNodeDescriptor
)treeStructure
.getRootElement();
40 rootNodeDescriptor
.update();
41 final Element rootElement
= document
.getRootElement();
42 if (rootElement
== null || !NODE_ELEMENT_NAME
.equals(rootElement
.getName())) {
43 throw new IllegalArgumentException("Incorrect root element in verification resource");
45 checkNodeDescriptorRecursively(treeStructure
, rootNodeDescriptor
, rootElement
);
48 private static void checkNodeDescriptorRecursively(final HierarchyTreeStructure treeStructure
,
49 final HierarchyNodeDescriptor descriptor
,
50 final Element expectedElement
) {
51 checkBaseNode(treeStructure
, descriptor
, expectedElement
);
52 checkContent(descriptor
, expectedElement
);
53 checkChildren(treeStructure
, descriptor
, expectedElement
);
56 private static void checkBaseNode(final HierarchyTreeStructure treeStructure
,
57 final HierarchyNodeDescriptor descriptor
,
58 final Element expectedElement
) {
59 final String baseAttrValue
= expectedElement
.getAttributeValue(BASE_ATTR_NAME
);
60 final HierarchyNodeDescriptor baseDescriptor
= treeStructure
.getBaseDescriptor();
61 final boolean mustBeBase
= "true".equalsIgnoreCase(baseAttrValue
);
62 assertTrue("Incorrect base node", mustBeBase ? baseDescriptor
== descriptor
: baseDescriptor
!= descriptor
);
65 private static void checkContent(final HierarchyNodeDescriptor descriptor
, final Element expectedElement
) {
66 assertEquals(expectedElement
.getAttributeValue(TEXT_ATTR_NAME
), descriptor
.getHighlightedText().getText());
69 private static void checkChildren(final HierarchyTreeStructure treeStructure
,
70 final HierarchyNodeDescriptor descriptor
,
71 final Element element
) {
72 if (element
.getChild(ANY_NODES_ELEMENT_NAME
) != null) {
76 final Object
[] children
= treeStructure
.getChildElements(descriptor
);
77 //noinspection unchecked
78 final List
<Element
> expectedChildren
= new ArrayList
<Element
>(element
.getChildren(NODE_ELEMENT_NAME
));
80 final StringBuilder messageBuilder
= new StringBuilder("Actual children of [" + descriptor
.getHighlightedText().getText() + "]:\n");
81 for (Object child
: children
) {
82 final HierarchyNodeDescriptor nodeDescriptor
= (HierarchyNodeDescriptor
)child
;
83 nodeDescriptor
.update();
84 messageBuilder
.append(" [").append(nodeDescriptor
.getHighlightedText().getText()).append("]\n");
86 assertEquals(messageBuilder
.toString(), expectedChildren
.size(), children
.length
);
88 Arrays
.sort(children
, new Comparator
<Object
>() {
89 public int compare(final Object first
, final Object second
) {
90 return ((HierarchyNodeDescriptor
)first
).getHighlightedText().getText()
91 .compareTo(((HierarchyNodeDescriptor
)second
).getHighlightedText().getText());
95 Collections
.sort(expectedChildren
, new Comparator
<Element
>() {
96 public int compare(final Element first
, final Element second
) {
97 return first
.getAttributeValue(TEXT_ATTR_NAME
).compareTo(second
.getAttributeValue(TEXT_ATTR_NAME
));
101 //noinspection unchecked
102 final Iterator
<Element
> iterator
= expectedChildren
.iterator();
103 for (Object child
: children
) {
104 checkNodeDescriptorRecursively(treeStructure
, ((HierarchyNodeDescriptor
)child
), iterator
.next());