From bbf05eaabaa545f13145e424fd00818d8b820a76 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 7 Dec 2018 15:33:56 +0300 Subject: [PATCH] Fix test compilation because of using HierarchyViewTestFixture in <= 181 --- .idea/inspectionProfiles/idea_default.xml | 2 + .../idea/KotlinHierarchyViewTestBase.java | 2 +- .../idea/hierarchy/AbstractHierarchyTest.java | 1 - .../kotlin/test/HierarchyViewTestFixture.kt | 11 ++ .../test/HierarchyViewTestFixture.kt.181 | 9 ++ .../test/HierarchyViewTestFixtureCompat.java | 145 ++++++++++++++++++ 6 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt create mode 100644 idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt.181 create mode 100644 idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixtureCompat.java diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml index ddba23709a4..bb66b5da036 100644 --- a/.idea/inspectionProfiles/idea_default.xml +++ b/.idea/inspectionProfiles/idea_default.xml @@ -113,6 +113,8 @@ + + diff --git a/idea/tests/org/jetbrains/kotlin/idea/KotlinHierarchyViewTestBase.java b/idea/tests/org/jetbrains/kotlin/idea/KotlinHierarchyViewTestBase.java index 55d6c75b1cf..bbf2084af68 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/KotlinHierarchyViewTestBase.java +++ b/idea/tests/org/jetbrains/kotlin/idea/KotlinHierarchyViewTestBase.java @@ -19,9 +19,9 @@ package org.jetbrains.kotlin.idea; import com.intellij.ide.hierarchy.HierarchyTreeStructure; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.testFramework.codeInsight.hierarchy.HierarchyViewTestFixture; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase; +import org.jetbrains.kotlin.test.HierarchyViewTestFixture; import java.io.File; import java.io.IOException; diff --git a/idea/tests/org/jetbrains/kotlin/idea/hierarchy/AbstractHierarchyTest.java b/idea/tests/org/jetbrains/kotlin/idea/hierarchy/AbstractHierarchyTest.java index 686362bc193..57e78f022ba 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/hierarchy/AbstractHierarchyTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/hierarchy/AbstractHierarchyTest.java @@ -84,7 +84,6 @@ public abstract class AbstractHierarchyTest extends KotlinHierarchyViewTestBase protected void doCallerJavaHierarchyTest(@NotNull String folderName) throws Exception { this.folderName = folderName; doHierarchyTest(getCallerJavaHierarchyStructure(), getFilesToConfigure()); - } protected void doCalleeHierarchyTest(@NotNull String folderName) throws Exception { diff --git a/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt b/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt new file mode 100644 index 00000000000..63fee4b663d --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test + +import com.intellij.testFramework.codeInsight.hierarchy.HierarchyViewTestFixture + +@Suppress("IncompatibleAPI") +class HierarchyViewTestFixture : HierarchyViewTestFixture() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt.181 b/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt.181 new file mode 100644 index 00000000000..28a6b11271f --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixture.kt.181 @@ -0,0 +1,9 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test + +@Suppress("IncompatibleAPI") +class HierarchyViewTestFixture : HierarchyViewTestFixtureCompat() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixtureCompat.java b/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixtureCompat.java new file mode 100644 index 00000000000..f5785fa1e26 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/test/HierarchyViewTestFixtureCompat.java @@ -0,0 +1,145 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.test; + +import com.intellij.ide.hierarchy.HierarchyNodeDescriptor; +import com.intellij.ide.hierarchy.HierarchyTreeStructure; +import com.intellij.openapi.util.JDOMUtil; +import junit.framework.Assert; +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * Copied from com.intellij.testFramework.codeInsight.hierarchy.HierarchyViewTestFixture for compatibility reasons. + * + * Use org.jetbrains.kotlin.test.HierarchyViewTestFixture typealias instead. + * + * BUNCH: 182 + */ +@SuppressWarnings("ALL") +public class HierarchyViewTestFixtureCompat { + private static final String NODE_ELEMENT_NAME = "node"; + private static final String ANY_NODES_ELEMENT_NAME = "any"; + private static final String TEXT_ATTR_NAME = "text"; + private static final String BASE_ATTR_NAME = "base"; + + public void doHierarchyTest(@NotNull HierarchyTreeStructure treeStructure, + @NotNull String expectedStructure) { + try { + checkHierarchyTreeStructure(treeStructure, JDOMUtil.load(expectedStructure)); + } + catch (Throwable e) { + Assert.assertEquals("XML structure comparison for your convenience, actual failure details BELOW", + expectedStructure, dump(treeStructure, null, 0)); + //noinspection CallToPrintStackTrace + e.printStackTrace(); + } + } + + @NotNull + public static String dump(@NotNull HierarchyTreeStructure treeStructure, + @Nullable HierarchyNodeDescriptor descriptor, + int level) { + StringBuilder s = new StringBuilder(); + dump(treeStructure, descriptor, level, s); + return s.toString(); + } + + private static void dump(@NotNull HierarchyTreeStructure treeStructure, + @Nullable HierarchyNodeDescriptor descriptor, + int level, + @NotNull StringBuilder b) { + if (level > 10) { + for (int i = 0; i < level; i++) b.append(" "); + b.append("\n"); + return; + } + if (descriptor == null) descriptor = (HierarchyNodeDescriptor)treeStructure.getRootElement(); + for (int i = 0; i < level; i++) b.append(" "); + descriptor.update(); + b.append(" 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("\n"); + } + else { + b.append("/>\n"); + } + } + + private static void checkHierarchyTreeStructure(@NotNull HierarchyTreeStructure treeStructure, + @Nullable Element rootElement) { + HierarchyNodeDescriptor rootNodeDescriptor = (HierarchyNodeDescriptor)treeStructure.getRootElement(); + rootNodeDescriptor.update(); + if (rootElement == null || !NODE_ELEMENT_NAME.equals(rootElement.getName())) { + throw new IllegalArgumentException("Incorrect root element in verification resource"); + } + checkNodeDescriptorRecursively(treeStructure, rootNodeDescriptor, rootElement); + } + + private static void checkNodeDescriptorRecursively(@NotNull HierarchyTreeStructure treeStructure, + @NotNull HierarchyNodeDescriptor descriptor, + @NotNull Element expectedElement) { + checkBaseNode(treeStructure, descriptor, expectedElement); + checkContent(descriptor, expectedElement); + checkChildren(treeStructure, descriptor, expectedElement); + } + + private static void checkBaseNode(@NotNull HierarchyTreeStructure treeStructure, + @NotNull HierarchyNodeDescriptor descriptor, + @NotNull Element expectedElement) { + String baseAttrValue = expectedElement.getAttributeValue(BASE_ATTR_NAME); + HierarchyNodeDescriptor baseDescriptor = treeStructure.getBaseDescriptor(); + boolean mustBeBase = "true".equalsIgnoreCase(baseAttrValue); + Assert.assertTrue("Incorrect base node", mustBeBase ? baseDescriptor == descriptor : baseDescriptor != descriptor); + } + + private static void checkContent(@NotNull HierarchyNodeDescriptor descriptor, + @NotNull Element expectedElement) { + Assert.assertEquals(expectedElement.getAttributeValue(TEXT_ATTR_NAME), descriptor.getHighlightedText().getText()); + } + + private static void checkChildren(@NotNull HierarchyTreeStructure treeStructure, + @NotNull HierarchyNodeDescriptor descriptor, + @NotNull Element element) { + if (element.getChild(ANY_NODES_ELEMENT_NAME) != null) { + return; + } + + Object[] children = treeStructure.getChildElements(descriptor); + //noinspection unchecked + List expectedChildren = new ArrayList<>(element.getChildren(NODE_ELEMENT_NAME)); + + StringBuilder messageBuilder = new StringBuilder("Actual children of [" + descriptor.getHighlightedText().getText() + "]:\n"); + for (Object child : children) { + HierarchyNodeDescriptor nodeDescriptor = (HierarchyNodeDescriptor)child; + nodeDescriptor.update(); + messageBuilder.append(" [").append(nodeDescriptor.getHighlightedText().getText()).append("]\n"); + } + Assert.assertEquals(messageBuilder.toString(), expectedChildren.size(), children.length); + + Arrays.sort(children, Comparator.comparing(child -> ((HierarchyNodeDescriptor)child).getHighlightedText().getText())); + + Collections.sort(expectedChildren, Comparator.comparing(child -> child.getAttributeValue(TEXT_ATTR_NAME))); + + //noinspection unchecked + Iterator iterator = expectedChildren.iterator(); + for (Object child : children) { + checkNodeDescriptorRecursively(treeStructure, ((HierarchyNodeDescriptor)child), iterator.next()); + } + } +}