diff --git a/platform/testGuiFramework/src/com/intellij/testGuiFramework/cellReader/ExtendedCellReaders.kt b/platform/testGuiFramework/src/com/intellij/testGuiFramework/cellReader/ExtendedCellReaders.kt index 462422f520dc..d269276618b5 100644 --- a/platform/testGuiFramework/src/com/intellij/testGuiFramework/cellReader/ExtendedCellReaders.kt +++ b/platform/testGuiFramework/src/com/intellij/testGuiFramework/cellReader/ExtendedCellReaders.kt @@ -15,6 +15,7 @@ */ package com.intellij.testGuiFramework.cellReader +import com.intellij.ide.util.treeView.NodeRenderer import com.intellij.testGuiFramework.framework.GuiTestUtil import com.intellij.testGuiFramework.impl.GuiTestUtilKt.findAllWithBFS import com.intellij.ui.MultilineTreeCellRenderer @@ -95,7 +96,8 @@ class ExtendedJComboboxCellReader : BasicJComboBoxCellReader(), JComboBoxCellRea private fun getValueWithCellRenderer(cellRendererComponent: Component): String? { val result = when (cellRendererComponent) { is JLabel -> cellRendererComponent.text - is SimpleColoredComponent -> cellRendererComponent.getText() + is NodeRenderer -> cellRendererComponent.getFirstText() //should stands before SimpleColoredComponent because it is more specific + is SimpleColoredComponent -> cellRendererComponent.getFullText() is MultilineTreeCellRenderer -> cellRendererComponent.text else -> cellRendererComponent.findText() } @@ -103,9 +105,13 @@ private fun getValueWithCellRenderer(cellRendererComponent: Component): String? } -private fun SimpleColoredComponent.getText(): String? +private fun SimpleColoredComponent.getFullText(): String? = this.iterator().asSequence().joinToString() +private fun SimpleColoredComponent.getFirstText(): String? + = this.iterator().next() + + private fun Component.findText(): String? { try { assert(this is Container) @@ -118,8 +124,8 @@ private fun Component.findText(): String? { ) resultList.addAll( findAllWithBFS(container, SimpleColoredComponent::class.java) - .filter { !it.getText().isNullOrEmpty() } - .map { it.getText()!! } + .filter { !it.getFullText().isNullOrEmpty() } + .map { it.getFullText()!! } ) return resultList.firstOrNull { !it.isEmpty() } } diff --git a/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreeDriver.kt b/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreeDriver.kt index 4ac586664bc4..26caab89618a 100644 --- a/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreeDriver.kt +++ b/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreeDriver.kt @@ -228,7 +228,7 @@ open class ExtendedJTreeDriver(robot: Robot = GuiRobotHolder.robot) : JTreeDrive stringPath .list2tree() .forEach { - path = ExtendedJTreePathFinder(tree).findMatchingPathByPredicate(predicate, *it.toTypedArray()) + path = ExtendedJTreePathFinder(tree).findMatchingPathByPredicate(predicate, it) expandPath(tree, path) } return path diff --git a/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreePathFinder.kt b/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreePathFinder.kt index 8d4a3555a06c..ca2837a9dcb8 100644 --- a/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreePathFinder.kt +++ b/platform/testGuiFramework/src/com/intellij/testGuiFramework/driver/ExtendedJTreePathFinder.kt @@ -17,47 +17,52 @@ class ExtendedJTreePathFinder(val jTree: JTree) { private val cellReader: JTreeCellReader = ExtendedJTreeCellReader() - fun findMatchingPath(vararg pathStrings: String): TreePath = - findMatchingPathByPredicate(Predicate.equality, *pathStrings) + fun findMatchingPath(pathStrings: List): TreePath = + findMatchingPathByPredicate(Predicate.equality, pathStrings) - fun findMatchingPathWithVersion(vararg pathStrings: String): TreePath = - findMatchingPathByPredicate(Predicate.withVersion, *pathStrings) + fun findMatchingPathWithVersion(pathStrings: List): TreePath = + findMatchingPathByPredicate(Predicate.withVersion, pathStrings) // this is ex-XPath version - fun findMatchingPathByPredicate(predicate: FinderPredicate, vararg pathStrings: String): TreePath { + fun findMatchingPathByPredicate(predicate: FinderPredicate, pathStrings: List): TreePath { val model = jTree.model if (jTree.isRootVisible) { val childValue = jTree.value(model.root) ?: "" - if (!predicate(pathStrings[0], childValue)) pathNotFound(*pathStrings) - if (pathStrings.size == 1) return TreePath(arrayOf(model.root)) + if (predicate(pathStrings[0], childValue)) { + if (pathStrings.size == 1) return TreePath(arrayOf(model.root)) + return traverseChildren(jTree, model.root, TreePath(model.root), predicate, pathStrings.drop(1)) ?: throw pathNotFound(pathStrings) + } + else { + pathNotFound(pathStrings) + } } - return traverseChildren(jTree, model.root, TreePath(model.root), predicate, *pathStrings) ?: throw pathNotFound(*pathStrings) + return traverseChildren(jTree, model.root, TreePath(model.root), predicate, pathStrings) ?: throw pathNotFound(pathStrings) } - fun exists(vararg pathStrings: String) = - existsByPredicate(Predicate.equality, *pathStrings) + fun exists(pathStrings: List) = + existsByPredicate(Predicate.equality, pathStrings) - fun existsWithVersion(vararg pathStrings: String) = - existsByPredicate(Predicate.withVersion, *pathStrings) + fun existsWithVersion(pathStrings: List) = + existsByPredicate(Predicate.withVersion, pathStrings) - fun existsByPredicate(predicate: FinderPredicate, vararg pathStrings: String): Boolean { - return try{ + fun existsByPredicate(predicate: FinderPredicate, pathStrings: List): Boolean { + return try { findMatchingPathByPredicate( - pathStrings = *pathStrings, + pathStrings = pathStrings, predicate = predicate ) true } - catch (e: Exception){ + catch (e: Exception) { false } } fun traverseChildren(jTree: JTree, - node: Any, - pathTree: TreePath, - predicate: FinderPredicate, - vararg pathStrings: String): TreePath? { + node: Any, + pathTree: TreePath, + predicate: FinderPredicate, + pathStrings: List): TreePath? { val childCount = jTree.model.getChildCount(node) val order = pathStrings[0].getOrder() ?: 0 @@ -76,7 +81,7 @@ class ExtendedJTreePathFinder(val jTree: JTree) { newPath } else { - traverseChildren(jTree, child, newPath, predicate, *pathStrings.toList().subList(1, pathStrings.size).toTypedArray()) + traverseChildren(jTree, child, newPath, predicate, pathStrings.subList(1, pathStrings.size)) } } else { @@ -118,8 +123,8 @@ class ExtendedJTreePathFinder(val jTree: JTree) { } // exception wrappers - private fun pathNotFound(vararg path: String): LocationUnavailableException { - throw LocationUnavailableException("Unable to find path \"${path.toList()}\"") + private fun pathNotFound(path: List): LocationUnavailableException { + throw LocationUnavailableException("Unable to find path \"$path\"") } private fun multipleMatchingNodes(pathString: String, parentText: Any): LocationUnavailableException { @@ -131,9 +136,9 @@ class ExtendedJTreePathFinder(val jTree: JTree) { fun findPathToNodeWithVersion(node: String) = findPathToNodeByPredicate(node, Predicate.withVersion) - fun findPathToNodeByPredicate(node: String, predicate: FinderPredicate): TreePath{ -// expandNodes() -// Pause.pause(1000) //Wait for EDT thread to finish expanding + fun findPathToNodeByPredicate(node: String, predicate: FinderPredicate): TreePath { + // expandNodes() + // Pause.pause(1000) //Wait for EDT thread to finish expanding val result: MutableList = mutableListOf() var currentNode = jTree.model.root as DefaultMutableTreeNode val e = currentNode.preorderEnumeration() @@ -148,6 +153,6 @@ class ExtendedJTreePathFinder(val jTree: JTree) { currentNode = currentNode.parent as DefaultMutableTreeNode result.add(0, currentNode.toString()) } - return findMatchingPathByPredicate(predicate, *result.toTypedArray()) + return findMatchingPathByPredicate(predicate, result) } } \ No newline at end of file diff --git a/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/TreeTableFixture.kt b/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/TreeTableFixture.kt index df9fb39baad8..328f97aaef66 100644 --- a/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/TreeTableFixture.kt +++ b/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/TreeTableFixture.kt @@ -1,7 +1,6 @@ // Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.testGuiFramework.fixtures -import com.intellij.testGuiFramework.driver.ExtendedJTreeDriver import com.intellij.testGuiFramework.driver.ExtendedJTreePathFinder import com.intellij.ui.treeStructure.treetable.TreeTable import org.fest.swing.core.MouseButton @@ -20,7 +19,7 @@ class TreeTableFixture(val robot: Robot, val target: TreeTable) : ComponentPreconditions.checkEnabledAndShowing(target) val tree = target.tree - val path = ExtendedJTreePathFinder(tree).findMatchingPath(*pathStrings) + val path = ExtendedJTreePathFinder(tree).findMatchingPath(pathStrings.toList()) var x = target.location.x + (0 until column).sumBy { target.columnModel.getColumn(it).width } x += target.columnModel.getColumn(column).width / 3 diff --git a/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/extended/ExtendedJTreePathFixture.kt b/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/extended/ExtendedJTreePathFixture.kt index 3389ece94e16..94c92aa8e939 100644 --- a/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/extended/ExtendedJTreePathFixture.kt +++ b/platform/testGuiFramework/src/com/intellij/testGuiFramework/fixtures/extended/ExtendedJTreePathFixture.kt @@ -102,7 +102,7 @@ import javax.swing.tree.TreePath GuiTestUtilKt.waitUntil(condition = "correct path to click is found", timeout = Timeouts.seconds02) { try { partialPath = ExtendedJTreePathFinder(tree) - .findMatchingPathByPredicate(predicate = predicate, pathStrings = *partialList.toTypedArray()) + .findMatchingPathByPredicate(predicate = predicate, pathStrings = partialList) partialPath != null } catch (e: Exception) { @@ -176,5 +176,5 @@ import javax.swing.tree.TreePath fun TreePath.getPathStrings(jTree: JTree): List { val cellReader = ExtendedJTreeCellReader() val pathStrings = this.path.map { cellReader.valueAt(jTree, it) ?: throw Exception("Unable to read value (value is null) for a tree")} - return if (pathStrings.first().isEmpty()) pathStrings.drop(1) else pathStrings + return if (pathStrings.first().isEmpty() || !jTree.isRootVisible) pathStrings.drop(1) else pathStrings }